理系学生日記

おまえはいつまで学生気分なのか

PostgreSQLの論理バックアップ時に使用するpg_dumpの基本的な使い方

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
--