ログ日記

作業ログと日記とメモ

pg_dump -o ではテーブル等のoidがリストアできない

かなりハマってた。
テーブルやインデックスなどのoidは pg_catalog.pg_class にある。
なのでpg_dumpではpgpool用のダンプを取れない。


それでpg_dumpallでやってみたけれどリストア後にやっぱりエラーが出る。

dbmail=> \d dbmail_aliases
ERROR:  kind mismatch between backends
HINT:  check data consistency between master and secondary
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.

pgpool経由でリストアしたらデータの同期もちゃんと取れているだろう、っていう予想が間違ってたのか。
より簡単なrsyncで済ませればいいのだけれど・・なんだかすっきりしないまま諦めるのも嫌だな。


pgpoolを使っているときのダンプの仕方って
↑ここまで書いて、以前に見たことのあるスレで石井さんが明確な返答をしていた・・
http://ml.postgresql.jp/pipermail/pgsql-jp/2006-March/020467.html

前に見たときはこういう問題に直面してなかったというかpgpoolを使う前だったのでスルーしてしまっていた。そのときは「あぁ、-Eオプションって面白いな」ぐらいの認識だった・・・orz

> この場合、
> (1) 強制的にOIDを変更できるのでしょうか?

PostgreSQLにはそういう標準機能はありません.Cで関数書けばできないこと
もないですが,危なすぎて公開できません:-)

> (2) こうならないためにはcreate tableはどのように実行すればよいでしょうか?

まずOIDカウンタを一致させてください.rsyncなどで物理的にデータベースク
ラスタをコピーすることをおすすめします(当然DBを停止してから実行).

> (3) \dではエラーになりますが、実際のレプリケーション動作上は
> 問題ないのでしょうか?

OIDに依存したSQLでない限り,問題ありません.

OIDを一致させるのは無理と言っているので素直にrsync使えということか・・orz



となると、本来の目的である稼働中のサーバでEUC_JPデータをUNICODEに変換するのは難しいんじゃなかろうか?
データをダンプしてUNICODEでデータベースを作ってマスタのみにリストアしてセカンダリにrsyncすればいいのか。その間は瞬停・・で済むのかどうか・・。