Google Cloud SQL外接源MySQL搭建副本出现UNSUPPORTED_DEFINER报错问询
报错触发原因
该报错是Google Cloud SQL进行外部MySQL实例同步时的校验逻辑导致的:源库中视图、存储过程、触发器、事件等对象绑定了root@localhost作为DEFINER,Cloud SQL默认不允许host为localhost的DEFINER存在,要求修改为%。
无需修改源服务器的可行方案
方案1:Cloud SQL侧开启DEFINER校验跳过配置
直接修改待同步的Cloud SQL实例的数据库标志,不需要调整源端任何配置:
- 添加参数
cloudsql_external_sync_skip_definer_check,值设为on,直接跳过DEFINER合法性校验 - 同步添加参数
log_bin_trust_function_creators,值设为on,避免导入带DEFINER的存储函数时触发权限报错
方案2:本地处理备份文件剔除DEFINER
如果还处于备份导入初始化副本的阶段,在本地终端(不需要登录源服务器操作,仅需本地有数据库客户端工具即可)处理备份文件:
- 使用mysqldump导出源库备份时,添加
--skip-definer参数,导出的SQL文件会自动移除所有对象的DEFINER声明
mysqldump -u[源库用户名] -p[源库密码] -h[源库公网/内网地址] --skip-definer --databases [需要同步的库名] > backup.sql
- 如果已经导出了备份文件,直接在本地全局替换SQL文件中的
DEFINER=root@localhost字符串为空,或者替换为DEFINER=root@%,再导入到Cloud SQL即可
方案3:Cloud SQL侧开启DEFINER自动映射
如果使用的是MySQL 8.0及以上版本的Cloud SQL实例,可以配置DEFINER自动替换规则:
- 添加参数
cloudsql_rewrite_definer_to_host,值设为%,同步过程中所有DEFINER的host字段会自动替换为%,完全不需要修改源端DEFINER配置
以上方案均不需要修改源服务器的root用户host配置,也不会改动源库的任何现有数据。
内容的提问来源于stack exchange,提问作者Jimmy Pauwaert
相关产品推荐
相关产品推荐

