RDS(PostgreSQL)の論理レプリケーションの競合エラーを解消する
競合を発生させる
#subscribe側のテーブルに事前にINSERTする
insert into LogicalReplicationTest values (1);
#publisher側のテーブルにINSERTして伝搬させる
insert into LogicalReplicationTest values (1);
エラー確認
2019-11-30 15:13:26 UTC::@:[29680]:ERROR: duplicate key value violates unique constraint "logicalreplicationtest_pkey"
2019-11-30 15:13:26 UTC::@:[29680]:DETAIL: Key (a)=(1) already exists.
2019-11-30 15:13:26 UTC::@:[12125]:LOG: worker process: logical replication worker for subscription 110499 (PID 29680) exited with exit code 1
この時の方針としては大きく2つある。
- 競合が発生した原因を取り除く
- 上記の場合は、publisher側のテーブルに既にデータが入っていることが原因なので、publisher側をメンテナンスする。
- publisher側のLSNの適用位置を変更する
今回は上記の「2.publisher側のLSNの適用位置を変更する」をやってみる。あるべき姿は「1.競合が発生した原因を取り除く」
現時点のLSNの位置を確認
select * from pg_show_replication_origin_status();
rdb=> select * from pg_show_replication_origin_status();
local_id | external_id | remote_lsn | local_lsn
----------+-------------+------------+------------
1 | pg_110499 | 0/306DC150 | B/E103DA48
(1 row)
Publisher側のWALのLSNの位置を確認
SELECT pg_current_wal_lsn();
rdb=> SELECT pg_current_wal_lsn();
pg_current_wal_lsn
--------------------
0/306E3BF8
(1 row)
Subscribe側のLSNの位置を変更
SELECT pg_replication_origin_advance('pg_110499', '0/306E3BF8');
rdb=> select * from pg_show_replication_origin_status();
local_id | external_id | remote_lsn | local_lsn
----------+-------------+------------+-----------
1 | pg_43450 | 0/3006B190 | 0/0
(1 row)
読み取り位置が変更されることにより、競合が発生しなくなる。
関連しているかもしれない記事
- RDS(PostgreSQL)でpg_replication_origin_statusにアクセス出来ない(permission denied)
- Aurora(PostgreSQL)でQPM(Query Plan Management)を試してみる
- RDS(PostgreSQL)にsysbenchを実行する
- EC2上からpsqlでAurora(PostgreSQL)に接続するまで
- Aurora(PostgreSQL)へのpsql接続時にパスワードを省略する方法