PG数据库恢复指定错误备份文件时怎么解决

项目场景:

测试环境中对分库分表PG库的同步数据/表结构等操作。

问题描述:

当我们在给分库分表执行备份恢复时,把不是本分片库的备份文件导入至本分片库,导致数据错乱。

比如我们将一个8分库(0-7)的备份文件命名为dump_0.ddl dump_1.ddl … dump_7.ddl,在恢复过程中,我们在7号库(0-7)中,却使用了dump_6.ddl的备份文件,导致7号库数据恢复成6号库的。

原因分析:

手误/手残/摸鱼/粗心/马虎 皆可导致该问题。

解决方案:

我们在发现问题时可能已经滞后很长时间了,可能已经忘了,我们需要再次登入分片库的某片库。

利用命令查看当时备份的schema:

db_alphapay_test=# \dn
List of schemas
Name | Owner
--------------------------+--------------------------
db_alphapay_test | db_alphapay_test
public | postgres
topology | postgres

(3 rows)

利用命令查找并列出该schema需要删除的表:

db_alphapay_test=# select 'drop table '|| tablename || ' ;' from pg_tables where schemaname = 'db_alphapay_test';
					?column?
----------------------------------------------------------
drop table t_alphapay_trade_no_101 ;
drop table t_alphapay_trade_no_132 ;
drop table t_alphapay_trade_no_21 ;
drop table t_alphapay_trade_no_229 ;
drop table t_alphapay_trade_no_28 ;
drop table t_alphapay_combined_108 ;
drop table t_alphapay_combined_12 ;
drop table t_alphapay_combined_116 ;
drop table t_alphapay_combined_124 ;

...
...

到这里我们其实可以将相关表删除,然后重新恢复正确的数据,但是本着学习态度,接下来我们继续找到我们当时误操作时,恢复的是哪片库的数据。

利用分库分表规则可以查出备份的是哪个分片的

规则:根据user_id%1024或者其他字段对数字进行取模。

在M个分库中创建多个按照一定规则区分的表,如t_test_table_0,t_test_table_1,t_test_table_2..............t_test_table_n(如分1024张表,n为1023,分表从0开始的)

但是每个分库只存在n+1/M张表,0号库中的表为t_test_table_0,t_test_table_0+M,t_test_table_0+2M,t_test_table_0+3M...

1号库的表为:t_test_table_1,t_test_table_1+M,t_test_table_1+2M,t_test_table_1+3M...

所以,在7号分片库可以利用命令:

db_alphapay_test=# \dt+ t_alphapay_order_6
Did not find any relation named "t_alphapay_order_6".

查看是不是恢复了6号的数据,查5号,就把t_alphapay_order_6换成t_alphapay_order_5即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值