所以我尝试将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';

还是不走运。


当前回答

需要在服务器端设置“on”服务器参数“log_bin_trust_function_creators”。这一个你可以很容易地找到左侧刀片,如果它是蔚蓝玛丽亚db。

其他回答

只是一个MacOS额外更新hjpotter92的答案。

为了让sed在MacOS中识别这个模式,你必须在=号之前添加一个反斜杠,就像这样:

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

以上的方法对我来说都没用。我必须做到以下几点:

在mysqldump中使用以下标志: Mysqldump——databases <db1> <db2>——master-data=1——single-transaction——order- By-primary, force -r all。SQL -h<主机> -u<用户> -p<密码> 删除如下一行: 更改MASTER为MASTER_LOG_FILE='binlog..... 在我的文件中,这是第22行,所以我运行:sed -i '22d' all.sql 将数据导入RDS: Mysql -h<主机> -u<用户> -p<密码> $ source all.sql

如果要导入.sql.gz格式的数据库文件,请删除定义器并使用以下命令导入

zcat path_to_db_to_import.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db_name

之前,使用以下命令导出.sql.gz格式的数据库。 Mysqldump -u user -p old_db | gzip -9 > path_to_db_exported.sql.gz; 使用以下命令导入导出的数据库并删除定义器, zcat path_to_db_exported.sql.gz | sed - e ' s /定义者 [ ]*=[ ]*[^*]*\*/\*/' | 用户- p new_db mysql - u

在我的情况下(试图执行一个SQL文件到AWS RDS),我的SQL语句的开头是这样的:

DROP VIEW IF EXISTS `something_view`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `something_view`...

我所要做的就是删除上面语句中的ALGORITHM=UNDEFINED DEFINER='root'@'%' SQL SECURITY DEFINER部分。

所以新的语句是这样的:

CREATE VIEW 'something_view' ...

如果你的转储文件没有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来完全停止将这些行写入转储文件。