MySQL 8 不再因 lower_case_table_names 而启动

MySQL 8 不再因 lower_case_table_names 而启动

我有一个 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

在构建容器之前。

相关内容