所以我尝试将sql文件导入rds (1G MEM, 1个CPU)。sql文件大约是1.4G

Mysql -h xx.rds.amazonaws.com -u user -ppass——max-allowed-packet=33554432 db < db.sql

它被卡在:

ERROR 1227 (42000) at line 374: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

实际的sql内容是:

/*!50003 CREATE*/ /*!50017 DEFINER=`another_user`@`1.2.3.4`*/ /*!50003 TRIGGER `change_log_BINS` BEFORE INSERT ON `change_log` FOR EACH ROW
IF (NEW.created_at IS NULL OR NEW.created_at = '00-00-00 00:00:00' OR NEW.created_at = '') THEN
        SET NEW.created_at = NOW();
END IF */;;

another_user在rds中不存在,所以我这样做:

GRANT ALL PRIVILEGES ON db.* TO another_user@'localhost';

还是不走运。


当前回答

我注释了*中所有以SET开头的行。SQL文件,它工作。

其他回答

如果你的转储文件没有DEFINER,确保下面的这些行也被删除(如果它们存在的话),或者用——

一开始:

-- SET @@SESSION.SQL_LOG_BIN= 0;
-- SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';

最后:

-- SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

注意,注释字符是“破折号空格”,包括空格。

更好的解决方案是通过在mysqldump命令中包含选项——set-gtid-purged=OFF来完全停止将这些行写入转储文件。

完整的解决方案

以上所有的解决方案都是好的。这里我要把所有的解结合起来这样它就适用于所有的情况。

固定的定义者

Linux和Mac

sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' file.sql

对于Windows 下载atom或notepad++,用atom或notepad++打开转储sql文件,按Ctrl+F 搜索单词DEFINER,并从所有位置删除行DEFINER=admin@%(或者可能对您来说稍有不同)并保存文件。 例如 CREATE DEFINER=admin@% PROCEDURE MyProcedure 删除这一行后:CREATE PROCEDURE MyProcedure

删除3条线 从转储文件中删除所有这3行。您可以使用sed命令或在Atom编辑器中打开该文件,搜索每一行,然后删除该行。 示例:打开Dump2020。sql在Atom,按ctrl+F,搜索SET @@会话。SQL_LOG_BIN= 0,删除该行。

SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

生成的文件有问题 如果您生成的转储文件可能会遇到一些问题。SQL文件不正确。但在这里,我不打算解释如何生成转储文件。但是你可以问我(_)

如果它有帮助,当我试图在我的AWS MySQL RDS上恢复一个DB转储时,我得到了这个错误:

ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER, 
SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation

我不需要更改DEFINER或删除/注释行。我刚刚做了:

GRANT SESSION_VARIABLES_ADMIN ON *.* TO myuser@'myhost';
GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO myuser@'myhost';

然后我就能还原了。

要么删除DEFINER=.语句,或者将用户值替换为CURRENT_USER。

RDS提供的MySQL服务器不允许其他用户使用DEFINER语法(以我的经验)。

你可以使用sed脚本从文件中删除它们:

sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i oldfile.sql

另一个有用的技巧是使用选项——set-gtid-purged=OFF调用mysqldump,它不会将以下行写到输出文件中:

SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

我不确定DEFINER。