引言
在部署一个项目时,需要用到Mysql,为了方便起见,决定使用Docker来安装Mysql,但是在登陆Mysql时遇到了一个错误.
”Access denied for user ‘root’@’localhost’ (using password: YES)”
正文
原因:进入mysql报错:1045(28000), 原因:mysql5.7 首次安装后,需要修改root的默认密码才能使用
安装步骤
1.拉去Mysql镜像
docker pull mysql:5.7
2.创建挂载目录
mkdir /usr/local/mysql/data #用于挂载Mysql数据文件
mkdir /usr/local/mysql/conf.d #用于挂载mysql配置文件
3.启动容器
docker run -d -p 3306:3306
-v /usr/local/mysql/conf.d:/etc/mysql/conf.d
-v /usr/local/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=YOURPASSWORD
--name mysql mysql:5.7
--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
-d:后台运行
-v:目录映射
-p:端口映射
-e:设置默认密码,但是我设置了这个参数还是无法登陆,所以才有了后面的解决办法,如果能够设置了能够成功登陆的话那最好。后面的是为了解决不知道root密码的情况下的操作,所以这个参数可加可不加
处理Mysql 1045错误
利用初始化容器时产生的root随机密码
从log中获取密码
上面的docker run命令中使用的-d选项使容器 run 在后台运行。使用此命令监视容器的输出:
docker logs mysql #容器名
初始化完成后,命令的输出将包含为 root 用户生成的随机密码;检查密码,此命令:
docker logs mysql 2>&1 | grep GENERATED
从Contanier内连接到Mysql服务器
docker exec -it mysql bash #进入容器并在内部使用shell
mysql -uroot -p #进入Mysql,输入在log中找到的密码登陆
#重置root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
重启容器之后便可以使用设定好的密码登陆了,可以根据是否需要远程连接Mysql数据库更改root用户的连接权限
#利用先前的命令先进入mysql,再使用以下命令
use mysql; #选择数据库
#查看用户信息
select host, user, authentication_string, plugin from user;
#设置root为任意host连接
update user set host = "%" where user='root';
flush privileges; #刷新
跳过认证
1.在/usr/local/mysql/conf.d目录下增加文件:my.cnf
文件内容为
[mysqld]
skip-grant-tables
2.重启Mysql
docker restart mysql
3.进入容器中并登陆Mysql
docker exec -it mysql bash
mysql -uroot -p #此时是直接可以登陆的
4.设置root密码为空
use mysql;
select user,authentication_string,host from user;
update user set authentication_string='' where user='root';
flush privileges;
5.退出容器,把第一步的skip-grant-tables注释。再重启Mysql容器
6.使用 root用户,密码 回车键登录;
7.修改root密码
alter user 'root'@'localhost' IDENTIFIED BY 'password';
update user set host = "%" where user='root';
flush privileges;
修改root密码并设置任意主机连接完成。
Q.E.D.