MySQL备份还原到RDS问题处理

有时候需要将Navicat导出的MySQL备份,还原至云服务器,云服务器厂商可能会提供一个非root权限账号,而创建视图、触发器等对象均是使用root权限,因此在导入云服务器时会报错,因此需要修改这些对象的定义者。

Posted by caosw on December 25, 2018

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 = '数据库名称'

整理:江苏国泰新点软件基础设施支持部