はじめに
データベース単位のバックアップとリストア(復元)の方法を調査しました。
概要
- データベースのバックアップ
- データベースの削除
- データベースの作成
- データベースのリストア
1. データベースのバックアップ
今回バックアップの対象はデータベースtestdb
とし、テーブルtesttable
を保持しているものとします。
testdb=# \dt
リレーション一覧
スキーマ | 名前 | タイプ | 所有者
----------+-----------+----------+----------
public | testtable | テーブル | postgres
(1 行)
testdb=# select * from testtable;
id | name
----+------
1 | abc
2 | def
3 | ghi
(3 行)
まず、PostgreSQLでのバックアップにはpg_dump
コマンドを使用します。
他のオプションを知りたい場合はpg_dump --help
コマンドで一覧を表示できます。
bin\pg_dump -f testdb_20220904.dump -F c -v -h localhost -p 5432 -U postgres -w testdb
オプション | 値 | 説明 |
---|---|---|
-f | testdb_20220904.dump | バックアップファイル名(フルパス可) |
-F | c | 出力形式(カスタム形式) |
-v | なし | 冗長モード |
-h | localhost | ホスト名 |
-p | 5432 | ポート番号 |
-U | postgres | ユーザ名 |
-w | なし | PGPASS ファイルからパスワード自動認証 |
指定 | testdb | バックアップ対象データベース名 |
C:\postgresql-binaries\postgresql-13\pgsql-13.7-1>bin\pg_dump -f testdb_20220904.dump -F c -v -h localhost -p 5432 -U postgres testdb
pg_dump: 最後の組み込みOIDは16383
pg_dump: 機能拡張を読み込んでいます
pg_dump: 機能拡張の構成要素を特定しています
pg_dump: スキーマを読み込んでいます
pg_dump: ユーザ定義テーブルを読み込んでいます
pg_dump: ユーザ定義関数を読み込んでいます
pg_dump: ユーザ定義型を読み込んでいます
pg_dump: 手続き言語を読み込んでいます
pg_dump: ユーザ定義集約関数を読み込んでいます
pg_dump: ユーザ定義演算子を読み込んでいます
pg_dump: ユーザ定義アクセスメソッドを読み込んでいます
pg_dump: ユーザ定義演算子クラスを読み込んでいます
pg_dump: ユーザ定義演算子族を読み込んでいます
pg_dump: ユーザ定義のテキスト検索パーサを読み込んでいます
pg_dump: ユーザ定義のテキスト検索テンプレートを読み込んでいます
pg_dump: ユーザ定義のテキスト検索辞書を読み込んでいます
pg_dump: ユーザ定義のテキスト検索設定を読み込んでいます
pg_dump: ユーザ定義の外部データラッパーを読み込んでいます
pg_dump: ユーザ定義の外部サーバーを読み込んでいます
pg_dump: デフォルト権限設定を読み込んでいます
pg_dump: ユーザ定義の照合順序を読み込んでいます
pg_dump: ユーザ定義の変換を読み込んでいます
pg_dump: 型キャストを読み込んでいます
pg_dump: 変換を読み込んでいます
pg_dump: テーブル継承情報を読み込んでいます
pg_dump: イベントトリガを読み込んでいます
pg_dump: 機能拡張構成テーブルを探しています
pg_dump: 継承関係を検索しています
pg_dump: 対象テーブルの列情報を読み込んでいます
pg_dump: テーブル"public.testtable"の列と型を探しています
pg_dump: 子テーブルの継承列にフラグを設定しています
pg_dump: インデックスを読み込んでいます
pg_dump: パーティション親テーブルのインデックスにフラグを設定しています
pg_dump: 拡張統計情報を読み込んでいます
pg_dump: 制約を読み込んでいます
pg_dump: トリガを読み込んでいます
pg_dump: 書き換えルールを読み込んでいます
pg_dump: ポリシを読み込んでいます
pg_dump: reading row-level security policies
pg_dump: パブリケーションを読み込んでいます
pg_dump: パブリケーションの構成要素を読み込んでいます
pg_dump: サブスクリプションを読み込んでいます
pg_dump: ラージオブジェクトを読み込んでいます
pg_dump: データの依存データを読み込んでいます
pg_dump: encoding = UTF8 を保存しています
pg_dump: standard_conforming_strings = on を保存しています
pg_dump: search_path = を保存しています
pg_dump: データベース定義を保存しています
pg_dump: テーブル "public.testtable"の内容をダンプしています
これでデータベースのバックアップファイルが作成されました。
オプション-w
のパスワード自動認証の設定については過去記事を参照してください。
2. データベースの削除
リストアする前にデータベースの情報をクリアにするために削除します。
ログインしてからdrop database
で削除してもよいですが、ここではログインせずにpsql -c
から直接SQLコマンドを実行します。
C:\postgresql-binaries\postgresql-13\pgsql-13.7-1>bin\psql -h localhost -p 5432 -U postgres -d postgres -c "drop database testdb;"
DROP DATABASE
こうすることでバッチでデータベース削除~リストアまでを一気に実行できます。
3. データベースの作成
こちらもpsql -c
コマンドで空のデータベースを作成します。
リストアの対象テーブルはバックアップ元のデータベース名と異なっていても問題ありません。
C:\postgresql-binaries\postgresql-13\pgsql-13.7-1>bin\psql -h localhost -p 5432 -U postgres -d postgres -c "create database testdb;"
CREATE DATABASE
4. データベースのリストア
最後にpg_restore
を用いてデータベースをリストアします。
もしバックアップ時のオプション-F
で出力形式を平文p
にしている場合は、pg_restore
が非対応のため平文SQLをそのまま実行しましょう。
他のオプションを知りたい場合はpg_restore --help
コマンドで一覧を表示できます。
C:\postgresql-binaries\postgresql-13\pgsql-13.7-1>bin\pg_restore -d testdb -v -h localhost -p 5432 -U postgres -w testdb_20220904.dump
pg_restore: リストアのためデータベースに接続しています
pg_restore: TABLE "public.testtable"を作成しています
pg_restore: テーブル"public.testtable"のデータを処理しています
オプション | 値 | 説明 |
---|---|---|
-d | testdb | リストア対象データベース名 |
-v | なし | 冗長モード |
-h | localhost | ホスト名 |
-p | 5432 | ポート番号 |
-U | postgres | ユーザ名 |
-w | なし | PGPASS ファイルからパスワード自動認証 |
指定 | testdb_20220904.dump | バックアップ対象データベース名 |
これでデータベースのリストアが完了しました。
testdb=# \dt
リレーション一覧
スキーマ | 名前 | タイプ | 所有者
----------+-----------+----------+----------
public | testtable | テーブル | postgres
(1 行)
testdb=# select * from testtable;
id | name
----+------
1 | abc
2 | def
3 | ghi
(3 行)