项目场景:
测试环境中对分库分表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
即可。