Got error 122 from storage engine

现场问题

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

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

查找问题

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

1
#define HA_ERR_INTERNAL_ERROR 122 /* Internal error */

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

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

1
2
3
4
5
6
7
# 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文件是:

1
2
3
4
5
6
7
8
9
10
11
--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文件生成。
对于这种问题,处理方法很简单,重建此表就行。

1
2
3
4
5
6
rm t2.frm
flush table t2;
set sql_log_bin=off;
create table t2 xxx
set sql_log_bin=on;
start slave;

本文标题:Got error 122 from storage engine

文章作者:Louis

发布时间:2017年09月13日 - 17:09

最后更新:2017年09月25日 - 14:09

原始链接:/2017/09/13/mysql-error-122/

许可协议: Louis-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。