使用逻辑复制将数据复制到另一个 Postgres 数据库
对于本示例,您需要
- 一个 Supabase 项目
- 一个 Postgres 数据库(运行 v10 或更高版本)
您将在这两个数据库上运行命令,以将更改从 Supabase 数据库发布到外部数据库。
- 在 Supabase 数据库上创建一个
publication
1CREATE PUBLICATION example_pub;- 同样在 Supabase 数据库上,创建一个
replication slot
1select pg_create_logical_replication_slot('example_slot', 'pgoutput');- 现在连接到您的 外部数据库并订阅
publication
这需要一个 直接连接(不是连接池)到您的数据库,您可以在 Direct connection 部分的 Connect 面板中找到连接信息。
您还需要确保您的复制目标支持 IPv6(或者您可以启用 IPv4 插件)
如果您不想使用 postgres 用户,则可以使用 postgres 用户运行 CREATE ROLE <user> WITH REPLICATION;。
1CREATE SUBSCRIPTION example_sub2CONNECTION 'host=db.oaguxblfdassqxvvwtfe.supabase.co user=postgres password=YOUR_PASS dbname=postgres'3PUBLICATION example_pub4WITH (copy_data = true, create_slot=false, slot_name=example_slot);对于运行 Postgres 17+ 的项目,可以使用您的只读副本的连接字符串订阅 只读副本。
由于提供了 slot_name 并且插槽已经在步骤 2 中创建,因此 create_slot 设置为 false。要复制插槽创建之前的数据,请将 copy_data 设置为 true。
- 现在我们将返回 Supabase 数据库,并将您想要复制的所有表添加到 publication 中。
1ALTER PUBLICATION example_pub ADD TABLE example_table;- 使用
pg_stat_replication检查复制状态
1select * from pg_stat_replication;您可以将更多表添加到初始 publication,但您需要在订阅数据库上执行 REFRESH。请参阅 https://postgresql.ac.cn/docs/current/sql-alterpublication.html