一、变更内容
变更背景: 逻辑复制异常导致数据丢失,需重建表后全量同步数据
变更环境:PRD
影响范围:xxx的财务
变更类型:低风险
涉及系统等级:S级
变更负责人:xxx
变更复核人:xxx
变更内容:prime上重建4张表,然后逻辑复制全量同步
变更验收标准:与coupon中数据一致
二、变更文档
前置工作
- 四张表
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
-
coupon上删除对应的发布
# 发布信息查看
SELECT pubname, pubowner, puballtables, pubinsert,pubupdate,pubdelete FROM pg_publication where pubname='coupon_pub_01';
# 删除现有的发布
DROP PUBLICATION coupon_pub_01;
-
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. ### 等待数据同步
-
比对两端的数据量
#
# 开发找到一条数据 缺失 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
-
从库 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. ### 完成