概要
Postgresのデータをコピーすることがあったのでとりあえず、メモとして残す。
ダンプ
今回は、不要となったtextsearch_jaなどの拡張機能を取り除く意味で、スキーマ(構造)とデータを別々にダンプすることにします。
ターミナル
# スキーマ(構造)
$ pg_dump -U hoge_admin -h 127.0.0.1 -s -p 5432 --create hoge_db > ~/schema.sql
# データ出力
$ pg_dump -U hoge_admin -h 127.0.0.1 -a -p 5432 hoge_db > ~/data.sql
ファイルの転送
下記コマンドにて、ダンプしたファイルを対象サーバへ転送する。
ターミナル
$ scp ~/schema.sql hoge@[IPアドレス(転送先)]:/home/hoge/
リストア
下記コマンドにて、リストアする。
# 構造作成
$ psql -U hoge_admin -h 127.0.0.1 -d postgres -f schema.sql
# データ登録
$ psql -U hoge_admin -h 127.0.0.1 hoge_db < data.sql
件数確認
各テーブルのレコード数を確認してみる。
確認.sql
SELECT
t2.relname,
t2.reltuples
FROM
pg_stat_user_tables AS t1
INNER JOIN
pg_class AS t2 ON t1.relname = t2.relname
ORDER BY
t2.relname
;
実際のテーブルのレコード数と比較すると、件数が異なる・・・
下記記事を見ると・・・
・PostgreSQLでDBの各テーブルのレコード数を一覧で確認したいとき
ひとつ注意すべき点は、reltuplesが
Number of rows in the table. This is only an estimate used by the planner. It is updated by VACUUM, ANALYZE, and a few DDL commands such as CREATE INDEX
つまり、「だいたいの数値であって正しいとは限らないぜ」ってトコ。
これでは、ダンプがうまくいっているかの確認には使えないみたい・・・
何かいい方法あるかな・・・
<方法1>
select count(*) from table_name;
<方法2>
select relname as name, reltuples as rows from pg_class where relname ='table_name'
※1と2で件数が異なる場合は、反映されていない状態なので、
「vacuum table_name」で反映させる。
なるほど、バキュームすると件数があうのか・・・
vacuum survey_responses
それか、下記SQLで、各テーブルの件数を取得するクエリを生成できそう
SELECT
ARRAY_TO_STRING(
ARRAY(
SELECT
('SELECT ''' || relname || ''' AS table, COUNT(*) AS rows FROM ' || relname) AS query
FROM
pg_stat_user_tables
ORDER BY
relname ASC
)
, chr(10) ||' UNION ' || chr(10))
|| chr(10) || ';'
;
上記クエリの実行結果
SELECT 'hoge1' AS table, COUNT(*) AS rows FROM hoge1
UNION
SELECT 'hoge2' AS table, COUNT(*) AS rows FROM hoge2
UNION
SELECT 'hoge3' AS table, COUNT(*) AS rows FROM hoge3
UNION
SELECT 'hoge4' AS table, COUNT(*) AS rows FROM hoge4
UNION
SELECT 'hoge5' AS table, COUNT(*) AS rows FROM hoge5
UNION
SELECT 'hoge6' AS table, COUNT(*) AS rows FROM hoge6
;
これをコピペで実行してみれば、比較できそうですね。
以上。