前回のポスト 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)
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)
うまくいきました。