一般情况下,我们使用逻辑导出导入迁移存储过程、函数、视图存在如下问题:
如果环境中的用户信息没有迁移过去,在创建和调用中会存在问题
创建时的用户没有相应的权限:
ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER or SET_USER_ID privilege(s) for this operation
创建时用户不存在调用时报错:
ERROR 1449 (HY000): The user specified as a definer ('opensips'@'192.168.0.%') does not exist
在定义中有
DEFINER=`opensips`@`192.168.0.%` 定义者
SQL SECURITY DEFINER 访问安全有两种
SQL SECURITY DEFINER : 调用阶段根据调用者的权限进行判断是否可以调用,执行阶段根据DEFINER的账户权限判断操作是否可以继续执行。
SQL SECURITY INVOKER:调用阶段和执行阶段都根据调用者的权限进行判断操作是否可以继续
以上错误是我们在用myqldump导出时:
/usr/local/mysql/bin/mysqldump -S /tmp/mysql3312.sock -uroot -p'123456!' --hex-blob -R -E
--set-gtid-purged=OFF --databases opensips > opensips_20210802.sql;
在导出中视图过程会有:
定义的DEFINER=
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`opensips`@`192.168.0.%` SQL SECURITY DEFINER */
/*!50001 VIEW `wj_v_registrant` AS select `b`.`registrar` AS `registrar`
我们解决这个问题有如下方法
1.在导出是把过程,视图,函数中的DEFINER=替换掉可以sed命令
/usr/local/mysql/bin/mysqldump -S /tmp/mysql3312.sock -uroot -p'123456' --databases opensips \
--single-transaction --hex-blob --no-data --routines --events --set-gtid-purged=OFF \
|sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' -e 's/DEFINER[ ]*=.*FUNCTION/FUNCTION/' -e 's/DEFINER[ ]*=.*PROCEDURE/PROCEDURE/' -e 's/DEFINER[ ]*=.*TRIGGER/TRIGGER/' -e 's/DEFINER[ ]*=.*EVENT/EVENT/' > opensips-test.sql
2.可以通过mysqlshell 的util.dumpSchemas导出
util.dumpSchemas(['definers'], '/tmp/dump', {compatibility:["strip_definers"]})
要加上{compatibility:["strip_definers"]}
可以看到导入的视图中已经把define去掉了
--
-- Temporary view structure for view `wj_v_domain_route`
--
DROP TABLE IF EXISTS wj_v_domain_route;
/*!50001 DROP VIEW IF EXISTS wj_v_domain_route*/;
SET @saved_cs_client = @@character_set_client;
/*!50503 SET character_set_client = utf8mb4 */;
/*!50001 CREATE VIEW `wj_v_domain_route` AS SELECT
1 AS id,
1 AS caller_id_dpid,
1 AS callee_id_dpid,
1 AS trunk_group,
1 AS domain */;
SET character_set_client = @saved_cs_client;
~
导入:
MySQL 10.1.1.201:3321 ssl JS > util.loadDump('/tmp/opendump')
导入后查询:
mysql> select table_name,definer,SECURITY_TYPE from information_schema.views where TABLE_SCHEMA='opensips';
+-------------------+---------+---------------+
| TABLE_NAME | DEFINER | SECURITY_TYPE |
+-------------------+---------+---------------+
| wj_v_domain_route | root@% | INVOKER |
| wj_v_exten_route | root@% | INVOKER |
| wj_v_location | root@% | INVOKER |
| wj_v_oss_line | root@% | INVOKER |
| wj_v_registrant | root@% | INVOKER |
+-------------------+---------+---------------+
5 rows in set (0.00 sec)
3.导入后再进行重建,或者修改define (不推荐)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。