解决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‘

其大概的意思就是我们在从库上没有找到 这个表的完整定义信息,观察一下磁盘上的文件我们就明白了:

[[email protected]_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 文件:[[email protected]_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
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 回去, 也就是说:[[email protected]_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; 来验证一下是否可读。

那么此时,我们算完整的解决了因一个表导致的复制出错的问题, 那么如果迁移了多张表(经常是)  , 那么我们就可以按照这个解决方案,一步一步的来解决复制出错。其大概的思路就是, 缺什么我们补什么,多了什么我们去掉什么。

时间: 2024-11-23 22:27:11

解决MySQL复制出错 Last_SQL_Errno:1146的相关文章

解决Mysql复制Relay log read failure 的问题

一.问题描述 Mysql主从复制模式中,slave上报错 "relay log read failure",导致主从同步停止. mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Master_Host: 10.0.0.93 Master_User: slaveuser Master_Port: 3306 Connect_

解决MySQL Replication出错一例

os: redhat as4master: MySQL 4.0.23slave : MySQL 5.0.37 slave日志中报错信息如下: 060807 11:40:17 [ERROR] While trying to obtain the list of slaves from the master 'xxx.xxx.xxx:3306', user 'rep' got the following error: 'Access denied. You need the REPLICATION

MySQL主从复制出错的解决方法

MySQL主从复制出错的解决方法 主从复制中若是出现错误可以通过几个方法来进行解决 1.如果主从复制时发生了主键冲突,从而阻止了主从复制,可以使用sql_slave_skip_counter这个变量来忽略错误将其排除 2.如果发生了较大的错误,可以考虑使用reset slave的方法重新配置从服务器来恢复错误 以下演示如何使用这两种方法解决错误,及相关操作的详细说明 reset slave的使用方法 环境准备搭建主从同步 主节点配置 1.修改配置文件 [[email protected] ~]#

General MYSQL 复制.frm数据库文件后查看表提示表不存在 Error code: 1146

现象: 将含.frm的源数据库文件夹复制到另一Mysql环境下后,打开Mysql,查看数据库和表都无问题,但在打开数据表查看表结构和表数据时提示error code: 1146,要访问的数据表"doesn't exist" 解决: 除了复制.frm的源数据库文件夹外,还需停止mysql服务(无论是拷贝源还是拷贝目的地,mysql服务最好都停掉),然后再复制与源数据库文件夹同目录下的以下3个文件粘贴或覆盖到目的文件中,然后再启动Mysql服务即可. 拷贝以上3个文件需以停止Mysql服务

解决mysql在ubuntu安装出错

[email protected]:~# apt-get install mysql-server Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: libjpeg-turbo8 libjpeg8 libxslt

导出Mysql数据库出错:Got error: 145: Table 'wp_options' is marked as crashed and should be repaired when using LOCK TABLES的解决方法

mysqldump: Got error: 145: Table 'wp_options' is marked as crashed and should be repaired when using LOCK TABLES 错误如上所示. 今天在给自己的wp网站搬家的时候,导出数据时发现导不出来,报了如上的错误,在网上找了一下资料,说是这张张被标记有问题,需要优化.参考: http://www.cnblogs.com/hakuci/archive/2012/03/20/2407723.html

【mysql】service mysql start出错,mysql启动不了,解决mysql: unrecognized service错误

service MySQL start出错,mysql启动不了,解决mysql: unrecognized service错误的方法如下: [[email protected] ~]# service mysql startmysql: unrecognized service[[email protected] ~]# service mysql restartmysql: unrecognized service [[email protected] ~]# rpm -q mysql   查

service mysql start出错,mysql启动不了,解决mysql: unrecognized service错误

service mysql start出错,mysql启动不了,解决mysql: unrecognized service错误的方法如下: [[email protected] ~]# service mysql startmysql: unrecognized service[[email protected] ~]# service mysql restartmysql: unrecognized service [[email protected] ~]# rpm -q mysql 查询发

解决mysql插入数据报错[Err] 1146 - Table 'performance_schema.session_status' doesn't exist

解决办法:1.打开cmd 执行命令cd/ 进入C盘根目录2.dir 查看C盘根目录下文件夹  找到 Program Files文件夹3.cd Program Files 进入该文件夹下 再输入dir 查看该文件夹下所有文件夹4.cd MySQL 进入该文件夹  再输入dir 查看该文件夹下所有文件夹5.cd MySQLServer 5.7 进入该文件夹  再输入dir 查看该文件夹下所有文件夹6.cd bin 进入该文件夹  7.输入mysql_upgrade -u root -p --forc