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

问题描述 投票:0回答:7

我刚刚在 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

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

我终于明白为什么了。发帖是为了回复。

mysql macos docker docker-compose
7个回答
125
投票

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

screenshot docker

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

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

更新

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

enter image description here


25
投票

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
时它将无法初始化。

我找到的唯一解决方案是:

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

更新:请参阅下面的此答案以获得更好的解决方案。显然没有必要降级。您可以禁用“gRPC Fuse for filesharing”,备份数据库,重新启用 gRPC fusion,删除数据库数据文件夹,然后从备份恢复数据库。


5
投票

另一个选项是使用磁盘工具创建区分大小写的 APFS 卷。

Add APFS to container Shows storage between APFS volumes are shared

与分区不同,可以共享可用空间,因此您无需担心保留足够的空间来运行数据库。

然后创建从您的项目到区分大小写的卷的符号链接。

cd ~/my-project
ln -s /Volumes/MySQL/project-db mysql

3
投票

Docker 在最近的更新中删除了此选项,我通过这样做成功解决了 Windows 上的此问题

以管理员身份运行 shell:

转到本地安装的 mysql 卷并运行

fsutil file setCaseSensitiveInfo ./ enable 

归功于https://github.com/docker/for-win/issues/12384#issuecomment-972845031


1
投票

Loic 的 H 答案的一个小补充。 假设你的映射是这样的:

docker run --name your_container_name ... -v //d/MySqlDockerData:/var/lib/mysql ...

如果你尝试

fsutil file setCaseSensitiveInfo d:\MySqlDockerData

你会得到一个错误“目录不为空”

要解决此问题,请按照以下步骤操作:

  1. 运行 docker 容器停止 your_container_name
  2. 将文件夹中的内容转移到另一个地方(清除文件夹)
  3. 再次运行fsutil文件setCaseSensitiveInfo d:\MySqlDockerData
  4. 将保存的数据传回 d:\MySqlDockerData
  5. 运行docker容器启动your_container_name


0
投票

作为 Windows 操作系统上的解决方法,我在 Docker Desktop 中禁用了 WSL,它对我有帮助

更新。上次 Docker 桌面更新后,我被迫将包含数据库数据的 Windows 目录设置为区分大小写


0
投票

我只是想添加这个答案,因为我在不同的上下文中遇到了相同的问题,并想让每个人都知道我是如何解决它的

问题:

因此,我在本地计算机上运行了一个 MySQL 容器,并且它没有安装任何持久卷。这基本上意味着如果我杀死了容器,我将丢失所有数据。由于容器中有一些有用的数据,我不希望发生这种情况。

这就是我所做的:

我进入容器并将MySQL数据目录复制到主机。然后,我杀死了该容器并启动了一个新容器,在主机上安装了一个包含复制目录的卷。令我惊讶的是,我遇到了问题中提到的问题,因为 Windows 和 Linux 系统对目录的大小写敏感度不同。

我是怎么解决的?

我创建了另一个目录,使用命令使其不区分大小写

fsutil file setCaseSensitiveInfo ./ enable

并将之前复制的目录中的内容复制到其中。之后,一切都开始工作了。

© www.soinside.com 2019 - 2024. All rights reserved.