正确认识Access denied for user 'root'@'localhost' (using password: YES)

前言

项目临近上线,需要准备部署工作。项目在选择服务器的时候,最终领导确定的是自购服务器,为了确保工作顺利,刚好手上有一台新电脑,我开始从零配置服务器之路。一路遭遇的坎坷 ,难以形容。可能用多了阿里云的web界面之后,人的水平也下降很多。

Access denied for user ‘root’@’localhost’ (using password: YES) 是本地运维中遇到的最大的问题。血淋淋的教训。

由于废话较多,你可以直接看结尾。

整体过程

  • 安装系统
  • 配置端口映射
  • 配置防火墙
  • 安装docker
  • 安装docker-compose
  • 编写配置文件
  • 编写自动部署脚本
  • 运行项目

阶段问题:

  • 系统安装问题。

这里使用老毛桃软件,其中ISO模式进行系统安装。
镜像选择的是centos-7-x86_64-dvd-1511.iso
电脑修改启动项,进入u盘启动即可。

遇到的问题:U盘启动电脑进入安装界面,如果直接点击安装,会无法执行。

需要修改配置。这里查询了一大圈,都说是按 e键 进入配置修改。实际上我这里是按 table键。

记住是:

table键 table键 table键

此时进入修改配置,我的是 >vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdc4 quiet

这里的sdc4是我的u盘。要替换你的u盘名称。 我在另外一台电脑上u盘则是sdb4

如果查看u盘,可以不修改配置,安装报错时,此时可以输入shell命令。

输入
cd /dev
ls -l
自己寻找 sd类似的名词即可。

  • 端口映射问题。

由于服务器位于内网,需要外部能访问该服务器,则需要配置端口映射。公司内部使用的网康防火墙,配置位于 防火墙的 策略管理-地址转换。

这里切记:记得点击右上角生效按钮。否则会无效。我又没看到这个按钮。

  • 主机联网问题。

电脑插上网线之后,无法联网。检查了多次网卡设置,没发现异常。

最后我查看了另一台window服务器的配置,才注意到不能自动分配ip。需要手动给电脑指定ip地址。

  • 安装docker

本次服务器我使用docker进行部署。在安装后,发现无法启动docker的守护进程。

出现2个问题。
问题一: exec: “docker-proxy”: executable file not found in 《正确认识Access denied for user 'root'@'localhost' (using password: YES)》PATH.
则执行 sudo ln -s docker-runc-current docker-runc

最后结果如下:

cd /usr/libexec/docker/
[root@localhost docker]# ls -la
总用量 7400
drwxr-xr-x.  2 root root    4096 4月  11 15:26 .
drwxr-xr-x. 40 root root    8192 4月  16 13:40 ..
-rwxr-xr-x.  1 root root  820472 3月   8 01:07 docker-init-current
lrwxrwxrwx.  1 root root      20 4月  11 15:26 docker-proxy -> docker-proxy-current
-rwxr-xr-x.  1 root root 1687304 3月   8 01:07 docker-proxy-current
lrwxrwxrwx.  1 root root      19 4月  10 19:15 docker-runc -> docker-runc-current
-rwxr-xr-x.  1 root root 5047808 3月   8 01:07 docker-runc-current

问题二:service docker start 失败。
问题是配置异常。直接删除配置文件或者确保里面格式错误。确保格式是Json
以下是我的配置文件位置和内容:

[wuwenfu@localhost ~]$ cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
  • 安装docker-compose。

这里先安装pip。再安装docker-compose
没遇到问题。

  • 编写配置文件。
    yml配置文件的问题。
    分享下配置文件。java-web的yml
    这里要注意一个问题。由于我本人偷懒,对整体文件夹设置的777,导致mysql的配置文件也设置的777。而mysql官方会判断,如果权限为777 则忽略该配置文件。
    mysql的配置文件路径
    mysql/mysql.conf.d/mysqld.cnf

  • 自动部署的
    使用的jenkins的| publish-over-ssh插件。遇到个问题,文件无法进行传递。例如我的war包无法上传到指定服务器。我还未能解决这个问题。
    目前间接的解决方法:由于可以执行远程脚本。使用curl进行下载war部署。
    在jenkins的部署服务器上安装了nginx。将自动打包产生的war 拷贝到配置的web目录下。
    以下是我编写的shell脚本。
    该脚本的作用:记录部署日志;停止容器;下载war包;解压war包;删除war包;替换密码等;重新产生容器。

