Postgres逻辑复制初始同步是非常缓慢的过程,特别是如果原始数据库非常大。我想知道是否可以从给定的LSN开始复制?所需的工作流程将是1.从源数据库获取当前LSN1.在源数据库中创建所需对象的逻辑转储1.在目标数据库上恢复转储1.从步骤1中获取的LSN启动逻辑复制我没有找到任何文档允许步骤4,有人知道这是否可能吗?
idfiyjo81#
文档给了你一个提示:使用流式复制接口创建新的复制插槽时(请参见CREATE_REPLICATION_SLOT),将导出快照(见第9.27.5节),这将准确显示数据库的状态,之后所有更改都将包含在更改流中。这可以用于创建新的副本,方法是使用SET TRANSACTION SNAPSHOT读取创建插槽时的数据库状态。这事务可以用来转储数据库在该时间点的状态,之后可以使用槽的内容更新状态,而不会丢失任何更改。所以步骤是:
CREATE_REPLICATION_SLOT
SET TRANSACTION SNAPSHOT
psql "dbname=yourdatabasename replication=database"
字符串
CREATE_REPLICATION_SLOT slot_name LOGICAL pgoutput;
型
pg_dump --snapshot=snapshotname [...]
wfypjpf42#
试试这个方法:
BEGIN TRANSACTION REPEATABE READ;
字符串要创建逻辑复制插槽,请使用pg_export_snapshot()在另一个会话中-启动pg_dump with --snapshot=<snapshot_id>。(不确定-你应该等到pg_dump结束),然后,
pg_export_snapshot()
pg_dump with --snapshot=<snapshot_id>
COMMIT;
型然后转储和插槽将位于同一个LSN,您可以订阅它。标签:https://www.percona.com/blog/how-to-convert-postgresql-streaming-replication-to-logical-replication/
2条答案
按热度按时间idfiyjo81#
文档给了你一个提示:
使用流式复制接口创建新的复制插槽时(请参见
CREATE_REPLICATION_SLOT
),将导出快照(见第9.27.5节),这将准确显示数据库的状态,之后所有更改都将包含在更改流中。这可以用于创建新的副本,方法是使用SET TRANSACTION SNAPSHOT
读取创建插槽时的数据库状态。这事务可以用来转储数据库在该时间点的状态,之后可以使用槽的内容更新状态,而不会丢失任何更改。所以步骤是:
字符串
型
型
wfypjpf42#
试试这个方法:
字符串
要创建逻辑复制插槽,请使用
pg_export_snapshot()
在另一个会话中-启动
pg_dump with --snapshot=<snapshot_id>
。(不确定-你应该等到pg_dump结束),然后,型
然后转储和插槽将位于同一个LSN,您可以订阅它。
标签:https://www.percona.com/blog/how-to-convert-postgresql-streaming-replication-to-logical-replication/