docker 更新后,Mysql 未在 MacOS 上的 docker 容器中启动

Cul*_*lly 61 mysql macos docker docker-compose

我刚刚在 MacOS 上从 2.3 版升级到 Docker Desktop 2.4。突然间,我的 mysql 容器都不会启动。日志显示这是原因:

Different lower_case_table_names settings for server ('2') and data dictionary ('0').
Data Dictionary initialization failed.
Aborting
Run Code Online (Sandbox Code Playgroud)

数据库文件安装在我主机上的一个卷中,以便它们在重新启动之间保持不变。

我终于知道为什么了。发帖是为了回答。

gam*_*ure 113

使用最新的 docker,您可以禁用 gRPC Fuse 以进行文件共享。(gRPC Fuse 设置导致此问题,它与 0 的数据字典不兼容)

截图泊坞窗

这解决了问题......如果你高兴,你可以在这里停下来,但要使用新的文件系统,你可以:

  • 禁用此复选框
  • 启动容器
  • 转储数据库
  • 启用此复选框
  • 确保您的数据文件夹为空(因此 mysql 会创建一个新的数据字典)
  • 导入转储的数据库

更新

从 2.5 版开始,该设置已移至“实验功能”页面:

在此处输入图片说明

  • 我在 Windows Docker Desktop 4.2.0 中看不到 gRPC 选项。 (3认同)

Cul*_*lly 19

lower_case_table_names设置告诉 mysql 如何存储和比较表名。如果存储数据库的文件系统本身不区分大小写,它将强制您使用lower_case_table_names=2.

MacOS 文件系统不区分大小写。直到 Docker Desktop 2.4,mysql 容器显然不知道底层文件系统不区分大小写和 set lower_case_table_names=0。然而,自从升级到 Docker 2.4 后,Docker 在安装卷方面显然更加智能。因此容器实现了在不区分大小写的文件系统上运行并强制lower_case_table_names=2. 问题是你不能lower_case_table_names在初始化数据库后更改的值。并且由于数据字典是用 初始化的lower_case_table_names=0,所以当服务器设置为 时,它将无法初始化lower_case_table_names=2

我发现的唯一解决方案是:

  1. 降级到Docker 桌面 2.3
  2. 备份整个数据库
  3. 升级到 Docker 2.4
  4. 删除存储数据库的卷。
  5. 重新初始化数据库。
  6. 从备份中恢复数据库。

更新:请参阅下面答案以获得更好的解决方案。显然没有必要降级。您可以改为禁用“用于文件共享的 gRPC Fuse”,备份数据库,重新启用 gRPC 保险丝,删除您的数据库数据文件夹,并从备份中恢复数据库。