美文网首页我爱编程
正确认识Access denied for user 'root

正确认识Access denied for user 'root

作者: 有时右逝 | 来源:发表于2018-04-16 18:58 被阅读0次

    前言

    项目临近上线,需要准备部署工作。项目在选择服务器的时候,最终领导确定的是自购服务器,为了确保工作顺利,刚好手上有一台新电脑,我开始从零配置服务器之路。一路遭遇的坎坷 ,难以形容。可能用多了阿里云的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 PATH. sudo ln -s docker-proxy-current docker-proxy 问题原因是名字的问题。没有docker-proxy 需要将原本 docker-proxy-current 增加一个软连接docker-proxy 类似的问题都是如此。例如 exec: "docker-runc": executable file not found inPATH.
    则执行 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)。

    相关文章

      网友评论

        本文标题:正确认识Access denied for user 'root

        本文链接:https://www.haomeiwen.com/subject/svsekftx.html