#!/bin/bash
td=`date -d today +"%Y-%m-%d"`
exec 1>>/home/wuwenfu/deploy-logs/out$td.txt
exec 2>>/home/wuwenfu/deploy-logs/error$td.txt
echo `date -d today +"%Y-%m-%d %H:%M:%S"`autodeploy
cd /home/wuwenfu/dockerfiles/lightai-web
docker-compose stop
curl -o /home/wuwenfu/dockerfiles/lightai-web/all-web/webapps/lightai-api.war  http://192.168.3.198:183/lightai-api.war
unzip -oq /home/wuwenfu/dockerfiles/lightai-web/all-web/webapps/lightai-api.war  -d /home/wuwenfu/dockerfiles/lightai-web/all-web/webapps/lightai-api
rm -f /home/wuwenfu/dockerfiles/lightai-web/all-web/webapps/lightai-api.war
sed -i 's/127.0.0.1/db/' /home/wuwenfu/dockerfiles/lightai-web/all-web/webapps/lightai-api/WEB-INF/classes/jdbc.properties
sed -i 's/127.0.0.1/redis/' /home/wuwenfu/dockerfiles/lightai-web/all-web/webapps/lightai-api/WEB-INF/classes/jedis.properties
sed -i '1,3s/NmCGbfcSs7M4nSrU/123456/' /home/wuwenfu/dockerfiles/lightai-web/all-web/webapps/lightai-api/WEB-INF/classes/jdbc.properties
docker-compose up -d --force-recreate
  • 运行项目。

所有的一切都弄好了。此时访问项目。出现如下问题

Access denied for user 'root'@'localhost' (using password: YES) 

这个问题真的很严重。它导致我怀疑人生。

出现这个问题,原因是:密码错误。是密码错误。

由于我的数据库配置文件是jdbc.properties

jdbc.type=mysql
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/lightai?useUnicode=true&characterEncoding=UTF8&useSSL=false&tinyInt1isBit=false
jdbc.username=root
jdbc.password=123456

# Configuration needs to be studied
c3p0.acquireIncrement=3  
c3p0.initialPoolSize=3  
c3p0.idleConnectionTestPeriod=60  
c3p0.minPoolSize=2  
c3p0.maxPoolSize=50  
c3p0.maxStatements=100  
c3p0.numHelperThreads=10
c3p0.maxIdleTime=600
c3p0.testConnectionOnCheckout=true
c3p0.preferredTestQuery=select 1 from net_logs

我反复检查了该文件。在确保没任何问题之后,依旧出现这个提示。此刻我已经迷茫了。

于是我开始了艰难的排除之路。从docker容器是否互通、mysql的权限等多个方面,依旧无法解决。最好我决定推倒本次的容器部署。使用传统的部署方式, 开始安装java运行环境。
但是让我伤心的依旧出现这个问题。

无奈之下,我只好发到微信群,咨询朋友。朋友就直接说了,密码不正确。我和他们辩论,我密码肯定对,使用工具都连接上了。说完这个之后,我突然顿悟了,赶紧查看 了下spring.xml
其中一个配置是

<!-- 配置c3p0连接池 开始 -->
    <bean id="myC3P0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClassName}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="xxxx"></property>
        <property name="acquireIncrement" value="${c3p0.acquireIncrement}"></property>
        <property name="initialPoolSize" value="${c3p0.initialPoolSize}"></property>
        <property name="maxIdleTime" value="${c3p0.maxIdleTime}"></property>
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}"></property>
        <property name="minPoolSize" value="${c3p0.minPoolSize}"></property>
        <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"></property>
        <property name="maxStatements" value="${c3p0.maxStatements}"></property>
        <property name="numHelperThreads" value="${c3p0.numHelperThreads}"></property>
        <property name="testConnectionOnCheckout" value="${c3p0.testConnectionOnCheckout}"></property>
        <property name="preferredTestQuery" value="${c3p0.preferredTestQuery}"></property>
        <property name="acquireRetryDelay" value="1000"></property>
        <property name="acquireRetryAttempts" value="60"></property>
        <property name="breakAfterAcquireFailure" value="false"></property>
    </bean>
    <!-- 配置c3p0连接池 结束 -->

看到密码那一栏,我眼一黑,什么时候我改的常量???
连忙修改过来,正确的配置是:

<!-- 配置c3p0连接池 开始 -->
    
        <property name="password" value="${jdbc.password}"></property>
        

访问项目。总算看到正常的画面了。欲哭无泪!

总结

Access denied for user 'root'@'localhost' (using password: YES) 

我的认知: 用户、密码都正确。但是没有访问数据库的权限。

该认知是错误的.

正确的认知:

你密码错误了。

对于 ERROR 1045 (28000): Access denied for user [‘root’@’localhost’] 此类错误返回时, (using password: ?)中?的关键字是YES还是NO,关键不在于用户是否存在,密码是否正确,它的结果取决于登录时,用户对于密码有没有字符串的输入,如果没有,MySQL数据库验证后,若出错返回此类信息,则应是 (using password: NO),若用户对密码有字符串的输入,返回的则是(using password: YES)。

    原文作者:有时右逝
    原文地址: https://www.jianshu.com/p/b1dd63a9b183
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