대화형으로는 psql 의 메타 명령이 가장 짧다.
psql -U postgres -h 127.0.0.1 -c '\l'
psql -U postgres -h 127.0.0.1 -l # 접속하자마자 목록만 찍고 끝낸다
스크립트에서 쓸 때는 시스템 카탈로그 pg_database 를 직접 읽는다. \l 은 psql 전용 문법이라 JDBC · psycopg 같은 드라이버에서는 동작하지 않는다.
SELECT datname
FROM pg_database
WHERE datistemplate = false
ORDER BY datname;
datistemplate = false 는 template0 · template1 을 걸러 낸다. 접속이 막힌 DB 까지 포함해 전부 보려면 조건을 뺀다.
셸에서 값만 뽑을 때는 정렬 없는 비정형 출력 옵션을 붙인다.
psql -U postgres -At -c "SELECT datname FROM pg_database WHERE datistemplate = false"
크기와 소유자까지 필요하면 다음과 같이 쓴다.
SELECT d.datname,
pg_get_userbyid(d.datdba) AS owner,
pg_size_pretty(pg_database_size(d.datname)) AS size,
pg_encoding_to_char(d.encoding) AS encoding
FROM pg_database d
WHERE d.datistemplate = false
ORDER BY pg_database_size(d.datname) DESC;
pg_database_size() 는 해당 DB 에 접속 권한이 있어야 값을 돌려준다. 권한이 없으면 오류가 나므로 관리자 계정으로 실행한다.
/usr/psql-12/lib/libpq.so.5: no version information available
이 메시지는 오류가 아니라 동적 링커의 경고다. 실행 파일은 심볼에 버전 태그(PQconnectdb@@PQ_5)가 붙은 라이브러리를 기대하는데, 실제로 로드된 libpq.so.5 에는 그 버전 정보가 없을 때 나온다. 대부분 서로 다른 경로에 깔린 libpq 가 섞인 상황이다.
먼저 무엇이 실제로 로드되는지 본다.
ldd $(which psql) | grep libpq
# libpq.so.5 => /usr/lib64/libpq.so.5 ← 의도한 것과 다르면 이게 원인
시스템 패키지(postgresql-libs)의 구버전 libpq 와 별도 설치본(/usr/psql-12/lib)이 함께 있을 때 자주 생긴다. 해결은 원하는 쪽을 먼저 찾게 만드는 것이다.
# 세션 한정
export LD_LIBRARY_PATH=/usr/psql-12/lib:$LD_LIBRARY_PATH
# 영구 적용 — ldconfig 경로에 등록
echo /usr/psql-12/lib | sudo tee /etc/ld.so.conf.d/psql-12.conf
sudo ldconfig
ldconfig -p | grep libpq
경고 수준이므로 동작에 문제가 없다면 그대로 둬도 된다. 다만 클라이언트와 라이브러리의 메이저 버전이 어긋난 상태이므로, 서버 버전과 맞지 않는 기능을 쓸 때 엉뚱한 오류로 번질 수 있다. 같은 계열로 맞추는 편이 낫다.
심볼릭 링크가 끊긴 경우도 같은 증상을 낸다.
ls -l /usr/psql-12/lib/ | grep libpq
# libpq.so -> libpq.so.5.12 형태로 이어져 있어야 한다