2005/05/12(木)postgreSQL dbmirror

2017/10/11 24:51 サーバ運営・管理
 以前、ここでも紹介した dbmirror ですが、どうも PostgreSQL 7.4 での動作が今ひとつ。
 導入の仕方は ここ を参考。

 ミラーリング構築途上で、スレーブ側にデータベースのコピーをコピーするように手順は書かれていますが、
 結論的に、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 該当データベース名 < 出力ファイル名)
 やや手間かかりますが、この操作で正常なミラーリングが出来るようです。
 上記の最後の手順で、バックグラウンドでインデックス更新などをやるようなので、暫く放置しておくことが肝心です。
 なお、最初から明示的に主キーが設定されているテーブルを持つデータベースではこの現象は出ないようです。