postgresql版本升级方式:利用逻辑复制

本文详细介绍了如何从PostgreSQL 10数据库升级到11.5版本,包括修改数据库参数、导出表结构、检查并处理无主键表、创建新数据库、设置发布与订阅、监控复制状态以及数据迁移后的清理工作。过程中强调了逻辑复制的注意事项,如版本要求、表主键需求等。

数据库版本pg10升级到pg11.5

1.修改旧版本数据库的参数(需要重启数据库)

wal_level = logical  
​
max_replication_slots = 8   
​
max_wal_senders = 10 

2.导出旧版本的表结构

pg_dump -d test -s >/data/test.sql

3.查询迁移的数据库中没有主键的表

--检查同步的数据库是否有主键(pg10及以下版本)
​
SELECT nspname || '.' ||relname,relhaspkey FROM pg_catalog.pg_namespace,pg_class WHERE nspname !~ '^pg_' AND nspname not in('information_schema','pglogical') and pg_class.relnamespace = pg_catalog.pg_namespace.oid and relkind = 'r' and relhaspkey=false;
​

--检查同步的数据库是否有主键(pg11及以上版本)
​
SELECT n.nspname AS "Schema",c.relname AS "Table Name"
​
FROM
​
pg_catalog.pg_class c,
​
pg_namespace n
​
where 
​
c.relnamespace = n.oid
​
AND n.nspname NOT IN ('information_schema', 'pg_catalog')
​
AND c.relkind='r'
​
AND not exists (select 1 from pg_index i where c.oid=i.indrelid and i.indisprimary='t' ) ;

4.将没有主键的表增加REPLICA IDENTITY FULL

ALTER TABLE     rdl_bmc_r03_parts_inhouse    REPLICA IDENTITY FULL;

3.在新版本创建数据库,并导入表结构

postgres=# create database test;
​
psql -d test -f /data/test.sql

4.旧版本数据库为发布端,新版本数据库为订阅端

发布节点上创建逻辑复制用户,逻辑复制用户需要具备REPLICATION权限,并赋权

test=# CREATE USER logical_user  REPLICATION LOGIN  CONNECTION LIMIT 8 ENCRYPTED PASSWORD 'logical_user';
test=# GRANT USAGE ON SCHEMA public TO logical_user;
test=# GRANT SELECT ON all tables IN SCHEMA public TO logical_user;

5.发布节点创建发布

test=# CREATE PUBLICATION pub1 FOR ALL TABLES ;
​
CREATE PUBLICATION

FOR TABLE:指加入到发布的表列表,目前仅支持普通表的发布,临时表、外部表、视图、物化视图、分区表暂不支持发布,如果想将分区表添加到发布中,需逐个添加分区表分区到发布。

FOR ALL TABLES:将当前库中所有表添加到发布中,包括以后在这个库中新建的表。这种模式相当于在全库级别逻辑复制所有表。

6.发布节点上查询pg_publication视图

test=# SELECT * FROM pg_publication;
​
•    pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete 
​
------------+----------+--------------+-----------+-----------+-----------
​
•    pub1    |    16391 | f            | t         | t         | t
​
(1 row)

7.订阅端发布订阅(新版本数据库)

test=# CREATE SUBSCRIPTION sub1 CONNECTION 'host=10.122.111.171 port=5432
​
•        dbname=upsell_prd user=logical_user' PUBLICATION pub1;

8.发布节点查看复制槽

test=#  SELECT slot_name,plugin,slot_type,database,active,restart_lsn 
test-#         FROM pg_replication_slots where slot_name='sub1';
 slot_name |  plugin  | slot_type |  database  | active |  restart_lsn  
-----------+----------+-----------+------------+--------+---------------
 sub1      | pgoutput | logical   | test | t      | 2198/8CF3CE60
(1 row)

9.订阅端查看订阅信息

test=# select * from pg_stat_subscription;
 subid | subname |  pid  | relid | received_lsn  |      last_msg_send_time       |     last_msg_receipt_time     | latest_end_lsn |        latest_end_time        
-------+---------+-------+-------+---------------+-------------------------------+-------------------------------+----------------+-------------------------------
 19658 | sub1    |  4404 | 16656 |               | 2021-10-20 17:25:27.926446+08 | 2021-10-20 17:25:27.926446+08 |                | 2021-10-20 17:25:27.926446+08
 19658 | sub1    |  5573 | 19427 |               | 2021-10-20 17:32:33.014151+08 | 2021-10-20 17:32:33.014151+08 |                | 2021-10-20 17:32:33.014151+08
 19658 | sub1    | 25118 |       | 2198/8CF3CE98 | 2021-10-20 17:32:33.035482+08 | 2021-10-20 17:32:33.035666+08 | 2198/8CF3CE98  | 2021-10-20 17:32:33.035482+08

10.订阅端查看当前的数据位置

test=# select * from pg_replication_origin_status;
 local_id | external_id | remote_lsn |  local_lsn  
----------+-------------+------------+-------------
        1 | pg_19658    | 0/0        | 21/983EF8C8
(1 row)

11.数据迁移完成后,删除发布、订阅

test=# drop PUBLICATION pub1;
​
test=# drop SUBSCRIPTION sub1;

12.注意事项

1)利用逻辑复制建议pg版本要大于等于10

2)表需要有主键,没有主键需要增加REPLICA IDENTITY FULL

3)不支持 DDL 和数据库 Schema 的复制不支持

4)不支持 Sequence data(serial or identity columns)

5)不支持 TRUNCATE 操作

6)不支持 Large objects

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值