【PostgreSQL】pg_dumpコマンドを初心者向けに解説します

2021年4月28日PostgreSQLその他

pg_dumpの解説です

はじめに、PostgreSQLのpg_dumpとは、バックアップを取得するコマンドなのですが、

オプションが死ぬほど多い、サイトによっても書き方が違う等々、正直私には難しいものでした。

 

それでもいろいろ調べ、試行錯誤しながら理解したことを残したいと思います。

全くわからない人向けに書きますのでご理解頂ければ幸いです。

 

pg_dumpとは

まず、pg_dumpとはデータベースのバックアップを行うPostgreSQLのコマンドです。

pg_dumpを実行するためには、次の例のように「pg_dump」を先頭に記述し、

その後にこのような記述の形になります(サイトによっていろいろな表記がありますが)。

pg_dump XXXX XXX 
pg_dump --file=test.sql testdb   # 例えばこんな感じ

 

そもそも「pg_dump」って何?どこの誰よ?というと…

次の場所にあるのがpg_dumpの正体です

 

・Windowsの場合

「C:\Program Files\PostgreSQL\XX\bin\pg_dump.exe」 ※XXはバージョン

PostgreSQLのインストール先を特に変更していなければこのパスになるはずです。

※ 画面はPostgreSQL12の場合。pg_dump.exeと同じフォルダにあります。

 

・Linux(Ubuntu Server)の場合

「/usr/bin/pg_dump」にあります。

 

 

pg_dumpとpg_dumpallの違い

pg_dumpを探した時、pg_dumpallという似た名前があることに気づいたでしょうか。

 

pg_dumpもpg_dumpallも同じバックアップを取る時に使うものですが、目的が若干異なります。

・pg_dump    … 一つのデータベースのバックアップ取得する

・pg_dumpall … すべてのデータベースのバックアップやユーザー(=ロールという)を取得する

 

pg_dumpallについては別途で説明をしようと思いますので

今回は1つのデータベースのバックアップ(pg_dumpのほう)に焦点をあてて説明します。

 

 

補足.pg_dumpが認識されない時

pg_dumpを実行しようとした時、

「pg_dumpは、内部コマンドまたは外部コマンド、操作可能な…認識されません」

というメッセージが表示されるケースがあります。

 

コマンドの打ち間違いでない限り、理由はこのどちらかだと思います。

① 環境変数(Path)に設定されていない

② pg_dumpのある場所で実行していない

 

対処方法はこちらで紹介していますので、困った場合は参考にしてみて下さい。

 

 

pg_dumpのコマンド解説(-Uについて)

ここからはpg_dumpのコマンドを1つ1つ解説します

上でも書きましたが、pg_dumpのコマンドの基本形は次のような形になります。

# pg_dumpのコマンドの基本形
pg_dump -U ユーザー名 --format=出力形式 --file=出力先 バックアップを取るDB名

# 実際のコマンド例
pg_dump -U postgres --format=p --file=c:\backup\test.sql testdb

 

(また他のサイトと書き方が違くない?とか思った人がいるかもしれないですが、

少しずつ解説していきますのでお付き合いください。。)

 

実際のコマンド例を基にします。

-U postgres」の箇所は、postgresユーザーで実行することを示していますが、

すでにpostgresユーザーでログインしている時は不要な(=省略可能な)箇所です。

# 実際のコマンド例
pg_dump -U postgres --format=p --file=c:\backup\test.sql testdb

 # すでにログインしているときには-Uが不要
pg_dump --format=p --file=c:\backup\test.sql testdb

 

 

ーーformatについて

formatで指定できる4パターンについて

次に「--format=p」の箇所についてです。formatで指定できるのは4パターンです。

① --format=p:SQL文のテキストファイルで出力される(データも含みます)。

② --format=c:カスタム形式(=簡単にいうと圧縮されたバックアップファイルのこと)

③ --format=t:tar形式

④ --format=d:ディレクトリ形式(テーブル単位でのカスタム形式)

※ ①がデフォルト値(formatを指定しない場合は=pと同じ意味になります。)

※ ④のみ--jobsというオプションを使うと並列バックアップが可能

※ バイナリ形式と呼ばれるものは②~④の形式です。

 

補足ですが、①はデフォルト値のため「--fomat=p」は省略できます。

②は圧縮されたバックアップファイルのため、

他の①、③と比べてもファイルのサイズがかなり小さくなります。

③のtar形式とは、ざっくりいうと複数のファイルが1つになったもののことです。

tar自体はPostgreSQL独自ではないので調べてみて下さい。

④はフォルダが作成されその中にファイルが複数出力される形になります。

※いずれの方法も後半で実行結果を紹介しています。

# ①--format=p : SQL文のテキストファイルで出力(次の2行は同じ意味)
pg_dump -U postgres --format=p --file=c:\backup\test1.sql testdb1
pg_dump -U postgres --file=c:\backup\test1.sql testdb1   # format=pは省略可

# ②--format=c : カスタム形式のファイルで出力
pg_dump -U postgres --format=c --file=C:\backup\test2.custom testdb2

# ③--format=t : tar形式
pg_dump -U postgres --format=t --file=C:\backup\test3.tar testdb3

