2005/05/12(木)postgreSQL dbmirror
2017/10/11 24:51
導入の仕方は ここ を参考。
ミラーリング構築途上で、スレーブ側にデータベースのコピーをコピーするように手順は書かれていますが、
結論的に、postgreSQL 7.4 上では、これはやらない方が無難なようです。
postgreSQL の場合、スタンドアロンな状態では、主キーの無いテーブルが作れ、
普通に稼働できてしまうのですが、この状態で、スレーブ側にも主キーの無いテーブルのデータベースをコピーして運用を始めると、
NOTICE: Could not select primary index key
ERROR: Could not determine primary key data
ERROR: current transaction is aborted, queries ignored until end of transaction block
のようなエラーになって、既存データの更新操作が出来ないという現象です。
そこで、以下の手順で、dbmirror を初期化する手順をとっています。
・マスター側で該当データベースのスキーマ情報だけを抽出 (ex. pg_dump -s -F p -f 出力ファイル名 該当データベース名 )
・マスター側で該当データベースのデータのみを抽出 (ex. pg_dump -a -D -F p -f 出力ファイル名 該当データベース名 )
・スレーブ側に dbmirror 対象のデータベース生成
(ex. createuser ユーザ名 #必要なユーザ名を予め生成しておく)
(ex. createdb 対象データベース名 -U ユーザ名)
・スレーブ側にftp などで、該当データベースのスキーマ情報をマスター側から転送し、テーブル生成
(ex. psql 該当データベース名 < 該当データベースのスキーマ情報)
・マスター側の該当データベースを削除 (ex. dropdb 該当データベース名)
・スレーブ側と同じ手順で マスター側に dbmirror 対象のデータベース、テーブルを生成
・マスター側で dbmirror を起動。(スレーブ側に自動的に接続される)
・マスター側でデータをリストア (ex. psql 該当データベース名 < 出力ファイル名)
やや手間かかりますが、この操作で正常なミラーリングが出来るようです。
上記の最後の手順で、バックグラウンドでインデックス更新などをやるようなので、暫く放置しておくことが肝心です。
なお、最初から明示的に主キーが設定されているテーブルを持つデータベースではこの現象は出ないようです。