😊

任意のバージョンの pg_dump を実行する

2022/05/15に公開

概要

PostgreSQL のデータをダンプする際に pg_dump コマンドを使用しているのですが、CLI のバージョンと接続先の PostgreSQL のバージョンに差異があると以下のようなエラーが発生してダンプに失敗します。

$ pg_dump -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} -U ${POSTGRES_USER} -d ${POSTGRES_DB} -v -a -f database.dump -W
Password: 
pg_dump: server version: 12.10 (Debian 12.10-1.pgdg110+1); pg_dump version: 10.20 (Debian 10.20-1.pgdg90+1)
pg_dump: aborting because of server version mismatch

対応としては CLI のバージョンを接続先のバージョンに合わせることが挙げられますが、ありがたいことにネットで検索すると様々な記事で対応方法が紹介されています。

自分も上記の記事などを参考にダンプを行なっていましたが、ダンプを実行するために configure をはじめとした複数のコマンドを実行しなければならなかったり、依存ライブラリがインストールされていないためにエラーが発生したりしていたので、もっと容易にダンプを実行できないかどうか考えていました。結果 docker コマンドを使用してダンプを実行することにしました。

コマンド&動作確認

実際に実行したコマンドは以下になります。POSTGRES_VERSION には接続先の PostgreSQL のバージョンを指定します。実行後ダンプファイルが作成されていることが確認できます。

$ docker run -v "$(pwd):/dump" -it --rm --network host postgres:${POSTGRES_VERSION} pg_dump -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} -U ${POSTGRES_USER} -d ${POSTGRES_DB} -v -a -f /dump/database.dump -W 
$ ls database.dump
database.dump

また POSTGRES_VERSION が接続先の PostgreSQL のバージョンではない場合には以下のようなエラーが発生します。

$ docker run -v "$(pwd):/dump" -it --rm --network host postgres:${POSTGRES_VERSION} pg_dump -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} -U ${POSTGRES_USER} -d ${POSTGRES_DB} -v -a -f /dump/database.dump -W 
Password: 
pg_dump: server version: 12.10 (Debian 12.10-1.pgdg110+1); pg_dump version: 10.20 (Debian 10.20-1.pgdg90+1)
pg_dump: aborting because of server version mismatch

Discussion