该结论使用于java启动报错 也试用于windows连接报错 不止linux docker
一、直接说结论,再来说原因和我的bug寻找过程:
1.配置文件的mysql或者命令参数的密码需要带英文单引号
2.不可以挂载之前别的容器使用过的mysql数据目录或者你的执行命令里改过密码,比如之前是run mysql password 123 你改成了run mysql password 456
二、排查和分析:
环境:centons7
docker部署时命令如下:
#原部署文件代码
mysql:
image: mysql:latest
container_name: mysql_app
environment:
# 时区上海
TZ: Asia/Shanghai
# root 密码
MYSQL_ROOT_PASSWORD: 011234
# 初始化数据库(后续的初始化sql会在这个库执行)
MYSQL_DATABASE: appdatabase
ports:
- "3307:3306"
volumes:
- "/app/mysql/data:/var/lib/mysql"
- "/app/mysql/init:/docker-entrypoint-initdb.d"
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
通过docker将服务部署完后,navicat连接报错,密码错误,于是我尝试进入mysql容器登录 发现也报错。
于是我便查找网上的方法 清一色全是改密码。没卵用,你每次启动容器都去改一次密码???还麻烦的要死 况且在容器内你怎么改配置文件改密码。。。
于是我开始尝试把docker compose用gpt改成docker run 一条命令一条命令删除执行删除执行
最终发现gpt的密码多了单引号,于是我在命令里加了单引号 成功连接不报错
然后我以为解决了 我又把密码改成了‘123’,发现又报错密码错误了
这时候我开始分别一条条删除以下的附加命令分别run执行,最后定位到data目录这句删了以后就连接不报错了
ports:
- "3307:3306"
volumes:
- "/app/mysql/data:/var/lib/mysql"--------------关键报错代码
- "/app/mysql/init:/docker-entrypoint-initdb.d"
privileged: true
restart: always
于是我得出结论:
mysql8登录第一次遇到MYSQL_ROOT_PASSWORD时会自动把该密码尽兴登录,生成一个秘钥放在mysql的数据文件里面,命令里带的MYSQL_ROOT_PASSWORD密码是个参数,除了第一次运行mysql带上会设置密码生成秘钥,其他次启动而不是设置mysql的密码,而是作为参数去验证这个最初的秘钥是否核对正确,于是我进入挂载的data目录,发现我的猜想是对的。至此结束。文章来源:https://www.toymoban.com/news/detail-826040.html
文章来源地址https://www.toymoban.com/news/detail-826040.html
到了这里,关于linux docker 部署mysql8以上版本时弹出Access denied for user root @ localhost (using password: YES)的解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!