我有一个 docker mysql 8 容器,已经用了好几年了。突然间它无法启动,并出现以下错误:
[Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
...
[ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('2') and data dictionary ('0').
[ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
[ERROR] [MY-010119] [Server] Aborting
运行 mysql 5.7 的其他容器仍在按预期工作。
我在 MacOS 10.14.6 上运行此 docker 映像。这是在 docker 桌面崩溃或升级后发生的,不确定是哪个原因造成的。我在网上搜索了所有解决方案,但一无所获。我找到的所有解决方案都没有用。
这是我的 docker-compose 条目。
"mysql-8.0":
container_name: "mysql-8.0"
image: mysql:8.0
restart: always
networks:
- matrix
command: --default-authentication-plugin=mysql_native_password
ports:
- 127.0.0.1:3380:3306
volumes:
- "./db-8.0:/var/lib/mysql:cached"
- "./db-8.0/my.cnf:/etc/mysql/conf.d/my.cnf"
environment:
- MYSQL_ROOT_PASSWORD=******
- MYSQL_ROOT_HOST=%
有什么办法可以解决这个问题吗?就像我之前说的,到目前为止,这个已经运行了很多年了。
答案1
我的问题是由最新版本的 Docker 2.3.5.0 引起的。此更新是导致问题的原因:
Docker Desktop 现在默认使用 gRPC-FUSE 进行文件共享。与 osxfs 相比,它具有更快的文件共享速度并且占用更少的 CPU,尤其是在主机上有大量文件事件时。
一旦我降级到之前安装的 docker 版本 (2.3.1.0),一切都恢复正常。我必须在再次升级之前备份所有数据库。
答案2
该变量lower_case_table_names
应在初始化时设置。尝试在运行docker时设置它,以便在初始化期间选择它,
"mysql-8.0":
container_name: "mysql-8.0"
image: mysql:8.0
restart: always
networks:
- matrix
command: --lower_case_table_names=2
ports:
- 127.0.0.1:3380:3306
volumes:
- "./db-8.0:/var/lib/mysql:cached"
- "./db-8.0/my.cnf:/etc/mysql/conf.d/my.cnf"
environment:
- MYSQL_ROOT_PASSWORD=******
- MYSQL_ROOT_HOST=%
确保将身份验证插件命令保留在 docker compose 中,并尝试在0|1|2
以下值之间切换:lower_case_table_names
答案3
您需要执行此命令
sudo debconf-set-selections <<< "mysql-server mysql-server/lowercase-table-names select Enabled"
并将此命令添加到您的 docker-compose 文件中:'
command: --lower_case_table_names=1
在构建容器之前。