MySQL 5.7存储过程与定义者问题及Tomcat系统迁移技术咨询
针对你在Tomcat迁移+MySQL 5.7存储过程定义者问题上的困扰,我整理了一套贴合你场景的解决方案,结合后续迁MariaDB的需求:
问题根源分析
MySQL 5.7相比5.6对DEFINER权限和SQL模式做了更严格的限制:
- 默认启用
NO_AUTO_CREATE_USER模式,导致创建DEFINER关联用户时必须显式指定密码,否则报错; - 对存储过程DEFINER的权限校验更严格,如果DEFINER用户不存在、无执行权限,或者所属数据库权限不足,都会触发执行失败;
- 部分旧存储过程的语法(比如隐式分组、日期格式)可能和5.7默认的sql_mode冲突。
分步解决方案
1. 先排查存储过程的DEFINER配置
首先确认所有存储过程的定义者信息,执行以下SQL:
SELECT DEFINER, ROUTINE_NAME, ROUTINE_SCHEMA FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE='PROCEDURE';
重点关注:
- DEFINER是否为不存在的用户(比如旧服务器上的专属账号,新服务器没创建);
- DEFINER用户是否拥有目标数据库的
EXECUTE权限(甚至读写权限,取决于存储过程的操作)。
2. 调整MySQL 5.7的sql_mode配置
默认的sql_mode里的NO_AUTO_CREATE_USER是常见坑点,建议先临时调整验证效果,再永久配置:
临时生效(重启MySQL后失效)
SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
永久生效
找到MySQL的配置文件(Linux是/etc/my.cnf或/etc/mysql/my.cnf,Windows是my.ini),在[mysqld]段添加:
sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
保存后重启MySQL服务。
3. 修复存储过程的DEFINER权限
情况1:DEFINER用户不存在
先创建用户并赋予必要权限:
-- 创建用户(替换成你的DEFINER账号和密码) CREATE USER 'old_definer_user'@'%' IDENTIFIED BY 'your_password'; -- 赋予目标数据库的执行权限(如果存储过程有写操作,可添加INSERT/UPDATE等权限) GRANT EXECUTE, SELECT, INSERT, UPDATE ON your_database.* TO 'old_definer_user'@'%'; -- 刷新权限 FLUSH PRIVILEGES;
情况2:替换DEFINER为新服务器的合法用户
如果不想保留旧用户,可以批量修改所有存储过程的DEFINER:
-- 生成批量修改的SQL脚本(替换new_definer和your_database) SELECT CONCAT('ALTER PROCEDURE ', ROUTINE_NAME, ' DEFINER = ''new_definer''@''localhost'';') FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'your_database' AND ROUTINE_TYPE = 'PROCEDURE';
执行生成的所有ALTER PROCEDURE语句即可完成批量替换。
4. 同步适配Tomcat 8.5/9的注意事项
因为你同时在做Tomcat版本迁移,这两个点别漏:
- 更新JDBC驱动:MySQL 5.7需要搭配
mysql-connector-java 5.1.47+或8.0.x版本,替换Tomcat/lib下的旧驱动包; - 调整数据源配置:在
context.xml里检查数据源参数,比如validationQuery用SELECT 1,确保testOnBorrow等连接池参数配置合理,避免Tomcat启动或运行时的连接异常。
5. 提前为MariaDB迁移做准备
MariaDB对MySQL存储过程的兼容性很高,可提前做这些验证:
- 把数据库备份恢复到测试环境的MariaDB(建议10.5+版本),执行所有存储过程,检查是否有语法或权限报错;
- 暂时将MariaDB的sql_mode调整为和MySQL 5.7一致的配置,平滑过渡后再根据MariaDB特性优化。
内容的提问来源于stack exchange,提问作者Bona Rae Villarta
相关产品推荐
相关产品推荐

