华为云 RDS导入数据报错[Err] 1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation
解决:
华为云的RDS的root用户默认不提供super权限,可以参考:
https://support.huaweicloud.com/rds_faq/rds_faq_0075.html
这个问题可通过以下2个途径解决:
1、修改从Navicat导出来的sql文件,去掉“DEFINER=`root`@`xxx`”
2、使用mysqldump导出导入数据,可以参考:
https://support.huaweicloud.com/usermanual-rds/rds_migration_mysql.html
mysqldump --databases lhrdb --single-transaction --order-by-primary --hex-blob --no-data --routines --events --set-gtid-purged=OFF -u root -plhr@zr123 -h 121.36.12.84 -P 3306 |sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' -e 's/DEFINER[ ]*=.*FUNCTION/FUNCTION/' -e 's/DEFINER[ ]*=.*PROCEDURE/PROCEDURE/' -e 's/DEFINER[ ]*=.*TRIGGER/TRIGGER/' -e 's/DEFINER[ ]*=.*EVENT/EVENT/' -e 's/DEFINER[ ]*=.*SQL SECURITY DEFINER/SQL SECURITY DEFINER/' > d:\C.sql
--- MySQL替换掉“DEFINER=`root`@`xxx`”,避免RDS中错误:[Err] 1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation
mysqldump --databases lhrdb --single-transaction --order-by-primary --hex-blob --no-data --routines --events --set-gtid-purged=OFF -u root -plhr@zr123 -h 121.36.12.84 -P 3306 |sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' -e 's/DEFINER[ ]*=.*FUNCTION/FUNCTION/' -e 's/DEFINER[ ]*=.*PROCEDURE/PROCEDURE/' -e 's/DEFINER[ ]*=.*TRIGGER/TRIGGER/' -e 's/DEFINER[ ]*=.*EVENT/EVENT/' -e 's/DEFINER[ ]*=.*SQL SECURITY DEFINER/SQL SECURITY DEFINER/' > d:\C.sql
cat C:\Users\chinasoft_lhrxxt\Desktop\a.sql |sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' -e 's/DEFINER[ ]*=.*FUNCTION/FUNCTION/' -e 's/DEFINER[ ]*=.*PROCEDURE/PROCEDURE/' -e 's/DEFINER[ ]*=.*TRIGGER/TRIGGER/' -e 's/DEFINER[ ]*=.*EVENT/EVENT/' -e 's/DEFINER[ ]*=.*SQL SECURITY DEFINER/SQL SECURITY DEFINER/' > d:\b.sql
cat a.sql |sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' -e 's/DEFINER[ ]*=.*FUNCTION/FUNCTION/' -e 's/DEFINER[ ]*=.*PROCEDURE/PROCEDURE/' -e 's/DEFINER[ ]*=.*TRIGGER/TRIGGER/' -e 's/DEFINER[ ]*=.*EVENT/EVENT/' -e 's/DEFINER[ ]*=.*SQL SECURITY DEFINER/SQL SECURITY DEFINER/' > b.sql
root帐号为什么没有super权限
https://support.huaweicloud.com/rds_faq/rds_faq_0075.html
大部分的关系型数据库云服务平台,都未给root帐号提供super权限。因为一旦用户拥有了super权限,就可以执行很多管理性的命令,比如reset master,set global…,kill,reset slave等,这很有可能导致主备关系异常而出现故障。这一点是云服务平台和本地搭建MySQL比较大的区别,RDS提供服务化能力,那就需要保证实例的稳定正常运行。
对于客户要求super权限的场景,RDS可以提供服务化能力,也可以通过其他手段绕过super权限的限制。
举例如下:
- 举例1:有些用户喜欢登录数据库执行如下命令来修改参数,这在RDS是被禁止的,您只能通过RDS界面中的参数修改功能来实现。
set global 参数名=
参数值;
如果您的脚本中包含
set global命令导致super缺失,请删除
set global命令,通过console的参数修改。
- 举例2:有些用户执行如下命令报错,这也是因为没有super权限导致的,只需要去除
define='root’关键字即可。
create definer='root'@'%’ trigger(procedure)…
如果您缺失super权限,可以使用mysqldump导入数据,请参考
使用mysqldump迁移MySQL数据导入和导出数据。
- 举例3:如果您在创建PostgreSQL插件时缺少super权限,请参考
管理插件进行创建扩展。
使用mysqldump迁移MySQL数据
https://support.huaweicloud.com/usermanual-rds/rds_migration_mysql.html
迁移准备
华为云关系型数据库服务支持开启公网访问功能,通过弹性公网IP进行访问。您也可通过弹性云服务器的内网访问华为云关系型数据库。
- 准备弹性云服务器或可通过公网访问华为云关系型数据库。
- 在准备的弹性云服务器或可访问华为云关系型数据库的设备上,安装MySQL客户端。
请参见
如何安装MySQL客户端。

