[pgsql-jp: 36197] Re: 原因不明のデータ消失

Kiyoshi Mizuno kiyoshi_mizuno @ mail.toyota.co.jp
2005年 10月 19日 (水) 08:11:25 JST


水野です。

#半日いなかった間にずいぶんメールが飛び交っているなあ

> -----Original Message-----
> 運用の都合上、ACCESSのmdbとPostgresのデータベースに同時に書き込みをしていて、
> ACCESS+ODBCがインターフェースとなっています。
> (トランザクションはACCESSのVBAで記述している。)
(中略)
> Postgresは2台のホストで稼動していて、1台目のPostgresにInsertかUpdateがあった際に、
> トリガーにて反映されるようになっています。
(さらに中略)
> この状況で次のような問題が発生しています。
> ・データ用mdbとPostgres1にはデータがないが、Postgres2にはデータがある。
> ・Postgres1にはその消失したデータを確かに一度書き込みに来ている形跡がある。
>   →形跡とは、Postgres1ではシーケンスで一意の番号が取れるようになっているが、
>    消失したデータ分だけシーケンス番号が飛んでいる。
> ・ACCESS上では特にエラーはかえっていない。

Postgres2のデータ更新ルートがPostgres1しかない以上、
一度はPostgres1にもデータが書かれたと見なすのが筋でしょうね。
Postgres1のシーケンスが更新されているなら間違いないです。

この説明で「ありそうだな」と思ったのは
(1)トランザクションでPostgres1にデータを書き込む
(2)INSERT/UPDATEトリガでPostgres2へデータがコピーされる
(3)何かの原因でPostgres1のトランザクションをキャンセル
  (これの調査はトランザクション管理をしているAccessないし
   Postgres1に監視処理を追加しないといけないでしょう)
(4)トランザクションキャンセルはPostgres2へ伝わらず、
  Postgres2にはデータが残った
  (トリガによるPostgres2のテーブル更新はPostgres1の
   トランザクションとは独立した物と見なされていると思います)
というパターンです。

ODBC接続の場合、ODBCで想定外のエラーが発生した時は
呼び出し側でそのエラーを捕捉できない事があるらしい(とどっかで聞いた)
ので、Postgre1でトランザクションが失敗しても
> ・ACCESS上では特にエラーはかえっていない。
というのはありえる話です。




pgsql-jp メーリングリストの案内