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;