mysqldump导入备份文件报错记录

梦莱2年前技术文章1602

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】

解决方案主要有以下三种:

1.--set-gtid-purged=off

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;

3.reset master

这个操作可以将当前库的 GTID_EXECUTED 值置空,可以避免出现 GTID_EXECUTED 已有值导致报错的情况。

4.使用 source 方式导入,这种方式即使权限问题报错,剩余 sql 语句仍可继续执行,不影响最终数据

source  /tmp/dump.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 即可


相关文章

k8s删除Terminating状态的命名空间

问题描述Kubernetes中namespace有两种常见的状态,即Active和Terminating状态,其中Terminating状态一般会比较少见,当对应的命名空间下还存在运行的资源,但该命名...

数据湖技术之iceberg(一)数据湖的概念

数据湖技术之iceberg(一)数据湖的概念

1  数据湖概念1.1.  什么是数据湖数据湖是一个集中式的存储库,允许你以任意规模存储多个来源、所有结构化和非结构化数据,可以按照原样存储数据,无需对数据进行结构化处理,并运行不...

C++ 编程:程序组成部分 & 函数 & 输入

C++ 编程:程序组成部分 & 函数 & 输入

程序结构首先从一个最简单的程序来看 C++ 程序结构:第一部分:#include <iostream> 专业名词叫:预处理器编译指令 其实效果就类似于导包; 第二部分:main() 程序的...

HBase基本架构

HBase基本架构

架构角色: (1)Master Master 是所有 RegionServer 的管理者,负责监控集群中所有的 RegionServer 实例。主要作用如下: 管理元数据表格 hbase:meta,接...

压测实操--produce压测方案

压测实操--produce压测方案

环境信息:操作系统centos7.9,kafka版本为hdp集群中的2.0版本。 Producer相关参数使用Kafka自带的kafka-producer-perf-test.sh脚本进行压测,该脚本...

Helm部署

Helm部署

1、helm介绍在没使用helm之前,向Kubernetes部署应用,需要依次部署deployment、svc等,步骤教繁琐,况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,he...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。