CentOS中Docker的MySQL更改配置后重启不了的两种解决方式

在项目中实施分库分表时,手动修改了Docker内的MySQL配置文件my.cnf,导致容器无法启动。错误日志显示配置文件存在错误。尝试通过docker exec进入容器修改配置失败,因容器未运行。解决方案包括直接修改主机上的配置文件或使用docker cp命令在主机和容器间拷贝配置文件进行修改和回滚。通过修改并复制回配置文件后,重启MySQL容器,服务恢复正常。

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

项目要用到分库分表,然后自己手动更改了Docker中MySQL的配置文件my.cnf。
配置完毕之后使用Docker进行部署,运行docker restart mysql后没有成功启动。
问题排查,打印日志

docker logs mysql

报错如下:

[ERROR] [Entrypointl: mysqld failed while attempting to check config command was : mysqld --vervbose --help
[ERROR] Found option without preceding group in config file /etc/mysql/ my cnf at line 27 mysql Fatal error in defaults handling. Program aborted
[ERROR] [Entrypoint]: mysqld failed while attempting to check config command was mysqld --verbose --help mysqld: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 27!
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!

随后我打算执行

docker exec -it mysql /bin/bash

先进入Docker容器之后再修改回原有配置,但是发现容器未启动(Container not started),因为exec执行命令只能用于已在运行的容器!!!

解决方式

方式一:实际文本修改配置

首先当前Linux主机中已存放了docker容器中的配置信息(一般挂载默认目录是:/var/lib/docker/overlay/),其次只要找到这个挂载目录的配置文件,修改后就可以重新启动了
这里不过多赘述方式一。

方式二:间接修改配置文件

使用docker cp命令,把docker容器中的配置文件复制到Linux主机中来,接着修改完之后再复制回docker容器中去,就可以了完成配置文件的回滚了
具体操作(方式二)

1、将docker容器内的文件拷贝至Linux主机中
docker cp mysql:/etc/mysql/my.cnf .

注:. 代表是当前目录,我操作时当前目录是/root,且 mysql:/etc/mysql/my.cnf即为配置文件地址,上述代码操作完成之后 my.cnf 配置文件就会复制到当前操作目录下

2、vim修改配置文件中出错的地方,重新修改回来
3、复制修改后的配置文件到docker容器中去
docker cp my.cnf mysql:/etc/mysql/my.cnf
4、最后重启容器实例,使修改后的配置文件生效
docker restart mysql
5、配置文件生效,MySQL正常启动
### 关闭 DockerMySQL 的 ONLY_FULL_GROUP_BY 模式 在 CentOS 上通过 Docker 部署的 MySQL 容器中,可以通过两种方式来禁用 `ONLY_FULL_GROUP_BY` 模式。 #### 方法一:临时关闭 `ONLY_FULL_GROUP_BY` 可以在当前会话中动态修改 `sql_mode` 参数以移除 `ONLY_FULL_GROUP_BY`: ```sql SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ``` 此命令会在当前 MySQL 实例运行期间生效,但如果容器重启或服务停止再启动,则设置将会丢失[^2]。 #### 方法二:永久关闭 `ONLY_FULL_GROUP_BY` 为了使更改持久化,在 Docker 运行的 MySQL 容器中可以编辑其配置文件或者挂载自定义配置文件到容器内部。具体步骤如下: 1. **创建自定义配置文件** 创建一个新的 MySQL 配置文件(例如 `/my/custom.cnf`),并将以下内容写入其中: ```ini [mysqld] sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION ``` 此处已去除了 `ONLY_FULL_GROUP_BY` 选项[^3]。 2. **更新 Docker 启动参数** 使用 `-v` 参数将本地配置文件映射至容器内的默认位置(通常是 `/etc/mysql/conf.d/` 或者 `/etc/my.cnf.d/`)。以下是示例命令: ```bash docker run --name mysql-container \ -e MYSQL_ROOT_PASSWORD=rootpassword \ -v /my/custom.cnf:/etc/mysql/conf.d/custom.cnf \ -d mysql:8.0 ``` 如果需要确认配置是否成功加载,可登录容器并查看实际应用的 `sql_mode` 值: ```sql SELECT @@GLOBAL.sql_mode; ``` 上述方法能够确保即使容器重启后仍然保持对 `ONLY_FULL_GROUP_BY` 的禁用状态[^4]。 #### 注意事项 - 修改前建议备份原始数据以及重要业务逻辑。 - 若涉及生产环境调整,请务必测试无误后再实施改动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值