LoginSignup
2
5

More than 5 years have passed since last update.

PostgreSQLダンプ&リストア

Last updated at Posted at 2018-08-08

概要

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
;

これをコピペで実行してみれば、比較できそうですね。

以上。

参考サイト

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5