Mysql'从存储引擎得到错误-1'错误

Posted

技术标签:

【中文标题】Mysql\'从存储引擎得到错误-1\'错误【英文标题】:Mysql 'Got error -1 from storage engine' errorMysql'从存储引擎得到错误-1'错误 【发布时间】:2012-03-24 15:34:13 【问题描述】:

我有一个 myism 表“测试”,其中包含一些过时的数据,现在我想重新创建表,所有列都相同,只是我将存储从 myism 更改为 innodb。我用来重新创建表的dump sql是这样的:

drop table test;
create table test ( ... )
engine=innodb

insert into test(...) values(...)

这就是我得到错误“从存储引擎得到错误 -1”的地方,我用谷歌搜索了一下,大部分结果都集中在损坏的 innodb 表上。虽然就我的情况而言,我认为它没有损坏,但这只是我在删除和创建语句时错过的东西。

另一件事是,在执行了上面的 sql 之后,表测试剩下的就是一个名为 file.frm 的文件,我猜 innodb 表需要一些其他的东西来运行,但不确定是什么。

我该如何解决这个问题?而且我可能需要做更多此类任务,删除 myism 表并将它们重新创建为 innodb 的正确程序是什么?

谢谢。

【问题讨论】:

【参考方案1】:

如果不存在则创建表banners ( id int(255) NOT NULL AUTO_INCREMENT, user int(255) NOT NULL DEFAULT '0', 键type (type) ) engine=myisam DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

此代码更改为

如果不存在则创建表 banners ( id int(255) NOT NULL AUTO_INCREMENT, user int(255) NOT NULL DEFAULT '0', 键type (type) ) engine=INNODB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

【讨论】:

我建议您将代码每行缩进 4 个空格。这将使它显示在一个框中(就像您在问题中看到的代码一样),并且行结构将保持不变。【参考方案2】:

我在 Azure 上进行了 SQL 导入,需要更改

ENGINE=MyISAM 与 ENGINE=InnoDB

【讨论】:

你是怎么做到的? 没关系,傻我,只需在 INSERT 查询中更改它 这行得通,谢谢。但你能解释一下它为什么起作用吗? @TheAlbear @GayalKuruppu,Azure 不支持 MyISAM,请参阅文档:docs.microsoft.com/en-us/azure/mysql/concepts-limits【参考方案3】:

要了解 unix 或 linux 系统上任何系统错误代码的错误代码是什么,请查看 errno.h。在我的 Mac 上,我可以这样做:

$ grep 28 /usr/include/sys/errno.h #define ENOSPC 28 /* 设备上没有剩余空间 */

在其他操作系统上,例如linux,由于机器层子包含,还会有一些其他层。但是,您应该能够查看这些文件并找到这些错误定义。

或者,使用“man”命令在“2”部分(操作系统部分)下查找“介绍”或其他手册页。

【讨论】:

【参考方案4】:

转到 /etc/my.cnf

注释行 innodb_force_recovery=1

保存文件并重启mysql

【讨论】:

【参考方案5】:

好的。我找到了解决方案。 该问题是由 my.cnf 中的 innodb_force_recovery 参数引起的,该参数设置为 4。

为解决问题,设置为0或从my.cnf中完全删除该参数

如果您检查错误日志,在查询期间,mysql 会以人类可读的语言编写:在启用 innodb 恢复模式之前,它不会让您更改表中的任何内容,正好是下一条消息:

InnoDB: A new raw disk partition was initialized or
InnoDB: innodb_force_recovery is on: we do not allow
InnoDB: database modifications by the user. Shut down
InnoDB: mysqld and edit my.cnf so that newraw is replaced
InnoDB: with raw, and innodb_force_... is removed.

请参考:http://bugs.mysql.com/bug.php?id=30225

【讨论】:

正确的拼写是innodb_force_recovery(而不是force_innodb_recovery) 这真的很有帮助!谢谢! :)【参考方案6】:

-1 错误的常见原因是磁盘已满。我有不同的小型虚拟机用于测试目的,innodb 只是不断填充它们(我一直忘记它)。

$df -ah

如果它向您显示 100% 的磁盘,那就是 -1 的来源;)

【讨论】:

我不同意那个.. 磁盘已满的代码是 28.. 比如“从存储引擎得到错误 28”

以上是关于Mysql'从存储引擎得到错误-1'错误的主要内容,如果未能解决你的问题,请参考以下文章

无法从存储引擎读取自增值,错误号:1467

在kubernetes引擎中将数据从docker容器存储到GCS中时,得到 "权限不足 "的错误信息。

mysql 无法从存储引擎读取自增值

解决“错误代码:1030。从存储引擎 MEMORY 收到错误 1“不允许操作””

启动mysql服务失败,错误码:1067.

由于系统错误 126 (MySQL ODBC 5.3 UNICODE Driver),指定驱动程序无法加载。