0、前情摘要

最近公司护网行动,又要排查所有的中间件密码,其中 mysql的密码修改遇到了问题,需要分享一下。

1、mysql docker镜像设置密码

启动的时候,设置环境变量就可以配置 mysql的密码:

  • MYSQL_ROOT_PASSWORD :root的密码
  • MYSQL_USER :建一个普通用户
  • MYSQL_PASSWORD :普通用户的密码

2、mysql docker镜像修改密码

当需要修改mysql密码的时候,发现修改环境变量再重启,密码并没有修改,因为已经持久化了,密码存下来了,不会再读取环境变量了。
只能通过mysql命令行来修改了。

# 用旧密码登陆root
mysql -uroot -p

# 修改普通用户的密码
SET PASSWORD FOR 'youruser' = PASSWORD('xxxxxxxx');

# 修改root密码
SET PASSWORD FOR 'root' = PASSWORD('xxxxxxxxxxxxx');

3、问题来了,mysql容器重启起不来了!

其实不需要重启,密码已经生效了,但是只有重启才会暴露出来这个问题!你也无法保证容器不重启啊!
报错信息:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
  • 意思就是密码错误!!!但是怎么可能密码错误呢???我都用 navicat 连上了呀!!!
  • 上边这句话里就存在题眼了:::navicat 和 localhost 肯定不是一个 host !!!
  • 问题就是你只改了其他host连接的root 密码,localhost的root密码没有改!!!
  • 但是为什么重启mysql容器的时候,会用 'root'@'localhost' 和 新密码 来个登陆???mysql还是不够了解啊。

4、docker mysql 修改密码的姿势

# 修改普通用户,只改一个就好
SET PASSWORD FOR 'youruser' = PASSWORD('xxxxxxxx');

# 修改root用户,改两个
SET PASSWORD FOR 'root' = PASSWORD('xxxxxxxxx');
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('xxxxxxxxx');

5、如果docker 容器已经在无限重启了

如果你只改了 % 的root,没有改 localhost的root密码,一旦容器重新启动,就完了!