PG prime逻辑复制重建

70 阅读5分钟

一、变更内容

变更背景: 逻辑复制异常导致数据丢失,需重建表后全量同步数据

变更环境:PRD

影响范围:xxx的财务

变更类型:低风险

涉及系统等级:S级

变更负责人:xxx

变更复核人:xxx

变更内容:prime上重建4张表,然后逻辑复制全量同步

变更验收标准:与coupon中数据一致




二、变更文档

前置工作

  1. 四张表
coupon从库 172.21.13.109 的coupon库下的t_coupon_profile_info 表
prime主库172.21.13.101的, coupon库下的t_coupon_profile_info表



coupon是 sox, prime非sox。 
发布端在coupon,订阅端是prime的主库172.21.13.101


# coupon库下的4张表
t_coupon_profile_info
t_coupon_activity_info
t_coupon_account_destroy
t_coupon_account_revoke

2. coupon上的发布信息

# 查看发布信息
SELECT pubname, pubowner, puballtables, pubinsert,pubupdate,pubdelete FROM pg_publication where pubname='coupon_pub_01';
    pubname    | pubowner | puballtables | pubinsert | pubupdate | pubdelete 
---------------+----------+--------------+-----------+-----------+-----------
 coupon_pub_01 |       10 | f            | t         | t         | t
(1 row)



# 发布中包含的表
SELECT pubname, schemaname, tablename FROM pg_publication_tables WHERE pubname = 'coupon_pub_01';
    pubname    | schemaname |        tablename         
---------------+------------+--------------------------
 coupon_pub_01 | public     | t_coupon_profile_info
 coupon_pub_01 | public     | t_coupon_activity_info
 coupon_pub_01 | public     | t_coupon_account_destroy
 coupon_pub_01 | public     | t_coupon_account_revoke
(4 rows)

3. prime上的订阅信息

# 
coupon=# select * from pg_subscription;                                                                                                                          
-[ RECORD 1 ]---+------------------------------------------------------------------------------                                                                  
subdbid         | 16408                                                                                                                                          
subname         | prime_sub_01                                                                                                                                   
subowner        | 10                                                                                                                                             
subenabled      | t                                                                                                                                              
subconninfo     | host=172.21.13.51 port=1921 dbname=coupon user=prime_logical password=Yumc123                                                                  
subslotname     | prime_sub_01                                                                                                                                   
subsynccommit   | off                                                                                                                                            
subpublications | {coupon_pub_01}                                                                                                                                

4. 从coupon上备份4张表的表结构

# 使用pg_dump
# 一次导出多张表,只要表结构
pg_dump -h 127.0.0.1 -p 1921 -U postgres -d coupon -s -t t_coupon_profile_info -t t_coupon_activity_info -t t_coupon_account_destroy -t t_coupon_account_revoke  -f coupon_pub_01.sql

5. prime中备份原先的四张表

# rename 表名作为备份
alter table t_coupon_profile_info rename to t_coupon_profile_info0520bak;
alter table t_coupon_activity_info rename to t_coupon_activity_info0520bak;
alter table t_coupon_account_destroy rename to t_coupon_account_destroy0520bak;
alter table t_coupon_account_revoke rename to t_coupon_account_revoke0520bak;

详细操作WBS

  1. coupon上删除对应的发布

# 发布信息查看
SELECT pubname, pubowner, puballtables, pubinsert,pubupdate,pubdelete FROM pg_publication where pubname='coupon_pub_01';



# 删除现有的发布
DROP PUBLICATION coupon_pub_01;

  1. prime上删除对应的订阅

# 检查订阅
SELECT * FROM pg_stat_subscription WHERE subname = 'prime_sub_01';


# 
DROP SUBSCRIPTION IF EXISTS prime_sub_01;

3. ### 将coupon上的sql文件在prime上执行,创建表结构

# 在prime主库上执行 
# 导入数据 
psql -h 127.0.0.1 -U postgres -p 1921 -d coupon -f coupon_pub_01.sql

4. ### coupon上重建发布

# 重建发布
CREATE PUBLICATION coupon_pub_01 
FOR TABLE public.t_coupon_profile_info, 
         public.t_coupon_activity_info, 
         public.t_coupon_account_destroy, 
         public.t_coupon_account_revoke
WITH (publish = 'insert, update, delete');

5. ### 观察发布

# 验证发布信息
SELECT pubname, pubowner, puballtables, pubinsert, pubupdate, pubdelete FROM pg_publication;