说明:
该弹性云服务器或可访问华为云关系型数据库的设备需要安装和RDS MySQL数据库服务端相同版本的数据库客户端,MySQL数据库或客户端会自带mysqldump和mysql工具。
导出数据
要将源数据库迁移到华为云关系型数据库,需要先对其进行导出。
须知:
- 相应导出工具需要与数据库引擎版本匹配。
- 数据库迁移为离线迁移,您需要停止使用源数据库的应用程序。
-
登录已准备的弹性云服务器,或可访问华为云关系型数据库的设备。
-
使用mysqldump将元数据导出至SQL文件。
须知:
MySQL数据库是华为云关系型数据库服务管理所必须的数据库,导出元数据时,禁止指定
--all-database参数,否则会造成数据库故障。
mysqldump
--databases <
DB_NAME>
--single-transaction --order-by-primary --hex-blob --no-data --routines --events --set-gtid-purged=OFF -u <
DB_USER>
-p -h <
DB_ADDRESS>
-P <
DB_PORT>
|sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' -e 's/DEFINER[ ]*=.*FUNCTION/FUNCTION/' -e 's/DEFINER[ ]*=.*PROCEDURE/PROCEDURE/' -e 's/DEFINER[ ]*=.*TRIGGER/TRIGGER/' -e 's/DEFINER[ ]*=.*EVENT/EVENT/' >
- DB_NAME为要迁移的数据库名称。
- DB_USER为数据库用户。
- DB_ADDRESS为数据库地址。
- DB_PORT为数据库端口。
- BACKUP_FILE为导出生成的文件名称
。
根据命令提示输入数据库密码。
示例如下:
mysqldump --databases rdsdb --single-transaction --order-by-primary --hex-blob --no-data --routines --events --set-gtid-purged=OFF -u root -p -h 192.168.151.18 -P 3306 |sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' -e 's/DEFINER[ ]*=.*FUNCTION/FUNCTION/' -e 's/DEFINER[ ]*=.*PROCEDURE/PROCEDURE/' -e 's/DEFINER[ ]*=.*TRIGGER/TRIGGER/' -e 's/DEFINER[ ]*=.*EVENT/EVENT/' > dump-defs.sql
Enter password:

说明:
若使用的mysqldump低于5.6版本,需要去掉“--set-gtid-purged=OFF”。
命令执行完会生成“dump-defs.sql”文件,如下:
[rds@localhost ~]$ ll dump-defs.sql
-rw-r-----. 1 rds rds 2714 Sep 21 08:23 dump-defs.sql
-
使用mysqldump将数据导出至SQL文件。
须知:
MySQL数据库是华为云关系型数据库服务管理所必须的数据库,导出元数据时,禁止指定
--all-database参数,否则会造成数据库故障。
mysqldump --databases <
DB_NAME>
--single-transaction --hex-blob --set-gtid-purged=OFF --no-create-info --skip-triggers
-u<
DB_USER>
-p
-h <
DB_ADDRESS>
-P <
DB_PORT>
-r <
BACKUP_FILE>
以上命令的参数说明如
2所示。
根据命令提示输入数据库密码。
示例如下:
mysqldump --databases rdsdb --single-transaction --hex-blob --set-gtid-purged=OFF --no-create-info --skip-triggers -u root -p -h 192.168.151.18 -P
3306 -r dump-data.sql

说明:
若使用的mysqldump低于5.6版本,需要去掉“--set-gtid-purged=OFF”。
命令执行完会生成“dump-data.sql”文件,如下:
[rds@localhost ~]$ ll dump-data.sql
-rw-r-----. 1 rds rds 2714 Sep 21 08:23 dump-data.sql
导入数据
通过弹性云服务器或可访问华为云关系型数据库的设备,用相应客户端连接华为云关系型数据库实例,将导出的SQL文件导入到华为云关系型数据库。
须知:
如果源数据库中包含触发器、存储过程、函数或事件调用,则需确保导入前设置目标数据库参数log_bin_trust_function_creators=ON。
-
导入元数据到华为云关系型数据库。
先用mysql工具连接华为云关系型数据库实例,输入密码后,再执行导入命令。
#
mysql -f -h
-P <
DB_PORT>
-u root
-p <
/dump-defs.sql
- RDS_ADDRESS为华为云关系型数据库实例的IP地址。
- DB_PORT为当前数据库实例的端口。
- BACKUP_DIR为“dump-defs.sql”所在目录。
示例如下:
# mysql -f -h 172.16.66.198 -P 3306 -u root -p < dump-defs.sql
Enter password:
-
导入数据到华为云关系型数据库。
#
mysql -f -h
-P <
DB_PORT>
-u root
-p
<
/dump-data.sql
- RDS_ADDRESS为华为云关系型数据库实例的IP地址。
- DB_PORT为当前数据库实例的端口。
- BACKUP_DIR为“dump-data.sql”所在目录。
示例如下:
# mysql -f -h 172.16.66.198 -P 3306 -u root -p < dump-data.sql
Enter password:
-
查看迁移结果。
mysql> show databases;
示例中,名为my_db的数据库已经被导入了:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| my_db |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
今天再复制服务器上数据库的时候(使用Mysql Workbench )提示1227错误,
数据库版本5.7.18,复制到的数据库也是5.7.18。
总结一下网上的几种方法:
方法一:
最直观的翻译是说权限的问题,一般是mysql的用户创建后没给权限,
select * from mysql.user where user='root'
查看权限后发现super_priv是为N,修改后导入还是无效;
方法二:
很多人是因为跨版本导入出现1227,然后说删除
SET @@SESSION.SQL_LOG_BIN= 0;
就能实现,我这边试了也不行;
最后是我的解决方法:
网上的方法我都试过还是导入不进去,
然后把提示中错误的地方都删掉,最后导入成功了- -,
其实和方法二很像,删除
红框的内容,
黄框是添加的内容(
把SET相关的都删了,就能导入成功了):
删除的前面2处地方是在sql的最开始,
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED='55a52aed-75e6-11e8-971f-246e96771c90:785864-787738,
569cf9ca-b336-11e8-be4e-501d93ecc0b8:1-10040';
最后一次在sql的尾部。
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;


About Me
 |
 |