docker安装Mysql8.0的坑之lower_case_table_names

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 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为新建的目录即可, 但是这种做法,最好数据要备份,防止丢失。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
3月前
|
Ubuntu 关系型数据库 MySQL
MySQL源码编译安装
本文详细介绍了MySQL 8.0及8.4版本的源码编译安装全过程,涵盖用户创建、依赖安装、cmake配置、编译优化等步骤,并提供支持多Linux发行版的一键安装脚本,适用于定制化数据库部署需求。
419 4
MySQL源码编译安装
|
3月前
|
Ubuntu 关系型数据库 MySQL
MySQL二进制包安装
本文详细介绍了在多种Linux系统上通过二进制包安装MySQL 8.0和8.4版本的完整过程,涵盖用户创建、glibc版本匹配、程序解压、环境变量配置、初始化数据库及服务启动等步骤,并提供支持多发行版的一键安装脚本,助力高效部署MySQL环境。
391 4
MySQL二进制包安装
|
3月前
|
安全 关系型数据库 MySQL
MySQL包安装 -- SUSE系列(离线RPM包安装MySQL)
本文详细介绍在openSUSE系统上通过离线RPM包安装MySQL 8.0和8.4版本的完整步骤,包括下载地址、RPM包解压、GPG密钥导入、使用rpm或zypper命令安装及服务启动验证,涵盖初始密码获取与安全修改方法,适用于无网络环境下的MySQL部署。
432 3
MySQL包安装 -- SUSE系列(离线RPM包安装MySQL)
|
3月前
|
关系型数据库 MySQL Linux
MySQL包安装 -- SUSE系列(SUSE资源库安装MySQL)
本文介绍了在openSUSE系统上通过SUSE资源库安装MySQL 8.0和8.4版本的完整步骤,包括配置国内镜像源、安装MySQL服务、启动并验证运行状态,以及修改初始密码等操作,适用于希望在SUSE系列系统中快速部署MySQL的用户。
270 3
MySQL包安装 -- SUSE系列(SUSE资源库安装MySQL)
|
3月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
554 5
|
3月前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
395 2
|
3月前
|
Ubuntu 关系型数据库 MySQL
MySQL包安装 -- Debian系列(离线DEB包安装MySQL)
本文详细介绍了在Ubuntu 24.04、22.04、20.04及Debian 12系统上,通过离线DEB包安装MySQL 8.0和8.4版本的完整步骤。涵盖下载地址、依赖处理、dpkg安装顺序、配置方法及服务启动验证,确保用户可顺利部署MySQL数据库。
1197 0
MySQL包安装 -- Debian系列(离线DEB包安装MySQL)
|
3月前
|
运维 Ubuntu 关系型数据库
MySQL包安装 -- Debian系列(Apt资源库安装MySQL)
本文介绍了在Debian系列系统(如Ubuntu、Debian 11/12)中通过APT仓库安装MySQL 8.0和8.4版本的完整步骤,涵盖添加官方源、配置国内镜像、安装服务及初始化设置,并验证运行状态,适用于各类Linux运维场景。
1012 0
MySQL包安装 -- Debian系列(Apt资源库安装MySQL)
|
Ubuntu 网络安全 数据安全/隐私保护
百度搜索:蓝易云【docker通过dockerfile安装sftp教程。】
现在,你已经通过 Dockerfile 成功安装了 SFTP,并且可以使用指定的用户名和公钥进行远程访问。请确保替换示例中的用户名、密码和公钥为自己的实际值。
355 1