正确认识Access denied for user 'root
前言
项目临近上线,需要准备部署工作。项目在选择服务器的时候,最终领导确定的是自购服务器,为了确保工作顺利,刚好手上有一台新电脑,我开始从零配置服务器之路。一路遭遇的坎坷 ,难以形容。可能用多了阿里云的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-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)。