拒绝访问; 您需要(至少一个)此操作的SUPER权限

ken*_*ter 52 mysql amazon-web-services amazon-rds

所以我尝试将sql文件导入rds(1G MEM,1个CPU).sql文件就像1.4G

mysql -h xxxx.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
Run Code Online (Sandbox Code Playgroud)

实际的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 */;;
Run Code Online (Sandbox Code Playgroud)

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

GRANT ALL PRIVILEGES ON db.* TO another_user@'localhost';
Run Code Online (Sandbox Code Playgroud)

仍然没有运气.

Jer*_*nes 114

如果您的转储文件没有DEFINER,请确保也删除下面的这些行(如果它们在那里),或者用 注释掉--

在开始时:

-- SET @@SESSION.SQL_LOG_BIN= 0;
-- SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
Run Code Online (Sandbox Code Playgroud)

在末尾:

-- SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过在“mysqldump”命令中添加“--set-gtid-purged=OFF”来防止这些问题。在这里找到:/sf/answers/3937634781/ (42认同)
  • @IllyaMoskvin 这对我有用。在我的 sql 工作台中导出日期后 --&gt; 高级选项 --&gt; set-gtid-purged - 将“SET @@GLOBAL.GTID_PURGED”添加到输出 --&gt; 设置为“OFF” (2认同)

hjp*_*r92 104

DEFINER=..从sqldump文件中删除该语句,或用其替换用户值CURRENT_USER.

RDS提供的MySQL服务器不允许DEFINER其他用户的语法(根据我的经验).

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

sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i oldfile.sql
Run Code Online (Sandbox Code Playgroud)

  • 出于某种原因,我不得不使用*代替+:````sed's /\sDEFINER =`[^`]*`@`[^`]*`//'-i oldfile.sql```` (4认同)
  • 没错 它不起作用的原因是,当登录的用户不具有SUPER特权(RDS本身不允许该特权)时,将另一个用户指定为DEFINER将允许任意特权升级-存储的程序以默认情况下是其DEFINER的凭据和特权(与调用用户的INVOKER相对)。另外[在服务器故障时](https://serverfault.com/a/555983/153161)。 (3认同)

小智 37

另一个有用的技巧是使用选项 --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;
Run Code Online (Sandbox Code Playgroud)

不确定 DEFINER 一个。

  • 谢谢!它在 RDS 的情况下帮助了我 (3认同)
  • 谢谢。我通过在 MySQL Workbench 中指定“--set-gtid-purged=OFF”解决了这个问题。 (2认同)

小智 12

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

sed识别 MacOS 中的模式,您必须在符号前添加反斜杠=,如下所示:

sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' file.sql
Run Code Online (Sandbox Code Playgroud)


nov*_*nja 11

完整解决方案

以上所有解决方案都很好。在这里,我将结合所有解决方案,以便它适用于所有情况。

  1. 固定定义器

适用于 Linux 和 Mac

sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' file.sql
Run Code Online (Sandbox Code Playgroud)

对于Windows
下载atom或notepad++,使用atom或notepad++打开转储sql文件,按Ctrl+F
搜索单词DEFINER,然后从任何地方删除行DEFINER= admin@%(或者对您来说可能略有不同)并保存文件。
例如,
删除该行之前:CREATE DEFINER= admin@PROCEDURE%MyProcedure
删除该行之后:CREATE PROCEDUREMyProcedure

  1. 删除 3 行 从转储文件中删除所有这 3 行。您可以使用sed命令或在 Atom 编辑器中打开文件并搜索每一行,然后删除该行。
    示例:在 Atom 中打开 Dump2020.sql,按 ctrl+F,搜索SET @@SESSION.SQL_LOG_BIN= 0,删除该行。
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
Run Code Online (Sandbox Code Playgroud)
  1. 生成的文件存在问题 如果生成的 dump.sql 文件不正确,您可能会遇到一些问题。但在这里,我不会解释如何生成转储文件。不过你可以问我( _ )


Gun*_*jan 7

我们新建RDS实例时,默认主用户不是root用户。但只能获得该数据库实例的某些权限。此权限不包括SET权限。现在,如果您的默认主用户尝试执行 mysql SET命令,那么您将面临以下错误:拒绝访问;您需要(至少)SUPER 或 SYSTEM_VARIABLES_ADMIN 权限来执行此操作

解决方案1

注释掉或删除这些行

SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 1;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
Run Code Online (Sandbox Code Playgroud)

解决方案2

您还可以通过使用 -f 选项加载转储文件的其余部分来忽略错误。

mysql -f <REPLACE_DB_NAME> -u <REPLACE_DB_USER> -h <DB_HOST_HERE> -p < dumpfile.sql
Run Code Online (Sandbox Code Playgroud)

  • 如果您将 mysqldump 通过管道传输到新数据库,解决方案 2 效果很好 (3认同)

avi*_*amg 6

问题:您正在尝试将数据(使用 mysqldump 文件)导入您的 mysql 数据库,但您似乎没有执行该操作的权限。

解决方案:假设您的 mysql 数据库中的数据已迁移、播种和更新,请使用 mysqldump 拍摄快照并将其导出到文件

mysqldump -u [username] -p [databaseName] --set-gtid-purged=OFF > [filename].sql
Run Code Online (Sandbox Code Playgroud)

从 mysql 文档:

GTID - 全局事务标识符 (GTID) 是在源服务器(主服务器)上创建并与提交的每个事务相关联的唯一标识符。此标识符不仅对于它起源的服务器是唯一的,而且在给定复制设置中的所有服务器中都是唯一的。所有事务和所有 GTID 之间存在一对一的映射。

--set-gtid-purged=OFF SET @@GLOBAL.gtid_purged 没有添加到输出中,SET @@SESSION.sql_log_bin=0 没有添加到输出中。对于未使用 GTID 的服务器,请使用此选项或 AUTO。如果您确定目标服务器上的 gtid_purged 中已经存在所需的 GTID 集并且不应更改,或者您计划手动识别和添加任何丢失的 GTID,则仅将此选项用于正在使用 GTID 的服务器。

然后使用 root 用户连接到您的 mysql,授予权限,刷新它们,并验证您的用户权限是否已正确更新。

mysql -u root -p
UPDATE mysql.user SET Super_Priv='Y' WHERE user='johnDoe' AND host='%';
FLUSH PRIVILEGES;
mysql> SHOW GRANTS FOR 'johnDoe';
+------------------------------------------------------------------+
| Grants for johnDoe                                               |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `johnDoe`                                  |
| GRANT ALL PRIVILEGES ON `db1`.* TO `johnDoe`                     |
+------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

现在重新加载数据,应该允许操作

mysql -h [host] -u [user] -p[pass] [db_name] < [mysql_dump_name].sql
Run Code Online (Sandbox Code Playgroud)


Har*_*var 5

问题

下面声明或列出您的转储文件创建问题

定义器= username@`%

简单的解决方案

您可以解决的解决方案是从SQL转储文件中删除所有条目并从GCP 控制台导入数据。

 cat DUMP_FILE_NAME.sql |  sed -e 's/DEFINER=`<username>`@`%`//g' > NEW-CLEANED-DUMP.sql
Run Code Online (Sandbox Code Playgroud)

上面的命令将有助于从转储文件中删除所有这些行,并在没有Definer 的情况下创建新的全新转储文件。

尝试导入新文件(NEW-CLEANED-DUMP.sql)。

如果您使用的是AWS RDS

您可能会遇到问题,如果您的转储文件较大,您可以使用以下命令检查前 20 行

head -30 filename
Run Code Online (Sandbox Code Playgroud)

一旦您可以看到输出,请查找行和行号

SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN; 
Run Code Online (Sandbox Code Playgroud)

我们将按行号删除这些行,例如 17,18,24 行号

sed -e '24d;17d;18d' file-name.sql > removed-line-file-name.sql
Run Code Online (Sandbox Code Playgroud)