1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ラクスAdvent Calendar 2024

Day 20

PostgreSQLの論理バックアップのユースケース

Last updated at Posted at 2024-12-19

はじめに

こんにちは!ラクス Advent Calendar 2024に参加している1年目のエンジニアです!
みなさんはPostgreSQLを使っていますか?バックアップを取る必要があったときのために、バックアップ手法の一つである論理バックアップについて様々なユースケースごとにまとめました!:v:
みなさんの開発、運用の一助になりますと幸いです:pray:

バックアップには大きく分けて「論理バックアップ」と、「物理バックアップ」の2種類があります。この記事では、とりわけ「論理バックアップ」を使用した方法について解説します。

論理バックアップの種類

論理バックアップでは、バックアップしたいデータやユースケースによって以下のようなコマンドを使い分けます。

  • pg_dumpallコマンド
    データベースクラスタ全体の内容をバックアップする。取得したバックアップデータは、psqlコマンドでリストアできる。

  • pg_dumpコマンド
    指定したデータベースの内容をバックアップする。スクリプト形式であればpsqlコマンド、アーカイブファイル形式のバックアップデータはpg_restoreコマンドを使ってリストアできる。

  • SQLコマンドのCOPY
    指定したテーブルデータを独自のテキスト形式かバイナリー形式、CSV形式でバックアップする。取得したバックアップデータは、COPYを使ってリストアできる。

論理バックアップの手順

今回はあるデータベースをバックアップ、リストアしたい場合の手順を追ってみましょう。

手順

pg_dumpのコマンドでバックアップファイルを作成
以下は、基本的なpg_dumpコマンドの使用例です。

pg_dump -U <ユーザー名> [オプション] <データベース名>

また、以下のようなオプションをつけられます。

オプション 説明
-h PostgreSQLサーバーのホスト名。
-U バックアップを取得するためのユーザー名(通常はpostgres)。
-Fc カスタムフォーマットでバックアップを取得。
-b 大きなオブジェクト(バイナリデータ)も含める。
-v 詳細な出力を有効化。
-f バックアップファイルの保存先。

例えばローカルのsampleというDBのバックアップを、実行ユーザpostgresとして指定ディレクトリにカスタム形式で保存したい場合は以下のようになります。

pg_dump -h localhost -U postgres -Fc -f usr/db/dumpdir/sample_backup.dump sample

pg_restoreでリストアを実行
以下は、基本的なpg_restoreコマンドの使用例です。

pg_restore -U <ユーザー名> -d <リストア先データベース名> [オプション] <バックアップファイル名>

例えばローカルのsampleというDBのバックアップを、実行ユーザpostgresとしてリストアしたい場合は以下のようになります。

pg_restore -h localhost -U postgres -d sample usr/db/dumpdir/sample_backup.dump

また、以下のようなオプションをつけられます。

オプション 説明
-d リストア先のデータベース名を指定
-h 接続先ホスト名を指定
-U PostgreSQLユーザー名を指定
-v 詳細な進行状況を表示
-l バックアップファイルの内容をリストとして表示
-t <テーブル名> 特定のテーブルだけをリストア
-n <スキーマ名> 特定のスキーマだけをリストア
--data-only データのみをリストア
--schema-only スキーマ(構造)のみをリストア
--clean リストア前に既存のオブジェクトを削除
--if-exists 削除オプションで対象が存在する場合のみ削除を実行

各ユースケースにおけるバックアップ方法

以下では、様々なユースケースに応じた論理バックアップの方法をまとめています。

ケース① 特定のスキーマだけバックアップしたいとき

pg_dump-nオプションを使用すれば、特定のスキーマだけをバックアップすることが可能です。

コマンド例

pg_dump -U <ユーザー名> -Fc -n <スキーマ名> -f <バックアップファイル名> <データベース名>

ケース② 特定のスキーマの特定のテーブルだけバックアップしたいとき

pg_dump-tオプションを使用すれば、特定のスキーマの特定のテーブルだけをバックアップすることが可能です。

コマンド例

pg_dump -U <ユーザー名> -Fc -n <スキーマ名> -t <テーブル名> -f <バックアップファイル名> <データベース名>

補足

  • テーブルは<スキーマ名>.<テーブル名>の形式で指定することも可能です。

ケース③ 特定のスキーマの特定のテーブルの中身だけバックアップしたいとき

特定のテーブルのデータだけをバックアップするには、 --data-onlyオプションを用います。

コマンド例

pg_dump -U <ユーザー名> -Fc --data-only -n <スキーマ名> -t <テーブル名> -f <バックアップファイル名> <データベース名>

補足

  • リストアの際は、バックアップしたテーブルがすでにつくられていること、バックアップしたデータとリストア先のテーブルの中身に重複がないことはチェックしておきましょう。

ケース④ 自分が指定した条件に合うデータのみを抽出してバックアップしたいとき

事前に条件を設定したビューを作成することで、バックアップ対象を絞ることが可能です。

コマンド例

-- 登録日が2024年のデータのみ抽出
CREATE VIEW filtered_data AS
SELECT * FROM <テーブル名>
WHERE register_date BETWEEN '2024-01-01' AND '2024-12-31';

作成したビューを-tオプションで指定します。

コマンド例

pg_dump -U <ユーザー名> -Fc -t filtered_data -f <バックアップファイル名> <データベース名>

まとめ

今回ご紹介したように、ダンプ取得時は様々なオプションやビューを用いて自分の行いたいケースに応じたバックアップが行えるようになっています。個人的にはケース②がテーブルに変更を加えるようなテストをする際に便利だと感じています!ケース④は今回の記事を書いている際に初めて知ることができました。dumpファイルの中身はSQL文なので、中身をみて大体こういうデータが入っているんだなと判断できます(案外そこの仕組みは単純でびっくりしました)。
ぜひ論理バックアップを使いこなせるようにしましょう!

参考文献

FIJITSU - 技術を知る:PostgreSQLのバックアップとリカバリー ~ 論理バックアップ ~

EnterpriseZine - 論理バックアップはDBバックアップとして適切か?

IBM - 論理バックアップとリストア

NTT - PostgreSQLバックアップ実践とバックアップ管理ツールの紹介

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?