sql >> データベース >  >> RDS >> PostgreSQL

指定されたポイント(タイムスタンプまたはトランザクションID)以降のpostgres増分更新をクエリする方法は?

    本当に必要なのは、PostgreSQL9.4の論理デコード です。 変更ストリームを抽出できるサポート サーバーから。これを使用するには、サーバー上の変更ストリームをアプリが使用できるものに変換する論理デコードプラグインが必要です。開発中の数はありますが、まだかなり早い段階です。

    コメントでAWSRDSを使用していると述べたので、現時点では運が悪いです。これは、執筆時点でRDSがデコードプラグインを提供しておらず、それらをインストールするにはスーパーユーザー権限が必要になるためです。

    PostgreSQLではダーティ読み取りを実行できないため、xminとxmaxを使用して完全な増分コピーを行うことはできません。そのため、タプルがDELETEであるかどうかを確認できません。 d。トランザクションIDを使用するには、VACUUMを防止する必要があります 「デッド」行、つまり現在のトランザクションがまだ正しく実行する必要がない行を削除することから。また、ダーティリードを実行できる必要があります。どちらもPostgreSQLで簡単な解決策はありません。

    挿入専用テーブルがある場合 (または、挿入と更新を行い、削除せず、行の主キーを変更しない)場合は、トランザクションxminを使用できます。 トランザクションIDラップアラウンド に対処する必要があります pg_database.datfrozenxidを確認する およびpg_class.relfrozenxid 興味のある関係のために。詳細については、ソースコードとコード内のコメントを参照してください。 VACUUM また、エントリを削除しない場合は、「消失した」行を表示する必要がないため、ダーティリードがなくても問題はありません。

    可能であれば、9.4以降で論理デコードを使用してください。古いバージョンでは、完全なレプリケーションが必要な場合は、トリガーを使用して変更キューを蓄積する必要があります。

    削除と主キーの変更を完全に禁止できる場合は、xminを使用できます。 deleteがないことを確認する限り、変更された行を検索します s実行、または任意のupdate primary keyを変更する s。




    1. 並列実行計画–ブランチとスレッド

    2. 更新クエリのパフォーマンスの問題

    3. mysqlクエリのelseif条件の場合

    4. MySQLコンテナがDockerComposeで初期化スクリプトを実行できない