为何DataGrip的DDL Mapping无法完整同步所有routines?


无法完整转储所有routines的常见原因
- 账号权限缺失
远程库连接账号如果没有全局查看存储过程/函数元数据的权限,仅能看到自己作为定义者、或被单独授权的routines,数据库会直接拦截其余对象的元数据查询请求,不会返回定义内容。MySQL系数据库可以执行SHOW GRANTS FOR CURRENT_USER();核对,确认账号是否持有SHOW ROUTINE权限、是否有mysql.proc表的查询权限,缺失对应权限的话找DBA授权即可。 - 同步过滤规则误开
DataGrip的DDL转储功能默认可能继承数据源的对象过滤规则,比如设置了仅同步特定名称前缀的对象、过滤系统对象、排除特定definer创建的routines,命中规则的对象会被直接排除在同步队列外。打开转储设置的对象过滤页,清空所有自定义过滤规则后重新扫描对象,核对计数是否和远程库一致即可排查。 - 方言解析兼容问题
如果远程数据库版本高于当前DataGrip内置的方言解析版本,部分使用了新语法、特殊注释、自定义选项的routines会被解析器判定为非法DDL,默认自动跳过同步。可以先把DataGrip升级到最新正式版,在转储高级设置里关闭Skip invalid DDL objects选项,重试时会直接抛出具体的解析报错,定位到异常对象后单独处理即可。 - 元数据拉取超时截断
882个routines的总定义文本量较大时,如果驱动侧配置的查询超时、结果集大小限制阈值过低,拉取过程中触发阈值会直接中断剩余请求,最终只保留拉取成功的前序对象。可以在数据源高级配置里把queryTimeout、networkTimeout参数调大到300秒以上,关闭结果集大小限制后重试。 - DEFINER安全策略拦截
部分数据库开启了routine定义者校验,如果待同步的routines绑定的DEFINER账号在本地DDL映射库不存在,同步逻辑会默认跳过这部分对象,避免同步后出现权限异常。可以在转储设置里开启Replace definer on dump选项,统一替换为本地存在的账号后再执行同步。
内容的提问来源于stack exchange,提问作者user1566268
相关产品推荐
相关产品推荐

