91 lines
2.5 KiB
SQL
91 lines
2.5 KiB
SQL
-- =========================================
|
|
-- schema_pglogical_region.sql
|
|
-- pglogical configuration template for regional nodes
|
|
-- PostgreSQL 16+, 双向复制 (provider + subscriber)
|
|
-- 在运行本脚本前,请确保已执行 schema.sql 与 schema_pglogical_patch.sql。
|
|
-- =========================================
|
|
|
|
\if :{?NODE_NAME}
|
|
\else
|
|
\echo 'ERROR: 未设置 NODE_NAME 变量。请通过 -v NODE_NAME=... 传入节点名称。'
|
|
\quit 1
|
|
\endif
|
|
|
|
\if :{?NODE_DSN}
|
|
\else
|
|
\echo 'ERROR: 未设置 NODE_DSN 变量。请通过 -v NODE_DSN=... 传入当前节点 DSN。'
|
|
\quit 1
|
|
\endif
|
|
|
|
\if :{?SUBSCRIPTION_NAME}
|
|
\else
|
|
\echo 'ERROR: 未设置 SUBSCRIPTION_NAME 变量。请通过 -v SUBSCRIPTION_NAME=... 传入订阅名称。'
|
|
\quit 1
|
|
\endif
|
|
|
|
\if :{?PROVIDER_DSN}
|
|
\else
|
|
\echo 'ERROR: 未设置 PROVIDER_DSN 变量。请通过 -v PROVIDER_DSN=... 传入 Provider DSN。'
|
|
\quit 1
|
|
\endif
|
|
|
|
-- 🏗️ 确保 pglogical schema 及扩展存在
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_namespace WHERE nspname = 'pglogical'
|
|
) THEN
|
|
EXECUTE format('CREATE SCHEMA pglogical AUTHORIZATION %I', current_user);
|
|
END IF;
|
|
END;
|
|
$$;
|
|
|
|
CREATE EXTENSION IF NOT EXISTS pglogical WITH SCHEMA pglogical;
|
|
|
|
-- 🧭 清理旧节点(可安全重入)
|
|
DO $$
|
|
BEGIN
|
|
PERFORM pglogical.drop_subscription(:'SUBSCRIPTION_NAME', true);
|
|
EXCEPTION WHEN others THEN NULL;
|
|
END $$;
|
|
|
|
DO $$
|
|
BEGIN
|
|
PERFORM pglogical.drop_node(:'NODE_NAME');
|
|
EXCEPTION WHEN others THEN NULL;
|
|
END $$;
|
|
|
|
-- =========================================
|
|
-- 创建本节点 (Provider)
|
|
-- =========================================
|
|
SELECT pglogical.create_node(
|
|
node_name := :'NODE_NAME',
|
|
dsn := :'NODE_DSN'
|
|
);
|
|
|
|
-- =========================================
|
|
-- 定义复制集
|
|
-- =========================================
|
|
SELECT pglogical.create_replication_set('rep_all');
|
|
SELECT pglogical.replication_set_add_all_tables('rep_all', ARRAY['public']);
|
|
|
|
-- =========================================
|
|
-- 创建订阅 (订阅远端节点)
|
|
-- =========================================
|
|
SELECT pglogical.create_subscription(
|
|
subscription_name := :'SUBSCRIPTION_NAME',
|
|
provider_dsn := :'PROVIDER_DSN',
|
|
replication_sets := ARRAY['rep_all'],
|
|
synchronize_structure := false,
|
|
synchronize_data := true,
|
|
forward_origins := '{}'
|
|
);
|
|
|
|
-- =========================================
|
|
-- 验证状态
|
|
-- =========================================
|
|
-- 运行以下命令检查同步是否正常:
|
|
-- SELECT * FROM pglogical.show_subscription_status();
|
|
-- 若 status = 'replicating' 表示复制成功。
|
|
-- =========================================
|