DML and DDL replication and nonreplication#

SQLステートメントの2つのメジャークラスは、 DML とDDLです。

  • DMLはデータ変更言語であり、テーブルに格納されているデータを変更するSQLステートメントに関係します。これには、 UPDATE、DELETE、およびINSERTが含まれます。

  • DDLはデータ定義言語であり、データの保存方法を変更するSQLステートメントに関係します。これには、 CREATE、ALTER、およびDROPが含まれます。

PGDは、各クラスを個別に処理します。

DMLレプリケーション#

PGDはDMLステートメントをレプリケートしません。 DMLステートメントによって発生した変更をレプリケートします。たとえば、2つの行を変更したUPDATEは2つの変更をレプリケートしますが、行を削除しなかったDELETEは何もレプリケートしません。これは、 volatileステートメントの実行結果がレプリケートされ、ステートメントベースのレプリケーションで発生する可能性のあるノード間の相違がないことを意味します。

DDLレプリケーション#

DDLレプリケーションはDMLとは異なります。 DDLの場合、PGDはステートメントをレプリケートし、すべてのノードで実行します。したがって、 DROP TABLE IF EXISTS はローカルノードで何もレプリケートしない場合がありますが、 DDLレプリケーションが有効になっている場合、ステートメントは他のノードに送信されて実行されます。詳細については、 Running DDL safely を参照してください。

PGDは、同じトランザクション内でも、混合されたDMLおよびDDLステートメントが正しく動作するように機能します。

レプリケートされていないステートメント#

これらの2つのクラスの外部には、PGDがデザインでレプリケートしないSQLコマンドがあります。次のユーザーコマンドはPGDによってレプリケートされないため、その効果はローカル/オリジンノードでのみ発生します。

  • カーソル操作 DECLARE、CLOSE、FETCH

  • 実行コマンド DO、CALL、PREPARE、EXECUTE、EXPLAIN

  • セッション管理 DEALLOCATE、DISCARD、LOAD

  • パラメーターコマンドSET、SHOW

・コンストレイン操作SET CONSTRAINTS

  • ロックコマンド LOCK

  • テーブルメンテナンスコマンドVACUUM、ANALYZE、CLUSTER

  • 非同期操作 NOTIFY、LISTEN、UNLISTEN

NOTIFY SQLコマンドとpg_notify() ファンクションはレプリケートされないため、フェイルオーバーの場合の通知は信頼できません。これは、サーバーがクラッシュしたときにトランザクションがコミットされた場合、フェールオーバー時に通知が簡単に失われる可能性があることを意味します。 LISTEN を実行しているアプリケーションは、フェイルオーバーが発生した場合の通知を見逃す場合があります。

これは標準のPostgreSQLレプリケーションに当てはまりますが、 PGDはこれをまだ改善していません。

CAMOおよびEager Replicationオプションでは、 NOTIFY SQLコマンドまたはpg_notify() ファンクションは使用できません。