ここから本文です

解決済みの質問

知恵コレに追加する

pg_dumpでデータを取得する際、シーケンスの初期値を、現在の最大値に設定できるか...

trainspotting123456さん

pg_dumpでデータを取得する際、シーケンスの初期値を、現在の最大値に設定できるかどうか

初めて質問いたします
ご無礼ありましたら、申し訳ありません。

現在、データベースを別サーバに移行作業中です。

移行元:
OS:RedHat Linux 6.2J
Postgresql-7.1.3

移行先
OS:CentOS4.6
PostgreSQL-7.4.19

以降元で、以下のコマンドを入力して、DBデータを取得しております。

移行元サーバで実行
pg_dump -d データベース名 > backup.sql

リストア時は以下のコマンドを入力して、実行しています。

移行先サーバで実行
psql -d データベース -f backup.sql

上記のような手順で、データを移行しますと
シーケンスの初期値がすべて「1」となってしまいます。
nextvalで各テーブルのprimarykeyとなるIDを生成している部分があり、
移行前では、nextvalで生成される値が「100」になっているにも関わらず
以降後では、nextvalで生成される値は「1」になってしまい、
エラーが発生してしまいます。

そこで、pg_dumpでデータを取得する際、移行前の最大値を、以降後の初期値(スタート値)
にする方法があれば、教えていただけないでしょうか。
※nextvalを使用しているテーブルは複数あります。テーブルごとに専用のシーケンスをしようしています。
例)テーブル名 test1 シーケンス名 test1_id_seq
テーブル名 test2 シーケンス名 test2_id_seq

また、ご不明点ありましたら、書き込みお願いいたします。

よろしくお願い申し上げます。

違反報告

ベストアンサーに選ばれた回答

umekichi0123さん

>pg_dump -d データベース名 > backup.sql
関係あるかはわかりませんが、dオプションはダンプデータをinsert文で出力するのでオプションなしでpg_dumpを実行してみてはどうでしょうか?
http://www.postgresql.jp/document/current/html/app-pgdump.html

うまく行かなければ、SQL文で
SELECT setval('test1_id_seq', 100);
とか
ALTER SEQUENCE
で手動でしこしこ移行するしかないでしょうねー。
http://www.postgresql.jp/document/current/html/sql-altersequence.ht...

ちなみに、データベースのメジャーバージョンが変わっている場合は、基本的に移行先(Postgresql-7.1.3)から移行元(PostgreSQL-7.4.19)のDBに接続してpg_dumpを実行したほうが良いとされているようです。
http://www.postgresql.jp/document/current/html/migration.html

この質問は投票によってベストアンサーが選ばれました!

この質問・回答は役に立ちましたか?
はい
いいえ

お役立ち度:お役立ち度 3点(5点満点中)2人中 1人が役に立つと評価しています。

ベストアンサー以外の回答

2件中12件)
並べ替え:回答日時の
新しい順
古い順

 

trainspotting1234567さん

ご返答ありがとうございます。

また、返事遅くなってしまい、申し訳ありません

急遽、別件が入ったため、着手できずにいました(泣)

今週中に再度着手し、結果報告しますのでよろしくお願いします!

nora1962jpさん

はじめまして。お力になれないかもしれませんが。
windows XP
postgresql 8.3.3の環境ではシーケンス値の最終値も含めて移行されるようです。

「Postgresql-7.1.3」の問題かもしれません。
移行元でリモート接続可能な設定にして移行先から「pg_dump」を実行してみてはどうでしょうか。

あなたにおすすめの解決済みの質問

OEMを使用して、TESTという名前のデータベースのバックアップをし、誤ってテーブルやレコードを消してしまった場合にリカバリをして復旧しようと思っております。 データベースサーバ OS:Windows2000 Server SP4 環境:Oracle D...
MySQL+PHPで、同じサーバー内の異なるDB同士を結合する方法について教えてください。 例えば、下記のような異なるデータベースに存在する2つのテーブルを結合させたいです。 データベース名:DB1 ホスト:localhost ID:test1...
Oracle Enterprise Manager(OEM)を使用してのリカバリ手順 Oracle Enterprise Manager(OEM)を使用してのリカバリ手順 OracleDatabase10.2gを使用しており、 OEMを使用してデータベースのバックアップやリカバリを行っております...