ダンプしてリストアしてみる
TweetPosted 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=>
権限とかスキーマが若干不安ですがデータは移っているようですね。
参考文献
Tags: postgres