# ④--format=d : ディレクトリ形式
pg_dump -U postgres --format=d --file=C:\backup\test4 testdb4

 

 

--formatは書き換え可能

さらに「--format=」は「-F」に書き換えが可能です。ーFはハイフンが一つのため注意

それぞれ書き換えると次のようになります。

① --format=p   =   -Fp

② --format=c   =   -Fc

③ --format=t   =   -Ft

④ --format=d   =  -Fd

# --format=p : SQL文のテキストファイルで出力(次の3行は同じ意味)
pg_dump -U postgres --format=p --file=c:\backup\test1.sql testdb1
pg_dump -U postgres -Fp --file=c:\backup\test1.sql testdb1
pg_dump -U postgres --file=c:\backup\test1.sql testdb1   # format=pは省略可

# --format=c : カスタム形式のファイルで出力(次の2行は同じ意味)
pg_dump -U postgres --format=c --file=C:\backup\test2.custom testdb2
pg_dump -U postgres -Fc --file=C:\backup\test2.custom testdb2

# --format=t : tar形式(次の2行は同じ意味)
pg_dump -U postgres --format=t --file=C:\backup\test3.tar testdb3
pg_dump -U postgres -Ft --file=C:\backup\test3.tar testdb3

# --format=d : ディレクトリ形式(次の2行は同じ意味)
pg_dump -U postgres --format=d --file=C:\backup\test4 testdb4
pg_dump -U postgres -Fd --file=C:\backup\test4 testdb4

 

 

4パターンの出力方法の使い分け

CPUのリソースを必要としますが、圧縮された形式で取得したい、早くバックアップを

終わらせたいといった場合には、カスタム形式またはディレクトリ形式を選択。

 

特に速さ重視なら並列バックアップ可能なディレクトリ形式のほうがよいと思います。

CPUリソースを使いたくない時は、テキスト形式またはtar形式を選択します。

 

一般的におすすめはカスタム形式です。

理由は、リストア時に(テーブル単位等での展開ができる等の)柔軟性があること、

必要であればテキスト形式へ変換可能なことが挙げられています。

 

 

--fileについて

指定するファイル名

「--file=c:\backup\test.sql」の箇所ですが、フルパス、ファイル名どちらでもOKです。

フルパスでなくファイル名だけを指定すると、コマンドプロンプトで現在いるフォルダ

(カレントディレクトリ)に出力されます。

pg_dump -U postgres --format=p --file=c:\backup\test1.sql testdb1 # フルパス
pg_dump -U postgres --format=p --file=test1.sql testdb1           # ファイル名のみ

 

 

拡張子

ぶっちゃけ拡張子はなんでもいいです(たぶん)。

ただ次のようになることが多いので、合わせておいた方が無難かと。

① テキスト形式:「.sql」

② カスタム形式:「.dump」、「.custom」、「.backup」、「.dmp」

③ tar形式:拡張子をつけない、「.tar」

④ ディレクトリ形式:拡張子をつけない

 

 

実行確認

最後に4パターン(テキスト形式~ディレクトリ形式)で実行し、

どのような結果になるか簡単ですが紹介します。

 

テスト環境の用意

バックアップ動作確認用の環境を作成します。

余談ですがテスト環境を作成するには、pgbenchを使った便利な方法があります。

 

 

① テキスト形式でのバックアップ実行

念のため3パターンで実行

# --format=p : SQL文のテキストファイルで出力(次の3行は同じ意味)
pg_dump -U postgres --format=p --file=C:\BackupTest\test1_1.sql testdb
pg_dump -U postgres -Fp --file=C:\BackupTest\test1_2.sql testdb
pg_dump -U postgres --file=C:\BackupTest\test1_3.sql testdb

 

実行結果確認。3つとも問題なく実行可能。

 

メモ帳で開くとこんな感じ。SQLがずらずらと並びます。

 

 

② カスタム形式

2パターンで実行

# --format=c : カスタム形式のファイルで出力(次の2行は同じ意味)
pg_dump -U postgres --format=c --file=C:\BackupTest\test2_1.custom testdb
pg_dump -U postgres -Fc --file=C:\BackupTest\test2_2.custom testdb

 

問題なく実行完了。

サイズはテキスト形式と比べ明らかに減っています。

 

メモ帳では、よくわからない形になります。

 

 

③ tar形式

2パターンで実行

# --format=t : tar形式(次の2行は同じ意味)
pg_dump -U postgres --format=t --file=C:\BackupTest\test3_1.tar testdb
pg_dump -U postgres -Ft --file=C:\BackupTest\test3_2.tar testdb

 

こちらも問題なく実行完了。

サイズはテキスト形式と同じくらいになりました。

 

 

④ ディレクトリ形式

最後にディレクトリ形式です。

# --format=d : ディレクトリ形式(次の2行は同じ意味)
pg_dump -U postgres --format=d --file=C:\BackupTest\test4_1 testdb
pg_dump -U postgres -Fd --file=C:\BackupTest\test4_2 testdb

 

フォルダが作成され、その中にいくつかファイルができます。

 

フォルダの中身はこんな感じです。

 

 

リストアについて

pg_dumpの説明は以上です。多少なりとも理解できましたでしょうか。

次はリストアの方法について解説しようと思いますのでお待ちください。