将表添加到发布并刷新订阅(REFRESH PUBLICATION)
PostgreSQL逻辑复制命令
-- Publisher:
ALTER PUBLICATION pub_app ADD TABLE orders;
-- PG15+: all tables in a schema: ALTER PUBLICATION pub_app ADD TABLES IN SCHEMA app_schema;
SELECT pubname, schemaname, tablename FROM pg_publication_tables WHERE pubname = 'pub_app';
-- Subscriber (the table structure must already exist):
ALTER SUBSCRIPTION sub_app REFRESH PUBLICATION WITH (copy_data = true);
SELECT srrelid::regclass AS table_name, srsubstate FROM pg_subscription_rel ORDER BY 1;作用
在发布端将新表添加到发布;在订阅端,REFRESH PUBLICATION 将新表纳入订阅,并以 copy_data = true 启动初始复制(tablesync)。srsubstate:i = init,d = data copy,f = copy finished,s = synchronized,r = ready。
适用场景
当向正在运行的逻辑复制中添加新表,或从发布中移除表时。
注意
即使是 FOR ALL TABLES 或 TABLES IN SCHEMA 发布,订阅端在运行 REFRESH 之前也不会接收新表。如果订阅端不存在该表,REFRESH 会失败;DDL 不会被复制。如果被发布的表没有 PRIMARY KEY 或 REPLICA IDENTITY,UPDATE/DELETE 在发布端会失败。大表的初始复制会在发布端长时间占用一个复制槽和快照。