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

还是不走运。


当前回答

当我们创建一个新的RDS DB实例时,默认的主用户不是根用户。但仅获得该DB实例的某些特权。该权限不包括SET权限。现在,如果你的默认主用户试图执行mysql SET命令,那么你将面临这个错误:访问被拒绝;您需要(至少一个)SUPER或system_variable_admin权限来执行此操作

解决方案1

注释掉或删除这些行

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

解决方案2

您还可以使用-f选项来加载转储文件的其余部分,从而忽略这些错误。

mysql -f <REPLACE_DB_NAME> -u <REPLACE_DB_USER> -h <DB_HOST_HERE> -p < dumpfile.sql

其他回答

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

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

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

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

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

转储中的问题。

请尝试通过以下方式转储:

mysqldump -h databasehost --user=databaseusername --password --single-transaction databasename  | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | gzip > /tmp/database.sql.gz

然后,尝试按以下方式导入:

zcat /tmp/database.sql.gz | mysql -h database_host -u username -p databasename

如果要导入.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

当我们创建一个新的RDS DB实例时,默认的主用户不是根用户。但仅获得该DB实例的某些特权。该权限不包括SET权限。现在,如果你的默认主用户试图执行mysql SET命令,那么你将面临这个错误:访问被拒绝;您需要(至少一个)SUPER或system_variable_admin权限来执行此操作

解决方案1

注释掉或删除这些行

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

解决方案2

您还可以使用-f选项来加载转储文件的其余部分,从而忽略这些错误。

mysql -f <REPLACE_DB_NAME> -u <REPLACE_DB_USER> -h <DB_HOST_HERE> -p < dumpfile.sql