问题描述

在使用 Docker 部署 mysql8.0 并登录用户的时候报错:
Access denied for user 'root'@'localhost' (using password: YES)

问题分析
  1. Access denied : 拒接访问数据库
  2. using password: YES : YES 表示密码输入正确 / 当NO 时表示密码错误

其中最大的原因就是因为密码输入不正确,请认真检查输入的密码是否与容器启动时设置的是否一致
如果确认自己的明文密码是正确的,请参考解决办法一

场景

通过Docker 启动 Mysql8.0 并设置root密码

  1. 启动容器
#MYSQL_ROOT_PASSWORD=12346 指定root的登录密码
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12346 mysql
  1. 进入容器
docker exce -it mysql /bin/bash
  1. 登录mysql
mysql -uroot -p123456

这时候控制台打印: Access denied for user 'root'@'localhost' (using password: YES)

解决方案
一、设置MySql加密插件

通过Docker启动命令设置了root的密码(MYSQL_ROOT_PASSWORD=12346),但是登录的时候一直显示错误(Access denied for user ‘root’@‘localhost’ (using password: YES))。

如果确认自己的明文密码是正确的,原因有可能是mysql8.0使用的默认加密插件是 caching_sha2_password 而非5.6的 mysql_native_password,当你在控制台使用明文密码登录的时候走的是mysql_native_password加密,而数据库记录的是caching_sha2_password加密后的密码,匹配自然不正确。不过这样情况在数据库中出现的几率极低,这里只提供一种解决思路。

  1. 创建my.cnf配置文件
#my.cnf文件的存放路径根据自己需求自定义即可
vim /root/data/mysql/my.cnf

#编辑内容 在vi编辑器中输入以下内容
[mysqld]
default_authentication_plugin=mysql_native_password

#保存并退出vi编辑器 如何使用vi编辑器请自行百度 这里不再赘述
  1. 启动Mysql 容器
#重点在于挂载 mysql 的 my.cnf 配置文件
docker run -itd --name mysql -p 3306:3306 -v /root/data/mysql/my.cnf:/etc/mysql/my.cnf  -e MYSQL_ROOT_PASSWORD=123456  mysql
  1. 进入容器
docker exce -it mysql /bin/bash

可能出现的问题

Error response from daemon: Container b92df4476b1e8fc995b74e5f86b0c71471c725aae851c2847cbe629450a20102 is not running
如果控制台显示以上信息 说明容器未能启动成功
1)、查看容器日志
docker logs mysql
如果出现: [ERROR] [MY-010095] [Server] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Suppli value : /var/lib/mysql-files 说明容器启动时没有挂载mysql-files
2)、在docker run启动命令中添加 mysql-files 的挂载目录
docker run -itd --name mysql -p 3306:3306 -v /root/data/mysql/my.cnf:/etc/mysql/my.cnf -v /root/data/mysql/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 mysql

  1. 登录mysql
mysql -uroot -p123456
二、设置 root 无需密码验证即可登录

删除已经启动的mysql容器

#停止实例
docker stop mysql

#删除实例
docker rm mysql
  1. 启动容器
#把 MYSQL_ROOT_PASSWORD=12346 改成 MYSQL_ALLOW_EMPTY_PASSWORD=yes
#MYSQL_ALLOW_EMPTY_PASSWORD=yes 允许容器以空白密码登录root用户

docker run -itd --name mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql
  1. 进入容器
docker exce -it mysql /bin/bash
  1. 登录mysql
#不需要填写密码
mysql -uroot
  1. 设置root密码
#查看数据库
show databases;

#切换数据库
use mysql;

#设置密码
#PASSWORD EXPIRE NEVER 密码永不过期
#mysql_native_password 加密插件
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456' PASSWORD EXPIRE NEVER;
  1. 验证
#退出控制台
exit;

#登录
mysql -uroot -p123456
Logo

更多推荐