6. ### prime上重建订阅

# 
CREATE SUBSCRIPTION prime_sub_01
  CONNECTION 'host=172.21.13.51 port=1921 dbname=coupon user=prime_logical password=Yumc123'
  PUBLICATION coupon_pub_01
  WITH (
    create_slot = true,
    enabled = true
  );

# 
# 查看订阅的配置信息
select * from pg_subscription;
# 检查订阅
SELECT * FROM pg_stat_subscription WHERE subname = 'prime_sub_01';

7. ### 观察订阅

#
# 检查订阅的实时状态信息
SELECT * FROM pg_stat_subscription;

# 查看订阅的配置信息
select * from pg_subscription;

8. ### 等待数据同步

  1. 比对两端的数据量

# 
# 开发找到一条数据 缺失 534815 
select id, activityid, brandname from t_coupon_profile_info where id='534815' limit 10;


# 在coupon 和 prime中查询 行数,发现 prime 库中的表 少了749 行数据
select count(1) from t_coupon_profile_info;




# 比对行数
select count(1) from t_coupon_profile_info;
select count(1) from t_coupon_activity_info;
select count(1) from t_coupon_account_destroy;
select count(1) from t_coupon_account_revoke;

10. ### prime的2个从库开启标准大页

# 
172.25.113.102
172.25.113.61


# pg.conf 文件中增加
huge_pages = on


# 检查Hugepagesize 大小
# 207904072 /2048 大约是101515.66,因此在这个示例中你至少需要 101516个大页面 207904072kb比buffer pool大一点点就行
grep HugePages /proc/meminfo

# 增加
 vi /etc/sysctl.conf
 vm.nr_hugepages=101516
 
 
  1. 从库 172.25.113.61 开启标准大页

# pg.conf 文件中增加
huge_pages = on


# 检查Hugepagesize 大小
# 207904072 /2048 大约是101515.66,因此在这个示例中你至少需要 101516个大页面 207904072kb比buffer pool大一点点就行
grep ^Hugepagesize /proc/meminfo

# 增加
# vi /etc/sysctl.conf
# vm.nr_hugepages=101516

# 配置标准大页
grubby --update-kernel=ALL --args="default_hugepagesz=1G hugepagesz=1G hugepages=200"
 
# ### 
# 验证
# 检查大页是否生效
grep HugePages /proc/meminfo

# 检查好hugepages
show huge_pages;

12. ### 关闭172.25.113.61的透明大页

# 检查
cat /sys/kernel/mm/transparent_hugepage/defrag
cat /sys/kernel/mm/transparent_hugepage/enabled

# 关闭透明大页
grubby --update-kernel=ALL --args="transparent_hugepage=never"

# 记得注释 /etc/sysctl.conf 中的参数 vm.nr_hugepages=101516

13. ### 重启 172.25.113.61 的OS和PG

# 
reboot

# 
pg_ctl restart -m fast

14. ### 验证大页

# ### 
# 验证
# 检查大页是否生效
grep HugePages /proc/meminfo

# 检查好hugepages
show huge_pages;

15. ### 从库 172.25.113.102 开启标准大页

# pg.conf 文件中增加
huge_pages = on


# 检查Hugepagesize 大小
# 207904072 /2048 大约是101515.66,因此在这个示例中你至少需要 101516个大页面 207904072kb比buffer pool大一点点就行
grep HugePages /proc/meminfo

# 增加
# vi /etc/sysctl.conf
# vm.nr_hugepages=101516
 
 # 配置标准大页
grubby --update-kernel=ALL --args="default_hugepagesz=1G hugepagesz=1G hugepages=200"
 
# ### 
# 验证
# 检查大页是否生效
grep HugePages /proc/meminfo

# 检查好hugepages
show huge_pages;

16. ### 关闭 172.25.113.102 透明大页

# 检查
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag



# 关闭透明大页
grubby --update-kernel=ALL --args="transparent_hugepage=never"
# echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled


# 记得注释 /etc/sysctl.conf 中的参数 vm.nr_hugepages=101516

17. ### 重启172.25.113.102的OS和PG

# 
reboot

# 
pg_ctl restart -m fast

18. ### 验证大页

# ### 
# 验证
# 检查大页是否生效
grep HugePages /proc/meminfo

# 检查好hugepages
show huge_pages;

19. ### 完成

预案手册

灰度方案

回退方案




三、变更记录

变更执行记录

双岗复核记录

验证记录