docker下mysql的密码设置

docker下mysql的密码设置

初始操作

拉取镜像

docker pull mysql:xx.xx.xx(版本号,我的是5.7.28)

建立一个容器

(sudo) docker run -it --name xxx -v /path/to/your/宿主机数据存放目录:/var/lib/mysql 镜像名 /bin/bash

方法1

容器内登录 mysql 不需要密码,在网上找了很多方法设置密码也行不通。

mysql> use mysql
mysql> select * from user where User='';

如果出现条目,说明存在空项,将其删除即可,但对我这种情况没用。

方法2

mysql> use mysql
mysql> select * from user where User='root';
update user set authentication_string='密码' where User='root';

输入第二条命令后会发现密码(authentication_string)一栏是空的,执行第三条命令后再查询,虽然密码一栏是有了,但是重新登录mysql仍然不需要输入密码,失败。事实上,该方法本身存在错误,不能通过直接设置authentication_string字段值来设置密码。原因见第四个方法。

方法3

注意到在authentication_string旁有一个plugin字段,其值为auth_socket,该插件使得 mysql 在登录时不需要密码。相比之下,如果登录需要密码,其值应为mysql_native_password。知道问题后可以开始修改,修改方法并不是直接修改其值,而是执行:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';

重新登录mysql,需要输入密码,好了大功告成。

方法4

先对配置文件进行修改,使得mysql可以免密登录。

vim /etc/mysql/mysql.conf.d/mysqld.cnf

添加skip-grant-tables,如下所示:

[mysqld]
#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
skip-grant-tables

然后重启数据库服务,免密进入数据库,将密码设置为空。

mysql> use mysql
mysql> update user set authentication_string=‘’ where User='root';
flush privileges;

(此部分为问题分析,可以不看)
注意:

  1. 不能直接将密码设为新密码。因为我们可以看到,authentication_string字段的值并非密码明文,而是经过加密后的一段码。如果我们直接通过 set 命令将其值设为新密码,重启后仍然无法通过该新密码进入 mysql 服务。
  2. 我们同样也不能直接用上一种方法进行密码设置。因为执行ALTER USER xxx命令后,会报错:The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement。说明我们刚才添加的内容生效了,由于新增的--skip-grant-tables选项存在,系统不允许我们这样做。

综合以上原因,我们可以进行如下分析:为了修改密码,我们必须要用到上一种方法中的ALTER USER xxx,而该命令执行的前提是配置文件中没有--skip-grant-tables选项,该选项能让我们免密进入mysql。事实上,我们可以通过将authentication_string字段设为空来同样达到免密登录的效果。这样我们就能回过头取消配置文件中的--skip-grant-tables选项,再免密进入mysql,通过上一种方法修改密码。


继续陈述方法。当我们将密码设置为空后,回头将之前新增内容注释掉,即注释--skip-grant-tables这一项。随后我们重启数据库并再次进入,这时我们就可以使用上一种方法修改密码。即

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';

大功告成。


事实上,在执行上述命令修改密码前,我们无法执行其他mysql指令,否则会报错:
You must reset your password using ALTER USER statement before executing this statement.

即告诉我们要先设置好密码。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值