このブログでは、PostgreSQL データベースをバックアップおよび復元する方法を学習します。楽しみ!
1. はじめに
少し前、テスト環境で再現するのが難しい問題を修正するために、本番サーバーから PostgreSQL データベースをバックアップする必要がありました。 Google で検索してもすぐには答えが見つからなかったようです。しばらくして、使用する必要のあるコマンドをなんとか見つけることができたので、この知識を共有するのは良いことだと思いました。
コマンドをテストするために、私が作成したデータベースを使用します。以前のブログ。スキーマは非常に基本的なものであり、ここでは情報提供のみを目的として示しています。この投稿の残りの部分には関係ありません。データベースは次のように呼ばれますマイジヒップスタープラネット
それがこの記事でバックアップおよび復元するものです。
2. 前提条件
このブログに必要な前提条件:
- Ubuntu 22.04 が使用されています。
- Docker と Docker Compose の基本的な知識が必要です。
- PostgreSQL の基本的な知識が必要です。 PostgreSQL14.5を使用しています。
3. 準備
このセクションでは、バックアップと復元に使用するデータベースを準備します。バックアップおよび復元コマンドの使用方法だけを知りたい場合は、このセクションをスキップしてください。
このセクションで使用されるデータベースのバックアップと Docker Compose ファイルは、次の場所から入手できます。GitHub。
Docker Compose ファイルは、デフォルトの管理者ユーザーが含まれる基本セットアップを含む PostgreSQL データベースを起動します。ポストグレ
ユーザーに置き換えられますmypostgresqldumpplanet
。 PostgreSQL データはディレクトリにマウントされます~/docker/volumes/postgresqldata
。
YAML
バージョン: '3.8' サービス: mypostgresqldumpplanet-postgresql: イメージ: postgres:14.5 ボリューム: - ~/docker/volumes/postgresqldata/:/var/lib/postgresql/data/ 環境: - POSTGRES_USER=mypostgresqldumpplanet - POSTGRES_PASSWORD= - POSTGRES_HOST_AUTH_METHOD=trustポート: - 127.0.0.1:5432:5432
PostgreSQL Docker コンテナを起動するには、リポジトリのルートから次のコマンドを実行します。
シェル
$ docker compose -f postgresql.yml up -d[+] 実行中 2/2 ネットワーク mypostgresqldumpplanet_default 作成 0.1 秒 コンテナ mypostgresqldumpplanet-mypostgresqldumpplanet-postgresql-1 開始 0.4 秒
データベース ダンプ ファイルをリポジトリのルートからマウントされた PostgreSQL ディレクトリにコピーします。
シェル
$ sudo cp 2023-04-01-original.dump ~/docker/volumes/postgresqldata/
次に、コンテナ内で bash シェルを開く必要があります。これは、ドッカー実行
指図。コンテナ内では、Linux ユーザーポストグレ
使用する必要があります。したがって、-u
引数を渡す必要があります。
シェル
$ docker exec -it -u postgres mypostgresqldumpplanet-mypostgresqldumpplanet-postgresql-1 bashpostgres@4934dd659171:/$
これで、以下にアクセスできるようになりましたバッシュ
コンテナの中。次の方法でダンプからデータベースを復元する必要があります。pg_restore
。
シェル
$ pg_restore -U mypostgresqldumpplanet -d postgres -C /var/lib/postgresql/data/2023-04-01-original.dump pg_restore: TOC の処理中:pg_restore: TOC エントリ 3382 から; 1262 16384 データベース myjhipsterplanet myjhipsterplanetpg_restore: エラー: クエリを実行できませんでした: エラー: ロール "myjhipsterplanet" が存在しませんコマンド: ALTER DATABASE myjhipsterplanet OWNER TO myjhipsterplanet;...
使用されるパラメータについて説明します。
-U mypostgresqldumpplanet
: 管理データベース ユーザー。-d postgres
: データベースを提供する必要があります。pg_restore
に接続できます。これは PostgreSQL の空のインスタンスであるため、ポストグレ
データベースは、常に使用できます。-d
口論。-C
: 空の PostgreSQL データベースがあるため、引数を指定する必要があります。-C
そのためにpg_restore
(バックアップ復元ツール) がデータベースを作成します。/var/lib/postgresql/data/2023-04-01-original.dmp
: データベース ダンプのファイルの場所。データベース ダンプには、ディレクトリ内のマウント経由でアクセスできます。/var/lib/postgresql/data/
。
出力からわかるように、ロールが欠落しているため、復元は完全には成功しませんでした。
データベースに入り、データベースに接続しますポストグレ
ユーザーと一緒にmypostgresqldumpplanet
。
シェル
$ psql -d postgres -U mypostgresqldumpplanet
不足しているロールを作成します。
どのデータベースが存在するかを確認します。\l
指図。
シェル
postgres=# \l データベースのリスト 名前 |オーナー |エンコーディング |丁合 | Cタイプ |アクセス権限 ------------------------+---------------------- -+----------+-----------+---------------+----------- --------------------------------------みやびUTF8 | en_US.utf8 | en_US.utf8 | mypostgresqldumpplanet | mypostgresqldumpplanet | UTF8 | en_US.utf8 | en_US.utf8 |ポストグレ | mypostgresqldumpplanet | UTF8 | en_US.utf8 | en_US.utf8 |テンプレート0 | mypostgresqldumpplanet | UTF8 | en_US.utf8 | en_US.utf8 | =c/mypostgresqldumpplanet + | | | | | mypostgresqldumpplanet=CTc/mypostgresqldumpplanet template1 | mypostgresqldumpplanet | UTF8 | en_US.utf8 | en_US.utf8 | =c/mypostgresqldumpplanet + | | | | | mypostgresqldumpplanet=CTc/mypostgresqldumpplanet(5 行)
データベースに注意してくださいマイジヒップスタープラネット
創造された。ただし、すべてが正しく作成されたわけではないため、データベースを削除します。
シェル
postgres=# データベースのドロップ myjhipsterplanet;データベースのドロップ
使用やめる
を終了するコマンドポストグレ
促す。
復元コマンドを再試行すると、今度は復元が成功します。
経由で接続しますpsql
データベースに。
使用\c
を使用するコマンドマイジヒップスタープラネット
データベース。
シェル
postgres=# \c myjhipsterplanet これで、ユーザー「mypostgresqldumpplanet」としてデータベース「myjhipsterplanet」に接続されました。
ことを確認します。お客様
テーブルにはデータが含まれています。
シェル
myjhipsterplanet=# 顧客から * を選択; ID |顧客名 | company_id ----+------------------------------+--------------- 1 |アシスタント | 2 |市場 | 3 |プログラム支払い ユーザーフレンドリー | 4 |チーム志向 | 5 |インデックス | 6 |補助的な体験 | 7 |佐原 | 8 |コング預金 | 9 |インデックスボール | 10 |ユーザー | (10行)
後でデータベースが正しく復元されることを確認できるようにするために、顧客レコードの 1 つを変更します。
シェル
myjhipsterplanet=# 顧客を更新 SET customer_name = 'Assistent1' WHERE id = 1;
4. データベースのバックアップ
データベースをバックアップするには、pg_dump
使用されている。の公式ドキュメントのpg_dump
PostgreSQL Web サイトで見つけることができます。また、次のコマンドを使用してヘルプ情報を取得できます。
シェル
postgres@4934dd659171:/$ pg_dump --help
Docker コンテナ内で PostgreSQL を実行している場合は、コンテナ内の bash シェルにアクセスできる必要があります。まず、Docker コンテナの名前を取得する必要があります。
シェル
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9dea76770a2e postgres:14.5 "docker-entrypoint.s…" 5 秒前 4 秒前 127.0.0.1:5432->5432/tcp mypostgresqldumpplanet-mypostgresqldumpplanet-postgresql-1
上で説明したように、コンテナー内で bash シェルを開きます。
シェル
$ docker exec -it -u postgres mypostgresqldumpplanet-mypostgresqldumpplanet-postgresql-1 bashpostgres@4934dd659171:/$
バックアップの作成には 4 つの形式があり、それぞれについて次のセクションで説明します。
4.1 プレーンテキスト SQL バックアップ
デフォルトでは、pg_dump
プレーンテキスト SQL バックアップを作成します。バックアップを使用して復元する場合は、このデフォルトを使用しないでください。pg_restore
。
シェル
postgres@4934dd659171:/$ pg_dump -f /var/lib/postgresql/data/2023-04-01-plaintext.sql -U mypostgresqldumpplanet myjhipsterplanet
パラメータの説明:
-f /var/lib/postgresql/data/2023-04-01-plaintext.sql
: バックアップ ファイルの名前。-U mypostgresqldumpplanet
: PostgreSQL 管理者ユーザーの名前。多くの場合、これは次のようになります。ポストグレ
;マイジヒップスタープラネット
: バックアップするデータベースの名前。
4.2 カスタムバックアップ
PostgreSQL のカスタム バックアップ形式。デフォルトでは圧縮されており、バックアップの作成に使用するのに最適なオプションであると考えられます。
シェル
postgres@4934dd659171:/$ pg_dump -F c -f /var/lib/postgresql/data/2023-04-01-custom.dump -U mypostgresqldumpplanet myjhipsterplanet
引数はプレーンテキスト SQL バックアップの場合と似ていますが、ここでのみパラメータを追加する必要があります。-Fc
カスタム バックアップ形式を選択するために。
4.3 ディレクトリのバックアップ
ディレクトリのバックアップ形式。デフォルトで圧縮され、ダンプされるテーブルおよび BLOB ごとに 1 つのファイルを含むディレクトリが作成されます。この形式は並列ダンプもサポートしています。
シェル
postgres@4934dd659171:/$ pg_dump -F d -f /var/lib/postgresql/data/2023-04-01-directory -U mypostgresqldumpplanet myjhipsterplanet
引数はプレーンテキスト SQL バックアップの場合と似ていますが、ここでのみパラメータを追加する必要があります。-F d
ディレクトリのバックアップ形式を選択します。
PostgreSQL バックアップの作成方法を説明している一部の Web サイトでは、-f
出力ファイルを指定するパラメータ。代わりに、の出力をリダイレクトします。pg_dump
コマンドを大なり記号 (>
)。ただし、これはディレクトリ バックアップ形式では機能せず、次のエラーが発生します。
シェル
postgres@4934dd659171:/$ pg_dump -F d -U mypostgresqldumpplanet myjhipsterplanet > /var/lib/postgresql/data/2023-04-01-directory/bash: /var/lib/postgresql/data/2023-04-01-directory /: ディレクトリです
4.4 Tar バックアップ
tar バックアップ形式。圧縮はサポートされていませんが、tar を抽出すると有効なディレクトリ形式が得られます。
シェル
postgres@4934dd659171:/$ pg_dump -F t -f /var/lib/postgresql/data/2023-04-01-tar.tar -U mypostgresqldumpplanet myjhipsterplanet
引数はプレーンテキスト SQL バックアップの場合と似ていますが、ここでのみパラメータを追加する必要があります。-Ft
tar バックアップ形式を選択するために。
5. データベースの復元
このブログの手順に従う場合は、まず、変更された顧客レコードを元の値に復元する必要があります。データベースに接続し、レコードを再度変更します。
シェル
myjhipsterplanet=# 顧客を更新 SET customer_name = 'アシスタント' WHERE id = 1;
データベースをバックアップするには、pg_restore
使用されている。の公式ドキュメントのpg_restore
PostgreSQL Web サイトで見つけることができます。また、次のコマンドを使用してヘルプ情報を取得できます。
シェル
postgres@4934dd659171:/$ pg_restore --help
5.1 プレーンテキスト SQL リストア
前に述べたように、これは機能しませんpg_restore
。次のエラーが表示されます。
シェル
postgres@4934dd659171:/$ pg_restore -U mypostgresqldumpplanet -d myjhipsterplanet -c /var/lib/postgresql/data/2023-04-01-plaintext.sql pg_restore: エラー: 入力ファイルはテキスト形式のダンプのようです。 psqlを使用してください。
5.2 カスタム復元
カスタム復元はチャームとして機能します。
シェル
postgres@4934dd659171:/$ pg_restore -U mypostgresqldumpplanet -d myjhipsterplanet -c /var/lib/postgresql/data/2023-04-01-custom.dump
パラメータの説明:
-U mypostgresqldumpplanet
: PostgreSQL 管理者ユーザーの名前。多くの場合、これは次のようになります。ポストグレ
;- –
dmyjhipsterplanet
: 復元するデータベースの名前。 -c
: データベース オブジェクトを復元する前にクリーンアップするため。/var/lib/postgresql/data/2023-04-01-custom.dump
: バックアップファイルの名前。
データベースに接続し、ID 1 の顧客を表示します。
シェル
postgres@4934dd659171:/$ psql -d postgres -U mypostgresqldumpplanetpostgres=# \c myjhipsterplanetmyjhipsterplanet=# select * from customer where id = 1; ID |顧客名 |会社 ID ----+---------------+--------------- 1 |アシスタント1 | (1行)
ご覧のとおり、値はアシスタント1
、バックアップからの値。
5.3 ディレクトリの復元
ディレクトリの復元は次のように実行できます。
シェル
postgres@4934dd659171:/$ pg_restore -U mypostgresqldumpplanet -d myjhipsterplanet -c /var/lib/postgresql/data/2023-04-01-directory/
パラメータはカスタム形式に似ています。のpg_restore
コマンドは、バックアップ ファイルでどの形式が使用されているかを自動的に判断します。
5.4 タールの復元
完全を期すために、tar を復元します。
シェル
postgres@4934dd659171:/$ pg_restore -U mypostgresqldumpplanet -d myjhipsterplanet -c /var/lib/postgresql/data/2023-04-01-tar.tar
6. マウントされた Docker ボリュームとは何ですか?
PostgreSQL を Docker コンテナとして実行している場合、ディレクトリ/var/lib/postgresql/data
ホスト ディレクトリにマウントされます。このディレクトリはどうやって見つけることができますか?まず、Docker コンテナの名前を取得します。
シェル
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4934dd659171 postgres:14.5 "docker-entrypoint.s…" 3 時間前 3 時間前 127.0.0.1:5432->5432/tcp mypostgresqldumpplanet-mypostgresqldumpplanet-postgresql-1
港湾労働者検査する
コマンドはコンテナーのマウントをダンプします。ここでマウントされたボリュームがわかります。
シェル
$ docker Inspection mypostgresqldumpplanet-mypostgresqldumpplanet-postgresql-1..."マウント": [ { "タイプ": "バインド", "ソース": "/home//docker/volumes/postgresqldata", "宛先": "/var/lib/postgresql/data", "モード": "rw", "RW": true, "伝播": "rprivate" } ],...
7. クリーンアップ
このブログの手順に従った場合は、クリーンアップを行う必要があります。
Git リポジトリのルートから次のコマンドを実行して、PostgreSQL Docker コンテナを停止します。
シェル
$ docker compose -f postgresql.yml down[+] 実行中 2/2 コンテナ mypostgresqldumpplanet-mypostgresqldumpplanet-postgresql-1 削除されました ネットワーク mypostgresqldumpplanet_default 削除されました
8. 結論
この投稿では、PostgreSQL データベースをバックアップおよび復元する方法を学習しました。バックアップを最適化する方法に関する興味深い情報が見つかります。ここ。
FAQs
PostgreSQLのベースバックアップとは? ›
2.4 オンライン・バックアップ
データベースを運転したままバックアップを取得する方法です。 バックアップは、オフライン・バックアップと同様に、通常のファイルをバックアップするツールを使って取得します。 これを「ベースバックアップ」と呼びます。
2つのコマンドはバックアップをした方法によりどちらを使うかが変わってきます。 format=p(SQL文のテキストファイル)でバックアップした場合は「psql」、それ以外(format=c , format=t , format=d)は「pg_restore」を使用します。
Pg_dump ファイル どこ? ›「/usr/bin/pg_dump」にあります。
PostgreSQLのオフラインバックアップとは? ›オフラインバックアップは、PostgreSQLが停止した状態で${PGDATA}配下のコピーを作成する単純なバックアップ手法です。 コピーをリストア先の${PGDATA}配下に配置すればリストア完了です。
Postgresのバックアップの種類は? ›PostgreSQLデータベースを停止した状態でバックアップを取得する「オフラインバックアップ」と、起動した状態でバックアップを取得する「オンラインバックアップ」があります。
Basebackupとは何ですか? ›pg_basebackupは、pg_dumpと同様にPostgreSQLに同梱されており、PITRでリストアするためのデータファイルをオンラインでバックアップするツールです。
PG dumpとは何ですか? ›pg_dumpはPostgreSQLデータベースをバックアップするユーティリティです。 データベースを使用中であっても一貫性のあるバックアップを作成することができます。 pg_dumpは他のユーザによるデータベースへのアクセス(読み書き)をブロックしません。
PostgreSQLのデータベースをエクスポートするにはどうすればいいですか? ›・phpPgAdminにアクセスします。 ・左側の画面で→データベース名→スキーマ一覧→public→テーブル一覧→テーブル名を選択します ・右側フレームのエクスポートをクリックします ・オプションSQLを選択するとdump.sqlというファイル名でパソコン上に保存可能です。
PostgreSQLの論理バックアップとは? ›論理バックアップは、PostgreSQLを起動した状態でデータベースに格納されているデータをファイルに書き出すバックアップ方法です。 論理バックアップは、バックアップを実行した時点へのリカバリーのみが可能です。 PostgreSQLデータベースは停止する必要ありません。
PostgreSQLのバックアップ方式は? ›バックアップ方式は、物理オンライン・バックアップです。 バックアップ対象は、データベースクラスタ自体とアーカイブ WAL、サーバログです。 PostgreSQL 9.0以降のレプリケーションを利用している場合、スタンバイサイトでのバックアップに対応しています。
論理バックアップと物理バックアップの違いは何ですか? ›
論理バックアップとはDataPump expdpやexpコマンドを使用して、データベースに格納されたデータをエクスポートする方法です。 復旧時はエクスポートしたデータをインポートします。 一方、物理バックアップは、データベースを構成するファイルをコピーするバックアップ方法です。
PostgreSQLのリカバリ手順は? ›- 1) PostgreSQL サーバの強制終了とデータベースクラスタの削除 まず、データベースを強制的に終了させましょう。 ...
- 2) ベースバックアップの展開と recovery. conf の作成 ...
- 3) PostgreSQL の起動 この状態で PosgreSQL を起動します。
- 1phpPgAdminにログイン phpPgAdminにログインします。 ...
- 2エクスポートするデータベースを選択 画面左側の一覧からエクスポートを実行するデータベースをクリックします。
- 3エクスポートを選択 ...
- 4エクスポートの詳細を設定 ...
- 5保存場所を指定
ポート番号は 5432 か、あるいは (もし設定されている場合は) PGPORT 環境変数の値をデフォルトとします。 -u. パスワード認証を使用します。 username と password を 尋ねられます。
Pg_dumpの出力形式は? ›pg_dumpは他のユーザによるデータベースへのアクセス(読み書き)をブロックしません。 ダンプはスクリプト形式、または、アーカイブファイル形式で出力することができます。
Pg_restoreとは何ですか? ›pg_restoreは、pg_dumpによってアーカイブされた平文形式以外のアーカイブファイルを使って、PostgreSQLデータベースをリストアするためのユーティリティです。 このコマンドは、データベースを再構成して保存された時点の状態にするために必要なコマンドを発行します。