MySQL备份还原到RDS问题处理
1、原因
出现[Msg] 1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation
错误是因为我们的MySQL对象的定义者大多使用 root 用户,但是 RDS 是不提供 root 用户的,所有就会在使用 RDS 还原时,由于定义者问题导致报错。
2、解决方法
在原始库上将对象的定义者修改成RDS使用的用户。
2.1 函数
查看函数、存储过程的定义
select db,definer,name,type,security_type from mysql.proc where db = '数据库名称';
修改方法,执行下列脚本,将得到的SQL执行一遍。
SELECT
CONCAT(
"update mysql.proc set DEFINER='RDS用户名称@%' where name ='",
NAME,
"' AND db='",
db,
"';"
) AS "执行此列语句"
FROM
mysql.proc
WHERE
db = '数据库名称';
2.2 视图
查看视图定义
SELECT TABLE_SCHEMA,TABLE_NAME,DEFINER,SECURITY_TYPE FROM information_schema.VIEWS where TABLE_SCHEMA = '数据库名称';
修改方法,执行下列脚本,将得到的SQL执行一遍。
SELECT
CONCAT(
"alter DEFINER=`RDS用户名`@`%` SQL SECURITY INVOKER VIEW ",
TABLE_SCHEMA,
".",
TABLE_NAME,
" as ",
VIEW_DEFINITION,
";"
) AS "执行此列SQL"
FROM
information_schema.VIEWS
WHERE
TABLE_SCHEMA = '数据库名称';
2.3 触发器
查看触发器定义
select TRIGGER_SCHEMA,TRIGGER_NAME,DEFINER from information_schema.triggers where TRIGGER_SCHEMA ='数据库名称';
修改办法,先在还原的库上执行 trigger_del 列,将触发器删掉,再复制 trigger_create 列信息,将创建触发器语句保留好,待RDS还原好之后再执行创建触发器命令。
SELECT
concat(
'drop trigger ',
TRIGGER_SCHEMA,
'.',
trigger_name,
';'
) AS trigger_del,
concat(
'create trigger ',
TRIGGER_SCHEMA,
'.',
trigger_name,
' ',
ACTION_TIMING,
' ',
EVENT_MANIPULATION,
' on ',
EVENT_OBJECT_SCHEMA,
'.',
EVENT_OBJECT_TABLE,
' for each row ',
ACTION_STATEMENT,
';'
) AS trigger_create
FROM
information_schema.`TRIGGERS`
WHERE
trigger_schema = '数据库名称'
整理:江苏国泰新点软件基础设施支持部