在服务器上部署mysql,本地客户端登录报错。

docker部署命令:

docker run \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -v /home/data/mysql/conf:/etc/mysql/conf.d \
    -v /home/data/mysql/data:/var/lib/mysql:rw \
    -v /home/data/mysql/my.cnf:/etc/mysql/my.cnf \
    --name my_mysql \
    --restart=always \
    -d mysql:8.0

直接登录会报错:Access denied for user 'root'@'xx.xx.xx.xx' (using password: YES)

而且发现,直接在服务器上进入docker容器(docker exec -it containerId /bin/bash),登录mysql(mysql -u root -p),同样会报错:Access denied for user 'root' (using password: YES)

解决方式(本地试过可以这么解决,可能有更好的方式):

1、临时跳过权限验证(如果无法登录)

  • 停止容器:docker stop mysql_containerId
  • 暂时修改你挂载的 /data/mysql/my.cnf 文件,在 [mysqld] 部分添加:
[mysqld]
skip-grant-tables

  • 启动容器:docker start mysql_containerId

  • 再次进入容器:docker exec -it mysql_containerId /bin/bash

  • 现在无需密码即可登录MySQL:mysql -u root

2、修改root用户的认证插件和密码

在MySQL提示符下执行以下命令(注意替换 '123456' 为你的实际密码):

-- 刷新权限
FLUSH PRIVILEGES;
-- 修改认证插件和密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
-- 同样修改'root'@'%'(如果有)
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 再次刷新权限
FLUSH PRIVILEGES;

进入容器,查询mysql.user。

SELECT user, host FROM mysql.user;

发现root有2条数据,删掉host=localhost那一条。

delete from  mysql.user where user='root' and host='localhost';

注意:MySQL 8.0+ 中,localhost 和 %(允许所有主机远程连接)被视为不同的用户。

3、恢复权限验证

  • 退出MySQL和容器。

  • 从 /data/mysql/my.cnf 文件中移除 skip-grant-tables 行。

  • 重启容器:docker restart mysql_containerId

4、尝试重新登录

docker exec -it mysql_containerId /bin/bash

mysql -u root -p

输入密码 123456,看是否成功。

之后在本地使用客户端工具,发现可以正常登录。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