最近公司新项目,数据库表结构及基础数据从生产环境dump下SQL后部署在新环境中,应用程序部署完毕,登陆访问正常,但部分功能查询报错,查看应用程序日志报错:Acces denied for user 'web_test'@'192.168.1.%'(using password:yes)。
What? 再次确认程序使用账号密码正确,用mysql客户端测试连接也正常,最关键的是其他功能都能正常访问数据库!!!哪儿出了问题呢?经过与研发讨论确认出现问题的功能,都是需要访问视图!那么是数据库账号没有访问视图权限?但账号给的都是增删改查的权限,生产库上也一样的,为什么换了环境就不能用了呢?答案马上揭晓:
我们查看其中一个视图,show create view v_user;
具体如下:CREATE ALGORITHM=UNDEFINED DEFINER=`migrate`@`%` SQL SECURITY DEFINER VIEW `v_user` AS select ...
大家发现问题没有?细心同学会发现数据库账号不一样!问题就出在这儿,原来新环境中程序使用账号为web_test,而视图的DEFINER为原来线上账号migrate,但新环境中并没有migrate这个账号,导致视图无法访问。
解决办法:知道问题就好解决了,修改视图的DEFINER即可。
alter DEFINER='web_test'@'192.168.1.%' VIEW `v_user` AS select ...
很简单的一个问题,但排查起来很费力,数据库表结构迁移时很少会考虑到视图、存储过程的DEFINER账号,导致在新环境中各种折腾。。。