一个诡异的crontab执行提示1045错误码的MySQL问题定位
来源:互联网 发布:淘宝代购海外直邮真假 编辑:程序博客网 时间:2024/04/29 01:45
问题描述
今天遇到一个诡异的MySQL问题,在命令行手动跑一个脚本可以执行成功,但是放到crontab执行时报下面的错误:
ERROR 1045 (28000): Access denied for user 'vtest'@'localhost' (using password: YES)
太诡异了,同一份代码,不同的执行方式,为什么执行结果会不一样呢。
定位过程一:权限问题
初步定位是用户权限问题,查看了用户权限都有
+-----------+-----------+| HOST | USER |+-----------+-----------+| % | root || % | vtest |+-----------+-----------+
而且在命令行也能连上:
mysql -uvtest -pxxxxType 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
定位过程二:网上查找
http://blog.csdn.net/nel0511/article/details/13091163
http://stackoverflow.com/questions/20353402/access-denied-for-user-testlocalhost-using-password-yes-except-root-user
都是说账号权限问题,试了也都不行。
定位过程三:日志定位
没有办法,最后只能通过加log来定位了。现在唯一确定的点是,对于同一份代码,命令行执行是正常的,crontab执行会提示失败,那把连接对象打印输出两者比较
crontab可以重定向输出:
* * * * * php /data/home/test.php >/u01/crontab.log 2>&1
两个对象打印出来仔细比对后发现用户的密码不一样,为什么同一份代码最后连接的密码会不一样呢,结合代码发现,mysql的账号密码是取环境变量值来判断要获取哪个环境的mysql连接配置。
通过crontab执行不会自动加载环境变量,而命令行在登陆时会默认读取了环境变量
解决改进
读取一下环境变量再执行:source /etc/profile;
* * * * * source /etc/profile; php /data/home/test.php >/u01/crontab.log 2>&1
总结
- 问题表象很诡异: 同样一份代码在命令行执行正常,但是到了crontab就提示错误
- 通过网上搜索的原因大多是权限和账号问题,感觉都不太靠谱,如果是账号问题为什么一个能执行成功,一个不行呢,花在账号权限配置和验证上
- 最后通过加日志的方式定位问题,每次验证都得等crontab日志,耗时较久。
- 一开始也感觉是环境变量的问题,但是只是不知道是怎么影响和导致结果的。
- 一个诡异的crontab执行提示1045错误码的MySQL问题定位
- crontab 执行mysql失败,提示无法通过mysql.sock连接的问题
- 一个诡异的问题
- 一个诡异的问题
- 一个诡异的问题
- maven 一个诡异的错误
- mysql 诡异的1054错误
- GDB定位诡异的FreeSWITCH编译问题
- 查找crontab未执行的问题,模拟一个crontab的执行环境
- 一个诡异的bash问题
- SqlParameter的一个诡异问题
- pyspider的一个诡异问题
- 一个诡异的Java问题
- crontab不执行的问题
- crontab执行失败的问题
- Composer 遇到一个诡异的错误,提示 Could not load package
- 一个粗心引起的诡异错误
- 记录一个诡异而简单的错误
- Android开发常用工具类
- sphinx+scws 全文检索使用之 sphinx配置文件详解
- 由文件的路径通过其他应用打开图片,PPT,Word,excel,PDF
- Mockito与PowerMock
- 回话跟踪技术Cookie
- 一个诡异的crontab执行提示1045错误码的MySQL问题定位
- 项目实践--跳动的小鸟
- 关于LeetCode中Implement strStr()一题的理解
- 动手写一个Android数据加载时界面状态切换的开源库
- {模板}网络流Dinic
- 分布式系统的思考及CAP理论
- 在Windows操作系统中,如何终止占有的8080端口的tomcat进程
- poj1611 - The Suspects
- Mockito mock类部分方法