mysqldump导入备份文件报错记录
mysqldump导入备份文件报错记录
【问题记录1】
目前遇到过两类报错,均主要是因为 GTID 引起,两类报错内容完全不同,但解决方法相同,报错内容具体如下:
第一类报错:
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
从错误信息看,似乎是用户权限不够。但是我们使用的是 root 用户(最高权限用户),因此猜测不是权限问题,其实不然。出现报错的原因主要是因为处于安全考虑,RDS For MySQL 的最高权限用户 root 是没有 super 权限的,自建用户也不能有super权限,但是用户执行导入的 SQL 中,包含需要super权限的语句,所以会报错。
如果源库开启了GTID特性,使用 mysqldump 导出数据时没有添加选项--set-gtid-purged=OFF 参数的话,导出的 SQL 中就会存在以下需要 super 权限执行的语句:
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
第二类报错:
@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty
报错含义为当前GTID_EXECUTED参数已经有值,而从集群导出来的dump文件中包含了SET @@GLOBAL.GTID_PURGED的操作,所以会产生如上的报错。
【解决方案1】
在dump导出时,添加--set-gtid-purged=off参数,避免将 gtid 信息导出
mysqldump -uroot -p --set-gtid-purged=off -all-databases > XXX.sql
2.直接修改备份生成的dump文件,移除其中的一些行 (注意:在修改之前,建议将备份文件再做一次备份)
--将这些需要 super 权限执行的行注释掉
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
这个操作可以将当前库的 GTID_EXECUTED 值置空,可以避免出现 GTID_EXECUTED 已有值导致报错的情况。
4.使用 source 方式导入,这种方式即使权限问题报错,剩余 sql 语句仍可继续执行,不影响最终数据
第一类报错主要是权限问题,可以使用方案 一、二、四解决;第二类报错可以使用如上一、二、三方案解决。
【问题记录2】
mysqldump -hrm-bp1f0fhwl31dp211e7o.mysql.rds.aliyuncs.com -ugitadmin -p --single-transaction -R -E --databases yongyou_oa > yongyou_oa.sql
Enter password:
mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"') FROM information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME = 'yongyou_oa' AND TABLE_NAME = 'addressbook';': Unknown table 'column_statistics' in information_schema (1109)
【解决方案2】
8.0 版的 mysqldump 默认启用的一个新标志,通过 - -column-statistics=0 来禁用他添加参数 column-statistics=0 即可