MySQL Got error 122 from storage engine处理方法

现场问题

客户重库SQL线程报错如下:

Last_Errno: 1030
Last_Error: Error 'Got error 122 from storage engine' on query .....

查找问题

从include/my_base.h中找到错误码定义:

#define HA_ERR_INTERNAL_ERROR   122	/* Internal error */

没什么意义,没有具体说明。接着从mysql-test里面搜索是否有类似报错:

在mysql-test/suite/innodb/r/partition.result里面搜到如下信息:

# Bug#20819189: Assert if .frm exists but no partitioned InnoDB table
#
CREATE TABLE t1 (a int) ENGINE=InnoDB PARTITION BY HASH (a) PARTITIONS 2;
SELECT * FROM t2;
ERROR HY000: Got error 122 from storage engine
FLUSH TABLE t2;
DROP TABLE t1;

对应的test文件是:

--echo #
--echo # Bug#20819189: Assert if .frm exists but no partitioned InnoDB table
--echo #
CREATE TABLE t1 (a int) ENGINE=InnoDB PARTITION BY HASH (a) PARTITIONS 2;
--copy_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/t2.frm
--error ER_GET_ERRNO
SELECT * FROM t2;
--remove_file $MYSQLD_DATADIR/test/t2.frm
# Flush table is needed to remove the 'orphan' t2 definition.
FLUSH TABLE t2;
DROP TABLE t1;

可以看到是因为表只有frm文件,而缺失ibd文件导致的。

解决问题

这种情况一般是在建表的时候,服务器异常宕机,导致只有frm文件生成。 对于这种问题,处理方法很简单,重建此表就行。

$ rm t2.frm
mysql> flush table t2;
mysql> set sql_log_bin=off;
mysql> create table t2 xxx
mysql> set sql_log_bin=on;
mysql> start slave;