公司在阿里云上购买了两台mysql服务器,其中一台之前为了简单测试,只买了低配的3个月,因为即将到期需要将上面的测试库迁移到另一台。
阿里直接就提供了数据迁移的功能,好开心,按照指引一步步配置完就好了。然后问题来了。
1)RDS中必须创建高权限账号,下文称此为管理员账号,否则无法进行相关的操作,而且迁移时只是迁移了库表及数据,存储过程等并未被迁移。
2)后续做增量迁移是需要收费的,虽然费用很低,但是速度很慢。
由于增量迁移的速度太慢,且存储过程也无法迁移,于是想到了navicat中的同步工具,很快的数据和存储过程都同步好了,然后问题又来了。
为了保证安全等原因,并未对所有成员公开管理员账号,创建了一个新的用户,赋予相关的权限供正常开发测试使用,下文称测试账号,数据全部迁移完毕后用测试账户测试后,发现所有存储过程都无权访问,管理员账号已经赋予了测试账号相关权限了,还是无法访问。错误如下:
Java.sql.SQLException: User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted.......
开始查询资料,发现大家都说JDBC在调用存储过程时不仅要有execute的权限,还需要对mysql.proc具有访问权限,否则她无法访问metadata。选用如下方式解决:
grant select on mysql.proc to '测试账户'@'%'
但是管理员并没有这样grant的权限。
查看阿里云关于高权限账户的文档,发现只支持部分grant命令。
无意中看到有人说不要用高权限账号创建库表及存储过程,否则可能造成其他用户无法访问。
原来这才是问题的症结所在。
创建测试账户后,赋予相关权限,然后将数据迁移的操作在测试账户下进行即可。
写的真啰嗦。其实就是一个小问题而已。