前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql迁移存储过程函数视图存在的问题

mysql迁移存储过程函数视图存在的问题

原创
作者头像
wangwei-dba
修改2021-08-04 14:15:56
1.6K0
修改2021-08-04 14:15:56
举报
文章被收录于专栏:mysql-dba

一般情况下,我们使用逻辑导出导入迁移存储过程、函数、视图存在如下问题:

如果环境中的用户信息没有迁移过去,在创建和调用中会存在问题

代码语言:javascript
复制
创建时的用户没有相应的权限:
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导出时:

代码语言:javascript
复制
/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; 

在导出中视图过程会有:

代码语言:javascript
复制
定义的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命令

代码语言:javascript
复制
/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导出

代码语言:javascript
复制
util.dumpSchemas(['definers'], '/tmp/dump', {compatibility:["strip_definers"]})

要加上{compatibility:["strip_definers"]}

可以看到导入的视图中已经把define去掉了

代码语言:javascript
复制
--
-- 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档