所以我尝试将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';
还是不走运。
如果它有帮助,当我试图在我的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';
然后我就能还原了。
当我们创建一个新的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
*答案可能只适用于MacOS *
当尝试将.sql文件导入docker容器时,我遇到了错误消息:
拒绝访问;您需要(至少一个)SUPER特权
这个操作
然后,在尝试其他一些建议时,我在MacOS (osx)上收到了以下错误
sed: RE错误:非法字节序列
最后,该资源的以下命令解决了我的“访问被拒绝”问题。
LC_ALL=C sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' fileName.sql
所以我可以导入到docker数据库:
docker exec -i dockerContainerName mysql -uuser -ppassword table < importFile.sql
希望这能有所帮助!:)
问题
下面的语句或行转储文件创建问题
DEFINER = username@”%
简单的解决方案
您可以绕过的解决方案是从SQL转储文件中删除所有条目,并从GCP控制台导入数据。
cat DUMP_FILE_NAME.sql | sed -e 's/DEFINER=`<username>`@`%`//g' > NEW-CLEANED-DUMP.sql
上面的命令将帮助从转储文件中删除所有这些行,并创建新的没有Definer的转储文件。
尝试导入新文件(new - cleaned - dump .sql)。
如果您使用AWS RDS
你可能会看到问题,如果你的转储文件较大,你可以检查前20行使用
head -30 filename
看到输出后,查找行和行号
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
我们将按行号删除这些行,例如17、18、24行号
sed -e '24d;17d;18d' file-name.sql > removed-line-file-name.sql