Docker 更新后 Mysql 表丢失:“引擎中不存在表名”

Posted

技术标签:

【中文标题】Docker 更新后 Mysql 表丢失:“引擎中不存在表名”【英文标题】:Mysql tables missing after Docker update: "TableName doesn't exist in engine" 【发布时间】:2018-08-09 01:10:27 【问题描述】:

最近的 Docker 更新似乎导致 MariaDB 中的(只是一些)InnoDB 表无法访问。我明白了:

#1932 - Table 'dbname.SomeTableName' doesn't exist in engine

当尝试访问它们时(它们会显示在表格列表中)。我过去更新了 Docker(和图像)没有问题。 db 文件和权限看起来不错。

我可以从备份中仅重新创建“丢失”的表(约 35 个中的 4 个),但是当我尝试删除它们时,我得到:

#1347 - 'dbname.SomeTableName' is not VIEW

我正在使用 Docker 映像 mariadb:10.2 (MariaDB-10.2.12+maria~jessie) 和绑定挂载,用于持久数据存储,作为本地 Docker-for-Mac 开发环境的一部分。 docker-compose.yml 文件如下所示:

mysql: image: mariadb:10.2 volumes: - ./data/mysql:/var/lib/mysql

我以前从未遇到过此错误,并且无法转储或导出无法访问的表。有没有办法恢复或修复(或删除)它们?我宁愿不必重新创建整个数据库。

【问题讨论】:

Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地点。 我认为这完全属于“直接涉及主要用于编程的工具”,这里还有很多关于 MySql 配置的其他问题。 其实不然。 Docker 只是另一个轻量级虚拟机,就像 Debian chroot 一样。 Docker 应该用于 API 问题,但 Stack Overflow 已成为问题的垃圾场。 原来这只是间接的 Docker 问题,这对你有什么改变吗? Docker 只是参与其中,因为它为更新 MariaDB 版本做出了贡献——类似于它曾经是 yum 或 apt。同样,我正在运行一个非常常见的开发设置,所以我不得不认为它可能发生在其他人身上。 【参考方案1】:

我能够通过为我的本地使用自定义 mysql 配置并添加:

[mysqld]
lower_case_table_names=1

您可以在不更改默认配置的情况下执行此操作,方法是将包含上述文本的文件挂载到 mysql conf.d 目录中,例如:

volumes:
  - ./mysql_local.cnf:/etc/mysql/conf.d/mysql_local.cnf:ro

【讨论】:

既然这解决了问题并且可能会遇到其他问题,不知道你为什么会投反对票。 我在更新 Docker 安装后遇到了这个问题。我真的很好奇是什么导致了这种变化。有任何想法吗?阅读您提供的设置的文档对我来说并没有太多启发......dev.mysql.com/doc/refman/5.7/en/… 我无法确定是什么原因造成的,但我注意到缺少使用大写字母的表格(由第 3 方模块创建,我的是小写字母)。我假设 Docker 更新触发了映像更新,并且在区分大小写的卷上运行时将数据绑定安装到不区分大小写的卷上可能会导致问题。为什么之前没有问题,我不能说。我确实更改了我的图像以包含次要版本,例如,image: mariadb:10.2.12——尽管 Docker 更新也可能更改了与文件系统相关的内容。 您也可以通过添加以下条目命令来解决此问题:--lower_case_table_names=1 它对我有用,非常感谢!我在 Mac OS 中运行 Docker,并且在更改表后它会中断。我的表格还包含大写字母。我在docker-compose.ymlcommand 部分添加了--lower_case_table_names=1

以上是关于Docker 更新后 Mysql 表丢失:“引擎中不存在表名”的主要内容,如果未能解决你的问题,请参考以下文章

使用 CSV 文件更新 MySQL 表

x小时后MYSQL表丢失

群晖docker更新数据会不会丢失

[更新mysql表后仅在单个列中丢失数据

docker 启动 mysql,重启docker导致容器消失

Docker MySQL在超时后丢弃表:连接关闭后不允许操作