我刚刚在 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
数据库文件安装在我的主机上的一个卷中,以便它们在重新启动之间保持不变。
我终于明白为什么了。发帖是为了回复。
lower_case_table_names
设置告诉mysql如何存储和比较表名。如果存储数据库的文件系统本身不区分大小写,它将迫使您使用lower_case_table_names=2
。
MacOS 文件系统不区分大小写。直到 Docker Desktop 2.4,mysql 容器显然不知道底层文件系统不区分大小写并设置
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
时它将无法初始化。
我找到的唯一解决方案是:
更新:请参阅下面的此答案以获得更好的解决方案。显然没有必要降级。您可以禁用“gRPC Fuse for filesharing”,备份数据库,重新启用 gRPC fusion,删除数据库数据文件夹,然后从备份恢复数据库。
Docker 在最近的更新中删除了此选项,我通过这样做成功解决了 Windows 上的此问题
以管理员身份运行 shell:
转到本地安装的 mysql 卷并运行
fsutil file setCaseSensitiveInfo ./ enable
归功于https://github.com/docker/for-win/issues/12384#issuecomment-972845031
对 Loic 的 H 答案的一个小补充。 假设你的映射是这样的:
docker run --name your_container_name ... -v //d/MySqlDockerData:/var/lib/mysql ...
如果你尝试
fsutil file setCaseSensitiveInfo d:\MySqlDockerData
你会得到一个错误“目录不为空”
要解决此问题,请按照以下步骤操作:
瞧
作为 Windows 操作系统上的解决方法,我在 Docker Desktop 中禁用了 WSL,它对我有帮助
更新。上次 Docker 桌面更新后,我被迫将包含数据库数据的 Windows 目录设置为区分大小写
我只是想添加这个答案,因为我在不同的上下文中遇到了相同的问题,并想让每个人都知道我是如何解决它的
问题:
因此,我在本地计算机上运行了一个 MySQL 容器,并且它没有安装任何持久卷。这基本上意味着如果我杀死了容器,我将丢失所有数据。由于容器中有一些有用的数据,我不希望发生这种情况。
这就是我所做的:
我进入容器并将MySQL数据目录复制到主机。然后,我杀死了该容器并启动了一个新容器,在主机上安装了一个包含复制目录的卷。令我惊讶的是,我遇到了问题中提到的问题,因为 Windows 和 Linux 系统对目录的大小写敏感度不同。
我是怎么解决的?
我创建了另一个目录,使用命令使其不区分大小写
fsutil file setCaseSensitiveInfo ./ enable
并将之前复制的目录中的内容复制到其中。之后,一切都开始工作了。