MySQL复制出错Last_SQL_Errno:1146的解决⽅法
背景:我们在做数据迁移或者拆分的时候,使⽤Tablespace transcation 这种解决⽅案时,很有可能就会遇到从库复制出错,报: Last_SQL_Errno: 1146
那么具体错误内容可能会有如下:
Last_SQL_Error: Error 'Table 'spider.tb_city_population_rank' doesn't exist' on query. Default database: 'spider'. Query: 'alter table tb_city_population_rank discard tablespace'
Last_SQL_Error: Error 'Table 'spider.tb_city_population_rank' doesn't exist' on query. Default database: 'spider'. Query: 'alter table tb_city_population_rank import tablespace'
那么我们遇到这样的问题的时候该如何恰当的处理呢?考虑如下⼏点:
1. 我们整个库的容量有多⼤?
2. 业务容忍的最⼤延迟时间多久?
3. 我们恢复需要多久?恢复的难易程度如何?
通过考虑到以上⼏点,我们就可以根据实际情况做出抉择,采⽤什么样的办法尽快的恢复从库;对于这样的问题,简单粗暴的⽅案就是重建从库,当然还有别的办法,且听我慢慢道来:
⾸先我们先看看我们是如何通过Transport tablespace 迁移数据的,⼤概步骤如下:
1.库A执⾏: show create table xxx1; 拿到简表语句;
2.库B执⾏: create table xxx1; 在从库上建⽴基本的表结构;
3.库B执⾏: alter table xxx1 discard tablespace; 让mysql⾃⼰删掉ibd⽂件;
4.库A执⾏: flush tables xxxx1,xxxx2 for export;把内存的脏数据刷到磁盘,使得ibd⽂件数据⼀致;
5.库A执⾏: scp xxxx1.ibd xxx2.ibd xxxx1.cfg xxx2.cfg slave_host:/data/ 把ibd⽂件拷贝到从库;
6.库B执⾏: alter table xxx1 import tablespace 导⼊数据⽂件。
好了我们知道了整个迁移的具体步骤,那么我们就可以轻松的应对在迁移过程中复制出错的问题了。
那么我们⾸先来看⼀下:
Last_SQL_Errno: 1146
Last_SQL_Error: Error 'Table 'spider.tb_city_population_rank' doesn't exist' on query. Default database: 'spider'. Query: 'alter table tb_city_population_rank discard tablespace'
其⼤概的意思就是我们在从库上没有到这个表的完整定义信息,观察⼀下磁盘上的⽂件我们就明⽩了:
[root@GZ_NF_DB_RP_002 spider]# ls -lhrt |grep tb_city_population_rank
-rw-r----- 1 mysql mysql 8.3G Mar 31 20:03 tb_city_population_rank.ibd
果然没有这个表的 frm ⽂件,那么怎么办呢?由于是 slave 的sql_thread 线程报错,那么我们可采取取巧的办法:
⽤超级⽤户登录从库,先备份⼀下这个ibd ⽂件:[root@GZ_NF_DB_RP_002 spider]# mv tb_city_population_rank.ibd
tb_city_population_rank.ibd.bak
然后拿到这个⽂件的表结构,在从库上执⾏建表语句,这样⼀样来,我们从库就有了 ibd frm ⽂件,那么此时我们开启slave sql_thread,这时就会执⾏时主库传过来的语句:
alter table tb_city_population_rank discard tablespace ; 那么当我们再⼀次的观看此盘数据⽂件的时候,ibd ⽂件⼜不见了,此时slave 也就已经出错了,其错误信息如下:
Last_SQL_Errno: 1146
spider什么意思Last_SQL_Error: Error 'Table 'spider.tb_city_population_rank' doesn't exist' on query. Default database: 'spider'. Query: 'alter table tb_city_population_rank import tablespace'
那么我们此时需要做的就是:把刚才mv 的⽂件再 mv 回去,也就是说:[root@GZ_NF_DB_RP_002 spider]# mv
tb_city_population_rank.ibd.bak tb_city_population_rank.ibd ;完成这个命令后我们再执⾏ start slave sql_thread ; 此时这个表就正常了,我们可以执⾏select * from tb_city_population_rank limit 100; 来验证⼀下是否可读。
那么此时,我们算完整的解决了因⼀个表导致的复制出错的问题,那么如果迁移了多张表(经常是),那么我们就可以按照这个解决⽅案,⼀步⼀步的来解决复制出错。其⼤概的思路就是,缺什么我们补什么,多了什么我们去掉什么。
下⾯是其它⽹友的补充,根据返回的错误信息进⾏调整即可。
mysql 主主复制(双主复制)报错Last_SQL_Errno: 1146
错误信息:
复制代码代码如下:
Last_Errno: 1146
Last_Error: Error 'Table 'test.user' doesn't exist' on query. Default database: 'test'. Query: 'insert into user values(20,'在库')'
解决⽅法:
mysql> set global sql_slave_skip_counter=20;
mysql> STOP SLAVE;
mysql> START SLAVE;
问题解决
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论