Kohei Nozaki's blog 

ダンプしてリストアしてみる


Posted on Tuesday Jan 21, 2014 at 02:32PM in Technology


何をするの?

手元の端末で作ったDBを別のマシン上のPostgreSQLにリストアしてみます

環境

ダンプ環境
PostgreSQL 9.2.4 @ OS X 10.9.1
リストア環境
PostgreSQL 9.2.6 @ CentOS 6.5

テスト用のDBを作る

作成用SQL

一応日本語が化けるのとか心配なので日本語も入れてみます

create database testdb001 owner kyle encoding 'UTF8' TEMPLATE template0;
\c testdb001
create table hogetable (id bigint, hogecol varchar(255));
insert into hogetable values (1, 'hoge111');
insert into hogetable values (2, 'ほげ222');

流す

何故かpsqlのプロンプトに日本語をコピペすると文字化けしてしまうのでヒアドキュメント経由で食わせます

kyle-no-MacBook:prepare kyle$ psql <<EOF
> create database testdb001 owner kyle encoding 'UTF8' TEMPLATE template0;
> \c testdb001
> create table hogetable (id bigint, hogecol varchar(255));
> insert into hogetable values (1, 'hoge111');
> insert into hogetable values (2, 'ほげ222');
> EOF
CREATE DATABASE
You are now connected to database "testdb001" as user "kyle".
CREATE TABLE
INSERT 0 1
INSERT 0 1
kyle-no-MacBook:prepare kyle$

ちゃんと入ったか確認してみましょう

kyle-no-MacBook:prepare kyle$ psql testdb001
psql (9.2.4)
Type "help" for help.

testdb001=# select * from hogetable ;
 id | hogecol 
----+---------
  1 | hoge111
  2 | ほげ222
(2 rows)

testdb001=# 

大丈夫そうですね。

ダンプ

もっとも柔軟だそうなのでcustom形式にします。このコマンドで

pg_dump -F c testdb001 > testdb001.dump

実行してみる

kyle-no-MacBook:~ kyle$ pg_dump -F c testdb001 > testdb001.dump
kyle-no-MacBook:~ kyle$ ls -l testdb001.dump 
-rw-r--r--+ 1 kyle  staff  2106  1 21 13:37 testdb001.dump
kyle-no-MacBook:~ kyle$

こいつをscpか何かでリストア環境に持っていきます

リストア

このコマンドでいってみる

pg_restore -v -C -d postgres -j 2 testdb001.dump
-v
進捗状況を詳細表示
-C
リストアの前にデータベースを作成する
-d postgres
接続時のDBにpostgresを使う。-Cを同時に指定している場合,データのリストア先ではない。リストア先のDB名はダンプファイルに含まれるものが使われる.-Cを同時に指定していない場合は,データのリストア先になる.
-j 2
2パラで同時実行。この場合入力はパイプではだめらしい

スーパーユーザで実行するならこう

sudo -u postgres sh -c "pg_restore -v -C -d postgres -j 2 testdb001.dump"

ダンプファイルをpostgresユーザが読めるところに置いて実行

$ cp testdb001.dump /tmp
$ cd /tmp
$ sudo -u postgres sh -c "pg_restore -v -C -d postgres -j 2 testdb001.dump"
pg_restore: リストアのためにデータベースに接続しています
pg_restore: 2183 ENCODING ENCODING を処理しています
pg_restore: 2184 STDSTRINGS STDSTRINGS を処理しています
pg_restore: 2185 DATABASE testdb001 を処理しています
pg_restore: DATABASE testdb001を作成しています
pg_restore: 新しいデータベース"testdb001"に接続しています
pg_restore: データベース"testdb001"にユーザ"postgres"で接続しています
pg_restore: 5 SCHEMA public を処理しています
pg_restore: SCHEMA publicを作成しています
pg_restore: 2186 COMMENT SCHEMA public を処理しています
pg_restore: COMMENT SCHEMA publicを作成しています
pg_restore: 2187 ACL public を処理しています
pg_restore: 169 EXTENSION plpgsql を処理しています
pg_restore: EXTENSION plpgsqlを作成しています
pg_restore: 2188 COMMENT EXTENSION plpgsql を処理しています
pg_restore: COMMENT EXTENSION plpgsqlを作成しています
pg_restore: 168 TABLE hogetable を処理しています
pg_restore: TABLE hogetableを作成しています
pg_restore: メインの並列ループに入ります
pg_restore: 項目 2180 TABLE DATA hogetable に着手します
pg_restore: テーブル"hogetable"のデータをリストアしています
pg_restore: 項目 2180 TABLE DATA hogetable を完了しました
pg_restore: メインの並列ループを終了します
pg_restore: DATABASE testdb001用の所有者と権限を設定しています
pg_restore: SCHEMA public用の所有者と権限を設定しています
pg_restore: COMMENT SCHEMA public用の所有者と権限を設定しています
pg_restore: ACL public用の所有者と権限を設定しています
pg_restore: EXTENSION plpgsql用の所有者と権限を設定しています
pg_restore: COMMENT EXTENSION plpgsql用の所有者と権限を設定しています
pg_restore: TABLE hogetable用の所有者と権限を設定しています
pg_restore: TABLE DATA hogetable用の所有者と権限を設定しています
$ echo $?
0
$ 

確認してみましょう

$ psql testdb001
psql (9.2.6)
"help" でヘルプを表示します.

testdb001=> \d
            リレーションの一覧
 スキーマ |   名前    |    型    | 所有者 
----------+-----------+----------+--------
 public   | hogetable | テーブル | kyle
(1 行)

testdb001=> select * from hogetable ;
 id | hogecol 
----+---------
  1 | hoge111
  2 | ほげ222
(2 行)

testdb001=> 

権限とかスキーマが若干不安ですがデータは移っているようですね。

参考文献



No one has commented yet.

Leave a Comment

HTML Syntax: NOT allowed