docker安装Mysql8.0的坑之lower_case_table_names

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: docker安装Mysql8.0的坑之lower_case_table_names

目录

0、环境:

1、修改my.cnf(无效):

2、docker指定--lower-case-table-names=1(特定情况无效):

3、解决方案


0、环境:

centos7、docker 17.12.1-ce、mysql 8.0.21

docker安装mysql命令:

docker run --name mysql --restart=always \
    -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \
    -v /home/mysql/data:/var/lib/mysql \
    -p 3317:3306 \
    -e MYSQL_ROOT_PASSWORD="root" \
    -e TZ=Asia/Shanghai \
    -d mysql:8.0

image.gif

[root@shamee shamee]# docker run --name mysql --restart=always -e MYSQL_ROOT_PASSWORD="root" -d mysql:8.0
222f3969bdb4a3c58da50707a73866c48cfd26f4c7b2feed32b56ae7de09b036
[root@shamee shamee]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
222f3969bdb4        mysql:8.0           "docker-entrypoint.s…"   2 seconds ago       Up 1 second         3306/tcp, 33060/tcp   mysql
[root@shamee shamee]# docker exec -it mysql bash
root@222f3969bdb4:/# mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.21 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like '%case%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 0     |
+------------------------+-------+
2 rows in set (0.01 sec)
mysql>

image.gif

看到mysql启动成功,同时也能正常连接。(这里是本地虚拟机测试,所以docker run没有外挂宿主目录,显然这是个不好的习惯)。用navicat试一下,

image.png

Nice,docker安装mysql8.0一分钟搞定。那不是有一个下午的时间玩游戏?那就打一把吃鸡压压惊吧。

可是到了第二天,服务器报错了:

Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'biz.XXL_JOB_QRTZ' doesn't exist

image.gif

很显然,表名不存在,是因为表名是大写的问题。 于是乎,立马查看mysql的大小写敏感配置:

mysql> show variables like '%case%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 0     |
+------------------------+-------+
2 rows in set (0.01 sec)
mysql>

image.gif

果然,区别大小写。于是修改my.cnf:

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
lower_case_table_names=1
# Custom config should go here
!includedir /etc/mysql/conf.d/

image.gif

重启mysql,发现mysql不仅没有启动成功,反而不断的在重启。查看log:

[root@iZuf68t6hada0ayijajs45Z ~]# docker logs -f -t --tail 100f mysql
2020-09-02T08:47:27.840720958Z 2020-09-02 16:47:27+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started.
2020-09-02T08:47:27.897290758Z 2020-09-02 16:47:27+08:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-09-02T08:47:27.901725465Z 2020-09-02 16:47:27+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started.
2020-09-02T08:47:27.960172822Z mysqld: [Warning] Skipping '!includedir /etc/mysql/conf.d/' directive as maximum include recursion level was reached in file /etc/mysql/conf.d/my.cnf at line 30.
2020-09-02T08:47:28.197969455Z 2020-09-02T08:47:28.190817Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.21) starting as process 1
2020-09-02T08:47:28.199468695Z 2020-09-02T08:47:28.199360Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2020-09-02T08:47:28.432824695Z 2020-09-02T08:47:28.429540Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2020-09-02T08:47:28.434242966Z 2020-09-02T08:47:28.434080Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').
2020-09-02T08:47:28.434477428Z 2020-09-02T08:47:28.434339Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2020-09-02T08:47:28.434584287Z 2020-09-02T08:47:28.434551Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-09-02T08:47:28.954820885Z 2020-09-02T08:47:28.949232Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.21)  MySQL Community Server - GPL.

image.gif

显然,报错的第8行提示,设置的lower_case_table_names=1与默认的字典值0不一致,接着就拒绝了我的设置。

翻看Mysql官网,MySQL :: MySQL 8.0 Reference Manual :: 5.1.8 Server System Variables有这个一段说明:

image.png

在大多数情况下,这需要在第一次启动MySQL服务器之前在MySQL选项文件中配置lower_case_table_names。

1、修改my.cnf(无效):

按照官网的说法,Mysql8.0一旦你在初始化的时候没有给与相应的值,则默认lower_case_table_names=0。后续如果你想要在my.cnf中修改此项,Mysql8.0是不允许两者不一致的情况发生(5.7的版本是可以的,所以5.7的版本依然可以直接修改my.cnf)。所以事后修改这个配置是不允许的。

2、docker指定--lower-case-table-names=1(特定情况无效):

docker启动mysql修改配置:

