docker下mysql的密码设置
- 初始操作
- 方法1
- 方法2
- 方法3
- 方法4
初始操作
拉取镜像
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;
(此部分为问题分析,可以不看)
注意:
- 不能直接将密码设为新密码。因为我们可以看到,
authentication_string
字段的值并非密码明文,而是经过加密后的一段码。如果我们直接通过 set 命令将其值设为新密码,重启后仍然无法通过该新密码进入 mysql 服务。 - 我们同样也不能直接用上一种方法进行密码设置。因为执行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.
即告诉我们要先设置好密码。