暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pglogical 2 实现PG数据库跨大版本同步模式、表结构和表数据

PostgreSQL数据库工作学习随笔 2022-03-26
1409

    在pglogical 2 支持DDL同步的逻辑复制中介绍了如何配置简单的逻辑复制和实现DDL同步。今天继续介绍pglogical 2另一个功能,将指定数据库中的模式(一个或多个)、表结构和表数据如何同步到订阅者,这个功能对跨版本升级简直就是神器。

    首先我们要介绍一下synchronize_structure参数,该参数指定是否将模式和表结构从提供者同步到订阅者,默认 false,如果参数改为true,要确保订阅者中不能有提供者数据库中的任何数据库对象信息,下面进行具体操作

订阅节点

首先创建数据库pglog_database:

    [pg12@k8s1 ~]$ psql -h 127.0.0.1
    psql (12.6)
    Type "help" for help.

    postgres=# create database pglog_database;
    CREATE DATABASE
    postgres=# \q
    [pg12@k8s1 ~]$ 

        在pglog_database数据库中创建public.test表、pglog_schema模式、和pglog_schema.test表并写入数据。

      postgres=# create database pglog_database;
      CREATE DATABASE
      postgres=# \q
      [pg12@k8s1 ~]$ psql -h 127.0.0.1 -d pglog_database
      psql (12.6)
      Type "help" for help.

      pglog_database=# create table test(id int primary key);
      CREATE TABLE
      pglog_database=# insert into test values(1);
      INSERT 0 1
      pglog_database=# create schema pglog_schema;
      CREATE SCHEMA
      pglog_database=# set search_path = pglog_schema ;
      SET
      pglog_database=# create table test(id int primary key,name varchar);
      CREATE TABLE
      pglog_database=# insert into test values (1,'tom');
      INSERT 0 1
      pglog_database=#

      创建pglogical扩展和提供节点、复制集(两个模式public和pglog_schema):

        [pg12@k8s1 ~]$ psql -h 127.0.0.1 -d pglog_database
        psql (12.6)
        Type "help" for help.

        pglog_database=# create extension pglogical;
        CREATE EXTENSION
        pglog_database=# select pglogical.create_node(node_name := 'provider1',dsn := 'host=10.110.13.101 port=11016 dbname=pglog_database');
        create_node
        -------------
        2976894835
        (1 row)

        pglog_database=# select pglogical.replication_set_add_all_tables('default',ARRAY['public','pglog_schema']);
        replication_set_add_all_tables
        --------------------------------
        t
        (1 row)

        pglog_database=#

        订阅节点

        创建数据库pglog_database和pglogical扩展:

          postgres=# create database pglog_database;
          CREATE DATABASE
          postgres=# \q
          [pg12@k8s2 pgdata]$ psql -h 127.0.0.1 pglog_database
          psql (12.6)
          Type "help" for help.

          pglog_database=# create extension pglogical;
          CREATE EXTENSION
          pglog_database=#

          创建订阅节点和订阅:

            pglog_database=# select pglogical.create_node(node_name := 'subscriber1', dsn := 'host=10.110.13.102 port=11016 dbname=pglog_database');
            create_node
            -------------
            330520249
            (1 row)

            pglog_database=# select pglogical.create_subscription(subscription_name := 'subscription1',synchronize_structure := true,provider_dsn := 'host=10.110.13.101 port=11016 dbname=pglog_database');
            create_subscription
            ---------------------
            1763399739
            (1 row)

            pglog_database=# select pglogical.show_subscription_status();
            show_subscription_stat
            us
            -----------------------------------------------------------------------------------------------------
            ---------------------------------------------------------------------------------
            (subscription1,replicating,provider1,"host=10.110.13.101 port=11016 dbname=pglog_database",pgl_pglog
            _database_provider1_subscription1,"{default,default_insert_only,ddl_sql}",{all})
            (1 row)

            pglog_database=#

            查看订阅节点,,表结构、模式和表数据均已同步到订阅节点:

              pglog_database=# \dt
              List of relations
              Schema | Name | Type | Owner
              --------+------+-------+-------
              public | test | table | pg12
              (1 row)

              pglog_database=# set search_path = pglog_schema ;
              SET
              pglog_database=# \dt
              List of relations
              Schema | Name | Type | Owner
              --------------+------+-------+-------
              pglog_schema | test | table | pg12
              (1 row)

              pglog_database=# select * from test;
              id | name
              ----+------
              1 | tom
              (1 row)

              pglog_database=#

              测试

              在提供者节点添加数据,然后到订阅节点查看:

                pglog_database=# set search_path = pglog_schema ;                                                    SET
                pglog_database=# insert into test values(2,'lucy');
                INSERT 0 1
                pglog_database=#

                  pglog_database=# select pglogical.show_subscription_status();
                  show_subscription_stat
                  us
                  -----------------------------------------------------------------------------------------------------
                  ---------------------------------------------------------------------------------
                  (subscription1,replicating,provider1,"host=10.110.13.101 port=11016 dbname=pglog_database",pgl_pglog
                  _database_provider1_subscription1,"{default,default_insert_only,ddl_sql}",{all})
                  (1 row)
                  pglog_database=# set search_path = pglog_schema ;
                  SET
                  pglog_database=# select * from test;
                  id | name
                  ----+------
                  1 | tom
                  2 | lucy
                  (2 rows)

                  pglog_database=#

                  可以看到订阅节点数据已同步。

                      需要注意的是,模式和表结构只在创建订阅者时同步一次,如果需要订阅后同步DDL,仍须使用replicate_ddl_command函数。

                  文章转载自PostgreSQL数据库工作学习随笔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论