已解决:docker将mysql挂载到宿主机目录后运行mysql时黑马的配置文件hm.cnf未执行且查询数据库乱码

【已解决】docker将mysql挂载到宿主机目录后运行mysql时黑马的配置文件hm.cnf未执行且查询数据库乱码

问题描述

执行命令以下把docker上的mysql挂载到宿主机目录:

docker run -d   --name mysql   -p 3306:3306   -e TZ=Asia/Shanghai   -e MYSQL_ROOT_PASSWORD=123   -v /root/mysql/data:/var/lib/mysql   -v /root/mysql/conf:/etc/mysql/conf.d   -v /root/mysql/init:/docker-entrypoint-initdb.d --privileged=true   mysql

然后命令行执行以下命令运行mysql后

docker exec -it mysql mysql -uroot -p

报警告:

mysql: [Warning] World-writable config file '/etc/mysql/conf.d/hm.cnf' is ignored.

在这里插入图片描述

且配置文件hm.cnf未执行,在运行命令 show variables like “%char%”; 后发现配置文件中配置的编码方式未生效,许多地方编码方式本应为utf-8:

在这里插入图片描述

查数据库表得到乱码数据:

在这里插入图片描述

可能的原因

1.文件权限过高:

MySQL出于安全考虑,会忽略权限设置为全局可写(777或其他包含w权限给所有用户)的配置文件。你的hm.cnf文件在宿主机挂载时可能被赋予了过高权限

权限字段解析:例如:-rwxrw-rw-
字段含义问题
-普通文件类型正常
rwx (前三位)所有者(root)有 读+写+执行 权限危险:配置文件不需要执行权限(.cnf 是文本文件,x 权限无意义)
rw- (中三位)所属组(root组)有 读+写 权限致命:同组用户可修改配置文件,违反安全原则
rw- (后三位)其他用户有 读+写 权限高危:任何用户都能篡改配置文件
.SELinux 安全上下文标记需结合 ls -Z 查看
权限结论:

在 Linux/Unix 系统中,文件或目录的权限由 读(r)写(w)执行(x) 三种基本权限组成,分别对应不同的数字。权限分为三类用户:所有者(Owner)所属组(Group)其他用户(Others)

权限数字的计算规则如下:

权限类型符号表示数字值
r4
w2
执行x1
权限数字的组成

每个用户类别(所有者、组、其他用户)的权限由对应的 rwx数字值相加 得到。最终的权限由 三位数字 表示,例如 755

  • 第一个数字:所有者的权限(Owner)
  • 第二个数字:所属组的权限(Group)
  • 第三个数字:其他用户的权限(Others)
详细权限对照表
数字符号表示权限说明
0---无权限
1--x仅执行
2-w-仅写入
3-wx写入 + 执行
4r--仅读取
5r-x读取 + 执行
6rw-读取 + 写入
7rwx读取 + 写入 + 执行
  • World-writable(全局可写):文件权限为 766(数字权限换算:rwx=7, rw-=6, rw-=6),导致 MySQL 拒绝加载该文件。
  • 权限严重过度开放:所有用户均可读写,极不安全!

2.挂载路径覆盖问题

使用-v /root/mysql/conf:/etc/mysql/conf.d挂载时,若宿主机目录/root/mysql/conf为空或未包含完整的配置文件结构,可能导致容器内原有的默认配置文件丢失,引发配置加载异常

解决方案步骤

1. 修正配置文件权限

  • 先查看当前权限:
# 查看当前权限
ls -l /root/mysql/conf/hm.cnf
  • 修该当前权限为644(保留所有者和组的读写权限,全局只读)
chmod 644 /root/mysql/conf/hm.cnf

2.操作后验证

- 重新运行mysql查看发现警告消失:

在这里插入图片描述

- 重新执行show variables like “%char%”;发现配置文件已生效

在这里插入图片描述

- 重新查表发现已不再乱码

在这里插入图片描述

3.至此,问题若还未解决,则考虑是不是前面提到的第二个原因导致的

解决方案:
- 正确路径建议

MySQL容器的配置加载依赖于多层目录结构(如conf.d和mysql.conf.d),建议将宿主机目录挂载到整个/etc/mysql而非仅conf.d。

调整命令如下:

 -v /root/mysql/conf:/etc/mysql  # 替换原有的conf.d挂载 

并在宿主机/root/mysql/conf目录中重建容器内默认的配置文件结构(如conf.d和mysql.conf.d子目录)

- 避免覆盖默认配置

容器首次启动时,建议通过docker cp复制容器内的默认配置文件到宿主机后再挂载:

docker run -d --name temp_mysql mysql  # 临时启动容器 

docker cp temp_mysql:/etc/mysql /root/mysql/conf  # 复制默认配置 

docker rm -f temp_mysql  # 删除临时容器
- 验证配置文件加载
  • 检查日志

    进入容器查看MySQL的错误日志,确认配置文件是否被正确加载:

docker exec -it mysql bash 
cat /var/log/mysql/error.log | grep "Configuration file" 
  • 手动测试配置

    使用mysql --help命令验证配置是否生效:

docker exec -it mysql mysql --help | grep "cnf"

# 输出应包含你的配置文件路径(如/etc/mysql/conf.d/hm.cnf)
  • 配置文件内容检查

    ​ 确保hm.cnf内容符合MySQL语法规范。例如:

[mysqld] 
log_bin = /var/lib/mysql/mysql-bin  # 示例:启用二进制日志 

避免格式错误(如多余的空格、未闭合的引号等),否则MySQL会静默忽略该文件

重启容器并检查警告是否消失:
docker restart mysql
docker exec -it mysql mysql -uroot -p -e "SHOW VARIABLES LIKE 'log_bin';"

log_bin等配置项显示为自定义值,则配置文件已生效。

否则MySQL会静默忽略该文件

重启容器并检查警告是否消失:
docker restart mysql
docker exec -it mysql mysql -uroot -p -e "SHOW VARIABLES LIKE 'log_bin';"

log_bin等配置项显示为自定义值,则配置文件已生效。

通过上述步骤,可解决配置文件权限问题并确保MySQL正确加载配置。若问题仍存在,需进一步检查宿主机与容器间的文件映射一致性
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值