Home About Contact
PostgreSQL , Docker

PostgreSQL データベースのバックアップとリストア

前回のポスト PostgreSQL を docker run する、そこに psql コマンドや Kotlin でアクセスする からの続きです。 PostgreSQL を Docker で動かして、ディレクトリ形式でのバックアップとリストアを試します。

リストアするデータは前回のポストで作成した pokemon_db.dump を使います。

環境:

$ lsb_release -a|grep Description
Description:	Ubuntu 24.04.1 LTS

$ docker --version
Docker version 27.2.0, build 3ab4256

事前準備 バックアップ対象となるデータベースを用意する

次のように docker run して PostgreSQL をパスワードなしで起動:

$ docker run --rm -d -p 5432:5432 --name my-postgre -e POSTGRES_HOST_AUTH_METHOD=trust postgres

psql コマンドで pokemon_db を作成:

$ psql -U postgres -h localhost
postgres=# CREATE DATABASE pokemon_db;
CREATE DATABASE

pokemon_db.dump を使ってリストアします。

$ cat pokemon_db.dump | psql -U postgres -h localhost
...

リストアできたかを確認:

$ psql -U postgres -h localhost -d pokemon_db

pokemon_db=# SELECT * FROM pokemons;
 id |    name
----+------------
  1 | Pikachu
  2 | Charmander
(2 rows)

本題 ディレクトリフォーマットを指定して dump する

pg_dump のドキュメント:

フォーマット形式として p, c, d, t などがあります。 前回はデフォルトの p を使って dump しましたが、 今回は d のディレクトリ形式を使ってみます。

$ pg_dump -U postgres -h localhost -Fd pokemon_db -f pokemon_db.dump

-Fd オプションを指定することで ディレクトリ形式で dump できます。 このときは必ず同時に -f でファイル(というかディレクトリ)を指す必要があります。

実行すると次のようなディレクトリが生成されます。

.
└── pokemon_db.dump
    ├── 3359.dat.gz
    └── toc.dat

それでは、いったん現在 docker で起動中の PostgreSQL を停止(削除)して、 再度 docker run にて起動、PostgreSQL を初期状態に戻します。

$ docker ps
$ docker stop <CONTAINER ID>

$ docker run --rm -d -p 5432:5432 --name my-postgre -e POSTGRES_HOST_AUTH_METHOD=trust postgres

さらに pokemon_db データベースを作成:

$ psql -U postgres -h localhost -c "CREATE DATABASE pokemon_db;"
CREATE DATABASE

-c コマンドのあとに SQL文を書けばそれを実行できる。

前回試した -Fp フォーマットと異なり、ディレクトリ形式で dump したデータをリストアするには、 pg_restore コマンドを使う。

$ pg_restore -U postgres -h localhost --verbose -d pokemon_db pokemon_db.dump

それでは意図通りリストアできたか確認:

$ psql -U postgres -h localhost -d pokemon_db -c "SELECT * FROM pokemons;"
 id |    name    |   type   
----+------------+----------
  1 | Pikachu    | Electric
  2 | Charmander | Fire
(2 rows)

うまくいきました。