茄子です。
PostgreSQLのバックアップコマンドpg_dumpは、実行する側とデータベースサーバー側のPostgresのバージョンが合ってないとエラーになってしまいます。
サーバーに合わせたバージョンを別途インストールすることもできますが、dockerイメージを使うことでより手軽に対応できますので、紹介したいと思います。
準備
dockerがインストールされていない場合は、dockerをインストールします。お使いのOS用のリンクからインストールしてください。
公式サイト: https://docs.docker.com/engine/install/
docker --version
などでインストール出来ていることを確認します
イメージのpull
Docker Hub の postgres イメージ : https://hub.docker.com/_/postgres
リンクのページの「Supported tags and respective Dockerfile links」には、執筆時(2023年7月28日)では 15.3, 14.8 etc のサポート範囲内の各メジャーバージョンの最新パッチ版がリストアップされています。ですが、15.1 など以前のマイナーバージョンも引き続き利用可能で、指定すればpullできます。「Tags」タブから検索することもできます。
今回は、試しに 15.1
をpullしてみます。
docker pull postgres:15.1
pullできたか確認します。
docker images | grep postgres
実行
コマンドは以下です。
docker run -v {ローカルの出力先}:/root/pg_dump postgres:15.1 pg_dump --dbname=postgresql://{ユーザー名}:{password}@{Postgresサーバーのホスト}/{対象のデータベース名} --file=/root/pg_dump/{出力ファイル名}
例:
docker run -v /Users/nasu/Q/techlab/backup:/root/pg_dump postgres:15.3 pg_dump --dbname=postgresql://nasu:nasu0123@mypostgres.jp/techlabdata --file=/root/pg_dump_$(date +'%Y%m%d-%H%M%S')
-v
: マウントするフォルダのパスです。--dbname
: 各値は別々のオプション(username, hostなど)にもできますが、パスワードを別にするとプロンプトで聞かれるようになるので、今回はスクリプトなどにも使いやすいこの形式の方を採用しました。--file
: 出力先ファイル名です。これはコンテナの中のパスになります。/root/pg_dump/は今回の例では、-vでローカル出力先フォルダがマウントされているフォルダです。
おわりに
Postgresに限らずこうしたちょっとしたバージョン違いなどにdockerは便利ですね。
何かのお役に立てれば幸いです。