docker run --name mysql --restart=always \
    -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \
    -v /home/mysql/data:/var/lib/mysql \
    -p 3317:3306 \
    -e MYSQL_ROOT_PASSWORD="root" \
    -e TZ=Asia/Shanghai \
    -d mysql:8.0 --lower-case-table-names=1

image.gif

网上很多说法都是在docker启动mysql的时候配置--lower-case-table-names。但是我这边尝试了很多遍都无效,原因是因为我的mysql初始化过了,/var/lib/mysql不是默认的初始化数据库,有人为修改的痕迹。

3、解决方案

重新启动mysql,如果是第一次安装,那么docker后面直接加--lower-case-table-names=1是可以的。

如果不是第一次装,需要卸载掉原有的mysql,-v /home/mysql/data:/var/lib/mysql 这里指定一个新的,干净的数据仓库。然后再--lower-case-table-names=1即可。

如:

原有:
docker run --name mysql --restart=always \
    -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \
    -v /home/mysql/data:/var/lib/mysql \
    -p 3317:3306 \
    -e MYSQL_ROOT_PASSWORD="root" \
    -e TZ=Asia/Shanghai \
    -d mysql:8.0
修改:
docker run --name mysql --restart=always \
    -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \
    -v /home/mysql/data2:/var/lib/mysql \
    -p 3317:3306 \
    -e MYSQL_ROOT_PASSWORD="root" \
    -e TZ=Asia/Shanghai \
    -d mysql:8.0 --lower-case-table-names=1

image.gif

其中/home/mysql/data2为新建的目录即可, 但是这种做法,最好数据要备份,防止丢失。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
Ubuntu Linux Docker
如何在Ubuntu 20.04系统中安装Docker
安装 Docker 引擎的步骤如下:首先更新系统包索引 (`sudo apt update`),安装必要依赖包 (`apt-transport-https` 等),添加 Docker 官方 GPG 密钥及 APT 仓库。接着再次更新包索引并安装 Docker 引擎及相关工具 (`docker-ce` 等)。最后启动 Docker 服务并设置开机自启,通过 `docker --version` 和运行测试容器 (`sudo docker run hello-world`) 验证安装是否成功。
29 0
|
8天前
|
存储 虚拟化 Docker
Docker Desktop 4.38 安装与配置全流程指南(Windows平台)
Docker Desktop 是容器化应用开发与部署的一体化工具,支持本地创建、管理和运行 Docker 容器。4.38 版本新增 GPU 加速、WSL 2 性能优化和 Kubernetes 1.28 集群管理功能,适用于微服务开发和 CI/CD 流水线搭建。安装要求为 Windows 10 2004 及以上(64 位),需启用 Hyper-V 或 WSL 2。硬件最低配置为 4GB 内存、20GB 存储和虚拟化技术支持的 CPU。安装步骤包括启用系统功能、下载并运行安装程序,完成后配置镜像加速并验证功能。常见问题涵盖 WSL 2 安装不完整、磁盘空间清理及容器外网访问等。
794 12
|
9天前
|
弹性计算 运维 Ubuntu
在阿里云ECS云服务器上安装、配置及高效使用Docker与Docker Compose
本文介绍了在阿里云ECS上使用Ubuntu系统安装和配置Docker及Docker Compose的详细步骤。通过这些工具,可以快速部署、弹性扩展和高效管理容器化应用,满足开发和运维需求。内容涵盖Docker的安装、镜像源配置、创建Web程序镜像以及使用Docker Compose部署WordPress等实际操作,并分享了使用体验,展示了阿里云实例的高性能和稳定性。
155 4
|
10天前
|
缓存 Ubuntu Linux
Docker Buildx 简介与安装指南
Docker Buildx 是一个强大的工具,提供了多架构构建、并行构建和高级缓存管理等功能。通过正确安装和配置 Buildx,可以显著提升 Docker 镜像的构建效率和灵活性。希望本文能帮助你更好地理解和使用 Docker Buildx,以提高开发和部署的效率。
127 16
|
1月前
|
消息中间件 Kafka Docker
docker compose 安装 kafka
通过本文的步骤,您可以快速在本地使用 Docker Compose 安装并配置 Kafka 和 Zookeeper。Docker Compose 简化了多容器应用的管理,方便快速搭建和测试分布式系统。
94 2
|
1月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
81 20
|
1月前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
352 15
|
1月前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
175 42
|
1月前
|
网络协议 API Docker
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
65 23
|
2月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
288 93