4

bucardo と postgres を使用してマルチマスター セットアップを実行しています。

テーブル シーケンスの一部が互いに同期していないことがわかりました。特に、自動インクリメントされた ID。

例:

db1 - テーブル 1

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')

新しい行の ID は 1 です

db2 - テーブル 1

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')

新しい行の ID は 1 です

bucardo は db1 からデータをレプリケートしたため、db2 の新しい行の ID は 2 である必要がありますが、db2 の自動インクリメントは以下に基づいています。

nextval('oauth_sessions_id_seq'::regclass)

「oauth_sessions_id_seq」を確認すると、最後の値が 0 であることがわかります。

ふぅ… 理にかなっていますか?

とにかく、私は次のいずれかを行うことができますか?

  1. 各 DB のセッションが共有されるように、セッション テーブルを bucardo で複製しますか?

  2. 上記のデフォルトの自動インクリメント関数を操作して、テーブル内の既存のアイテムの最大数を考慮しますか?

より良いアイデアがあれば、遠慮なくお寄せください。質問はお気軽にどうぞ。

4

2 に答える 2

3

FAQ のこのコメントによると、Bucardo ソリューションがないため、ID 生成方法を変更する必要があります。

Bucardo は DDL をレプリケートできますか?

いいえ、Bucardo はトリガーに依存しており、Postgres はまだ DDL トリガーまたはシステム テーブルのトリガーを提供していません。

Bucardo はトリガーを使用するため、シーケンスの変更を「見る」ことはできず、レプリケートするテーブル内のデータのみを「見る」ことができます。シーケンスは、トリガーをサポートしない興味深いオブジェクトですが、手動で更新できます。の前に以下のコードのようなものを追加できると思いますが、INSERTそれでも問題がある可能性があります。

SELECT setval('oauth_sessions_id_seq', (SELECT MAX(did) FROM distributors));

詳細については、この質問を参照してください。

関連するすべての問題について完全に把握しているわけではありませんが、最大の計算を手動で実行し、再試行ループで挿入操作を実行できます。両方の DB で実際に挿入を行い、Bucardo にレプリケートを許可している場合、うまくいくとは思えませんが、一度に 1 つの DB のみが更新されることを保証できる場合は、UPSERT再試行ループのようなものを試すことができます。詳細については、この投稿を参照してください。ループの「内臓」は次のようになります。

INSERT INTO  distributors (did, dname) 
    VALUES ((SELECT max(did)+1 FROM distributors), 'XYZ Widgets');
于 2015-01-25T01:59:35.990 に答える