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() ファンクションは使用できません。