linux启动docker镜像成功,而win启动该镜像mysql报错

文章讲述了在Docker中使用自定义PHP镜像安装MySQL时,因Linux和Windows操作系统对lower_case_table_names设置的不同导致的错误。解决方案包括在MySQL初始化的系统上部署,或在Win上启动前修改环境变量,或使用docker-compose新建容器独立设置环境变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • dockers报错:Starting MySQL database server mysqld ...failed
  • 进入容器内部,查看mysql错误日志:cat /var/log/mysql/error.log
  • mysql具体报错: Different lower_case_table_names settings for server ('2') and data dictionary ('0').

出现该问题的重要前提是:

  • docker启动mysql并不是根据官方mysql镜像,而是在一个基础php镜像上安装的mysql服务。
  • 我的mysql数据通过docker的卷挂载在外部,通过一个mysql文件夹管理。

当我把linux上可以运行的镜像和mysql外部卷都发送给win机器运行,由于mysql数据是外部挂载的,所以会出现同一个镜像,换了操作系统却无法运行的问题。本质上是mysql在linux和win上的环境变量lower_case_table_names默认值不同导致的。由于数据库数据在linux上初始化,该值已经为0,而在win上需要为2,所以报错。

Docker镜像确实是操作系统无关的,但是MySQL的lower_case_table_names设置是与操作系统有关的。这是因为lower_case_table_names设置决定了MySQL如何存储和比较表名和数据库名。

在Windows和Mac系统中,文件系统通常不区分大小写,因此MySQL默认将lower_case_table_names设置为2。在这种设置下,MySQL将表名存储为小写,并且比较时不区分大小写。

在Linux系统中,文件系统通常区分大小写,因此MySQL默认将lower_case_table_names设置为0。在这种设置下,MySQL将表名存储为给定的大小写,并且比较时区分大小写。

当你在一个系统(例如Windows)上创建MySQL数据,然后尝试在另一个系统(例如Linux)上使用这些数据时,可能会出现这个错误。这是因为数据字典(存储了表名和数据库名的元数据)的lower_case_table_names设置与服务器的设置不一致。

解决方案

解决个蛋,一般都是放在linux上运行的,mysql在哪初始化就在哪部署。将镜像和外部卷都放在linux机器上部署就好了。win上报错要启动mysql前修改那个环境变量的值。

或者有一种麻烦的思路,就是将其mysql服务从一个容器中剥离出来,新开一个容器启动,这样方便设置环境变量。如果要修改一个非mysql基础镜像的mysql环境变量还是比较繁琐的。新开一个容器,用docker-compose启动即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值