pd_dump は、PostgreSQL のデータバックアップを取得するためのコマンドラインツールです。 どういう形でバックアップするのかは、まずは実例を見て頂けるとわかりやすい。
$ pg_dump -h 127.0.0.1 -U postgres dvdrental | less -- -- PostgreSQL database dump -- -- Dumped from database version 9.6.1 -- Dumped by pg_dump version 9.6.1 SET statement_timeout = 0; SET lock_timeout = 0; (略) -- -- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: -- CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; (略) -- -- Name: actor; Type: TABLE; Schema: public; Owner: postgres -- CREATE TABLE actor ( actor_id integer DEFAULT nextval('actor_actor_id_seq'::regclass) NOT NULL, first_name character varying(45) NOT NULL, last_name character varying(45) NOT NULL, last_update timestamp without time zone DEFAULT now() NOT NULL ); (略) -- Data for Name: actor; Type: TABLE DATA; Schema: public; Owner: postgres -- COPY actor (actor_id, first_name, last_name, last_update) FROM stdin; 1 Penelope Guiness 2013-05-26 14:47:57.62 2 Nick Wahlberg 2013-05-26 14:47:57.62 3 Ed Chase 2013-05-26 14:47:57.62 (略)
こんな風に、pg_dump
はデータベースの内容を読み取り、それを標準出力に出力します。
PostgreSQL は物理バックアップもできますが、pg_dump
のメリットはオンラインバックアップが可能ということです。
他のユーザのトランザクションをブロックすることなくダンプが可能です。
ビューやシーケンス、ファンクションといったオブジェクトも対象になります。
特定のテーブルだけをダンプ出力することも可能です(-t TABLENAME
)。また、標準出力ではなくファイルに直接出力したい場合は、-f FILENAME
を指定します。
$ pg_dump -h 127.0.0.1 -U postgres dvdrental -t ACTOR -f actor.sql
リストアについては、生成されたダンプファイルを psql
に食わせれば良いです。
$ psql -h 127.0.0.1 -U postgres dvdrental < actor.sql
ただし、ダンプには create database 等、オブジェクトの作成が含まれるので、オブジェクトが作成済のデータベースに対してリストアすると、ERROR: relation "actor" already exists
といったエラーが発生します。
データだけをダンプに含ませるためには、-a
オプションを使用します。
$ pg_dump -h 127.0.0.1 -U postgres dvdrental -t ACTOR -a -f actor.sql
実はダンプファイルにはいくつかフォーマットが存在しており、これまでに使ってたのはデフォルトのスクリプトファイル (SQL) です。
他には、以下のような形式があります。いずれも、pg_restore
を使ってリストアします。
custom (-Fc
で指定)
カスタム形式と呼ばれるフォーマットです。形式はバイナリなので、スクリプトファイルのように人が読むことはできません。
directory (-Fd
で指定)
ディレクトリ形式と呼ばれるものです。これを指定する場合、-f
ではディレクトリ名を指定します。
$ pg_dump -h 127.0.0.1 -U postgres dvdrental -t ACTOR -a -Fd -f dump $ ls dump2 ./ ../ 2236.dat.gz toc.dat
この dat.gz
にデータが含まれています。
$ gzip -dc dump/2236.dat.gz | head -5 1 Penelope Guiness 2013-05-26 14:47:57.62 2 Nick Wahlberg 2013-05-26 14:47:57.62 3 Ed Chase 2013-05-26 14:47:57.62 4 Jennifer Davis 2013-05-26 14:47:57.62 5 Johnny Lollobrigida 2013-05-26 14:47:57.62
tar (-Ft
で指定)
tar 形式には、restore 用の SQL が含まれます。
直接実行してもリストアできるはずですが、通常は pg_restore
を使った方が簡潔です。
$ pg_dump -h 127.0.0.1 -U postgres dvdrental -t ACTOR -a -Ft -f actor.tar $ tar tf actor.tar toc.dat 2236.dat restore.sql
実際に restore.sql
の中身を見ると、データファイルからデータをコピーしていることが分かります。
$ tar xOf actor.tar restore.sql| less (略) -- -- Data for Name: actor; Type: TABLE DATA; Schema: public; Owner: postgres -- COPY actor (actor_id, first_name, last_name, last_update) FROM stdin; \. COPY actor (actor_id, first_name, last_name, last_update) FROM '$$PATH$$/2236.dat'; -- -- PostgreSQL database dump complete --