RDS for MySQL Mysqldump 常见问题和处理

RDS for MySQL Mysqldump 常见问题和处理

 

  • GTID 特性相关
  • 避免表级锁等待
  • 设置导出字符集
  • 其他导出时需要注意的选项
  • 举例
  • RDS for MySQL 不支持的选项
  • RDS for MySQL 逻辑备份

1. GTID 特性相关

MySQL 5.6 引入了 GTID 特性,因此随 5.6 版本分发的 mysqldump 工具增加了 --set-gtid-purged 选项。

# 选项名称 默认值 可选值 作用

1


set-gtid-purged


AUTO


ON, OFF, AUTO


是否输出 SET @@GLOBAL.GTID_PURGED 子句

  • ON:在 mysqldump 输出中包含 SET @@GLOBAL.GTID_PURGED 语句。
  • OFF:在 mysqldump 输出中不包含 SET @@GLOBAL.GTID_PURGED 语句。
  • AUTO:默认值;对于启用 GTID 实例,会输出 SET @@GLOBAL.GTID_PURGED 语句;对于没有启动或者不支持 GTID 的实例,不输出任何 GTID 相关信息。

因此对于使用 MySQL 5.6 及以上版本带有的 mysqldump 工具进行 RDS for MySQL 实例数据导出时设置该选项为 OFF。

注:

如果 mysqldump 设置 set-gtid-purged=ON  从 RDS for MySQL 5.5 或 5.1 版本实例导出数据,mysqldump 会提示下面的错误:

Error: Server has GTIDs disabled.
或者
mysqldump: Couldn’t execute ‘SELECT @@GTID_MODE’: Unknown system variable ‘GTID_MODE’ <1193>

  

2. 避免表级锁等待

mysqldump 默认会启用 lock-tables 选项,对要导出的表加表级锁,阻止表上的 DML 操作。

RDS for MySQL 实例默认支持的 InnoDB 和 TokuDB 引擎均支持事务,建议使用  single-transaction 选项进行导出,而不要设置 lock-all-tables 或 lock-tables 选项。

# 选项名称 默认值 可选值 作用
1 lock-all-tables FALSE FALSE,TRUE 在数据导出期间放置 global read lock,所有库下的所有表在导出期间为只读。自动关闭 lock-tables 和 single-transaction 选项。RDS 不支持该选项。
2 lock-tables TRUE FALSE,TRUE 导出期间在导出表上放置表级锁。默认开启。可以通过指定 --skip-lock-tables 选项来关闭。
3 single-transaction FALSE FALSE,TRUE 导出操作被放置在一个事务中执行。自动关闭 lock-tables 选项。

关于表级锁的情况,请参考:RDS for MySQL InnoDB表级锁等待

 

3. 设置导出字符集

如果不指定,mysqldump 默认使用 UTF8 字符集进行导出。

# 选项名称 默认值 可选值 作用
1 default-character-set UTF8 实例支持的字符集 mysqldump 到 RDS 实例导出连接的字符集

 

4. 其他导出时需要注意的选项

# 选项名称 默认值 可选值 作用
1 no-defaults NA NA 除了.mylogin.cnf,不读取任何选项文件
2 defaults-file=file_name NA NA 读取指定的选项文件
3 add-drop-database FALSE FALSE,TRUE 在 create database 语句前增加 drop database 语句
4 add-drop-table TRUE FALSE,TRUE 在 create table 语句前增加 drop table 语句,默认开启,使用选项 --skip-add-drop-table 来关闭。
5 add-locks TRUE FALSE,TRUE 在表相关语句前后增加 lock tables tab_name write; 和 unlock tables; 语句。这样在导入数据时可以加快数据导入。
6 compatible=name NA
ansi,postgresql,

oracle,mssql

增强与指定的数据库类型的兼容性
7 compact FALSE FALSE,TRUE 启用 --skip-add-drop-table, --skip-add-locks, --skip-comments, --skip-disable-keys, --skip-set-charset 选项
8 databases TRUE FALSE,TRUE 导出多个库。默认 mysqldump 将第一个名字识别为库,其后的名字识别为表。指定该选项后,mysqldump会将所有名称识别为库,并在每个库前增加 create database 和 use database 语句。
9 disable-keys TRUE FALSE,TRUE 在插入数据前后增加 /!40000 ALTER TABLE tab_name DISABLE KEYS / 和 /!40000 ALTER TABLE tab_name ENABLE KEYS / 语句来加速插入。该选项仅对 MyISAM 引擎表的非唯一索引有效。
10 events FALSE FALSE,TRUE 导出数据库内的计划事件(定时任务)
11 extended-insert TRUE FALSE,TRUE 使用扩展的 Insert 语句,一条 Insert 语句插入多行。
12 hex-blob FALSE FALSE,TRUE
以16进制导出 Binary、VarBinary、BLOB 类型数据。

如果跨版本迁移数据,建议增加该选项。

13 ignore-table=db.tab TRUE FALSE,TRUE 不导出某表或视图。格式:库名.表名(db.tab)。可以多次使用该选项来忽略多张表。
14 max-allowed-packet 24 MB 24 MB - 1 GB mysqldump 和 RDS 实例通信缓存最大值。默认24 MB。最大 1 GB。
15 no-create-db FALSE FALSE,TRUE 输出中不包含 create database 语句
16 no-create-info FALSE FALSE,TRUE 输出中不包含 create table 语句
17 no-data FALSE FALSE,TRUE 不导出数据
18 opt TRUE FALSE,TRUE 启用  --add-drop-table, --add-locks, --create-options --disable-keys, --extended-insert, --lock-tables, --quick, --set-charset; 可以通过指定 skip-opt 选项关闭默认 opt 选项。
19 dump-date TRUE FALSE,TRUE 如果指定了 --comments 选项(默认开启),在输出的注释中显示导出日期时间。
20 routines FALSE FALSE,TRUE 导出存储过程和函数(默认不导出)
21 result-file TRUE FALSE,TRUE 将输出重定向到文件
22 set-charset TRUE FALSE,TRUE 在导出文件中加上 set names default_chararacter_set
23 triggers TRUE FALSE,TRUE 导出表上的 Trigger

5. 举例

5.1 导出库 jacky 下的 teacher 表,包括表上的触发器,导出字符集是 utf8mb4

mysqldump --no-defaults -hxxx.mysql.aliyun.com -uuser_name -P3306 -ppass_word --set-gtid-purged=off --default-character-set=utf8mb4 --hex-blob --single-transaction --result-file=jacky_teacher.sql jacky teacher
# -p 选项指定密码,密码和选项间不要有空格
# -P 选项指定实例的端口
# -h 选项指定 RDS 实例的 URL 地址
# -u 选项指定使用的数据库用户
# 也可以使用下面的方式进行导出
mysqldump --no-defaults -hxxx.mysql.aliyun.com -uuser_name -P3306 -ppass_word --set-gtid-purged=off --default-character-set=utf8mb4 --hex-blob --single-transaction jacky teacher > jacky_teacher.sql

 

5.2 导出库 jacky,包括存储过程和函数,不含 lock tables 和 unlock tables 语句

mysqldump --no-defaults -hxxx.mysql.rds.aliyuncs.com -uuser_name -ppass_word -P3306 --set-gtid-purged=off --hex-blob --single-transaction --routines --skip-add-locks --result-file=jacky.sql jacky
# --routines — 导出库涉及的存储过程和函数
# --skip-add-locks — 输出中不包括 lock tables table_name write; 和 unlock tables; 语句

  

5.3 导出库 jacky,包括存储过程、函数、触发器、事件,不包括数据

mysqldump --no-defaults -hxxx.mysql.rds.aliyuncs.com -uuser_name -ppass_word -P3306 --set-gtid-purged=off --hex-blob --single-transaction --routines --events --no-data --result-file=jacky.sql jacky
# 触发器选项 --triggers 默认开启,因此不需要指定
# --events — 导出库涉及的定时事件(计划任务)
# --no-data — 不导出数据

 

5.4 导出库 jacky,不包括 库、表创建语句,不包括 drop table 语句

mysqldump --no-defaults -hxxx.mysql.rds.aliyuncs.com -uuser_name -ppass_word -P3306 --set-gtid-purged=off --hex-blob --single-transaction --no-create-db --no-create-info --skip-add-drop-table --result-file=jacky.sql jacky
# --no-create-db — 输出中不包括库的创建语句
# --no-create-info — 输出中不包括表的创建语句
# --skip-add-drop-table — 输出中不包括表的删除语句

 

5.5 导出库 jacky,jerry,jason,不包括表 jacky.teacher, jason.orders, jerry.sales

mysqldump --no-defaults -hxxx.mysql.aliyun.com -uuser_name -P3306 -ppass_word --set-gtid-purged=off --hex-blob --single-transaction --result-file=jacky_jerry_jason.sql --ignore-table=jacky.teacher --ignore-table=jason.orders --ignore-table=jerry.sales --databases jacky jerry jason
# --ignore-table — 指定不进行导出的表
# --databases — 指定要进行导出的数据库名称

 

5.6 导出库 jacky,包括存储过程和函数,尽量兼容 SQL SERVER 语法

mysqldump --no-defaults -hxxx.mysql.aliyun.com -uuser_name -P3306 -ppass_word --set-gtid-purged=off --compatible=mssql --routines --hex-blob --single-transaction --result-file=jacky_mssql.sql jacky
# --compatible=mssql — 增加对 SQL SERVER 的语法兼容性

 

6. RDS for MySQL 不支持的选项

# 选项名称 默认值 可选值 作用
1 all-databases FALSE FALSE, TRUE 导出所有数据库,包括 mysql
2 flush-logs FALSE FALSE, TRUE 导出前在实例中执行 flush logs; 命令
3 flush-privileges FALSE FALSE, TRUE 导出 mysql 系统库后,输出中包含 flush privileges; 命令
4 lock-all-tables FALSE FALSE, TRUE 在数据导出期间放置 global read lock,所有库下的所有表在导出期间为只读。自动关闭 lock-tables 和 single-transaction 选项。
5 tab=dir_name NA NA 在指定的目录下生成 tbl_name.sql 文件(包含表创建语句)和 以 tab 作为分隔符的tbl_name.txt文本格式的数据文件。
  • --all-databases: RDS for MySQL 普通用户对 mysql 库中部分表没有权限,因此不能导出全部库表。
# 错误信息:
mysqldump: Couldn’t execute ‘show create table slow_log‘: SHOW command denied to user ‘xxx’@’xx.xx.xx.xx’ for table ‘slow_log’ (1142)

 

  • --flush-logs: RDS for MySQL 普通用户没有 Reload 权限,因此不能执行 flush logs; 命令。
# 错误信息
mysqldump: Couldn’t execute ‘FLUSH TABLES’: Access denied; you need (at least one of) the RELOAD privilege(s) for this operation (1227)

 

  • --flush-privileges:因为 RDS for MySQL 不支持 mysql 系统库的导出,因此没必要使用该选项。
  • --lock-all-tables:因为 RDS for MySQL 普通用户没有 Reload 权限,因此不能使用该选项。
# 错误信息
mysqldump: Couldn’t execute ‘FLUSH TABLES’: Access denied; you need (at least one of) the RELOAD privilege(s) for this operation (1227)

 

  • --tab=dir_name:该选项要求 mysqldump 和 RDS for MySQL 实例在同一物理机上,因此不支持。但该选项可以和 --no-data 选项搭配使用来获取表的创建语句。
# 和 --no-data 选项搭配,获取 jacky 库下每个表的创建语句文件 tab_name.sql
mysqldump --no-defaults -uuser_name -ppass_word -hxxx.mysql.rds.aliyuncs.com -P3306 --set-gtid-purged=off --single-transaction --tab=/tmp --no-data jacky
# 不带 --no-data 选项(希望导出数据)时候的错误信息:
mysqldump --no-defaults -uuser_name -ppass_word -hxxx.mysql.rds.aliyuncs.com -P3306 --set-gtid-purged=off --single-transaction --tab=/tmp jacky
mysqldump: Got error: 1045: Access denied for user ‘xxx’@’%’ (using password: YES) when executing ‘SELECT INTO OUTFILE’

 

7. RDS for MySQL 逻辑备份

  • RDS for MySQL 支持实例和单库级别的逻辑备份。
  • 逻辑备份执行期间不会影响主实例的正常使用。
  • 逻辑备份导入权限问题请参考:RDS for MySQL权限问题(错误代码:1227,1725)
时间: 2025-01-24 13:12:01

RDS for MySQL Mysqldump 常见问题和处理的相关文章

RDS for MySQL 空间问题的原因和解决

RDS for MySQL 空间问题的原因和解决   1. 原因 2. 解决 2.1 Binlog 文件 2.2 数据文件 2.3 临时文件 2.4 系统文件 RDS for MySQL 实例日常使用中随着实例的使用,会出现空间使用告警甚至超过实例限额被锁定的情况. 比如:   1. 原因 Binlog 日志文件占用高 数据文件占用高 临时文件占用高 系统文件占用高 实例空间使用情况可以在 RDS 控制台监控报警中查看: 2. 解决 RDS 实例支持单独升级磁盘空间,升级磁盘空间是解决空间问题的

使用 RDS for MySQL 配置到自建数据库的主从复制

场景 出于数据容灾.ETL.异地数据访问等目的,可能需要基于 RDS for MySQL 实例,搭建到自己线下MySQL实例的主从复制.这篇文章将给出简单的操作步骤,供大家参考.由于要使用GTID特性,因此要求MySQL版本>=5.6. 前提条件 操作步骤 配置主实例 登录 RDS 控制台,选择目标实例. 配置从实例读取数据使用的只读账号和授权数据库. 将从实例的 IP 地址加入主实例的 IP 白名单中 如果从实例是部署在同一地域的 ECS 上,仅需配置该 ECS 的内网地址即可. 登录主实例

RDS for MySQL InnoDB 表级锁等待

RDS for MySQL InnoDB 表级锁等待   1. 显式 lock table 2. 隐式 lock table 在 RDS MySQL 实例日常使用中,有些情况下会发现出现 InnoDB 表级锁等待的情况,下面列出常见的2个原因.  1. 显式 lock table 执行了 lock tables tab_name read; 导致 DML 会话等待在表的表级锁上. 会话 1 lock tables tab_name read; 会话 2 会话 3   2. 隐式 lock tab

RDS for MySQL查询缓存 (Query Cache) 的设置和使用

功能和适用范围 原理 限制 设置 验证效果 1. 功能和适用范围 功能: 降低 CPU 使用率 降低 IOPS 使用率(某些情况下) 减少查询响应时间,提高系统的吞吐量 适用范围: 表数据修改不频繁.数据较静态 查询(Select)重复度高 查询结果集小于 1 MB 注: 查询缓存并不一定带来性能上的提升,在某些情况下(比如查询数量大,但重复的查询很少)开启查询缓存会带来性能的下降. 2. 原理 RDS for MySQL 对来自客户端的查询(Select)进行 Hash 计算得到该查询的Has

RDS for MySQL 字符序(collation)引发的性能问题

在帮客户排查问题的时候,经常会遇到的 RDS 实例性能问题(比如 RDS 实例 CPU 使用率高),而其中有一类是由于字符集的字符排序规则不一致导致的.从处理的过程中可以看出来,这类问题比较容易出现但不容易定位排查,所以今天通过两个实战案例来分析的下"RDS for MySQL 字符序(collation)引发的性能问题". 首先介绍下背景知识: 字符集 和 字符序. 1. 字符集(character set)和字符序(collation) 字符集是一组符号和编码,用来保存和解释 My

RDS for MySQL 使用 utf8mb4 字符集存储 emoji 表情

RDS for MySQL 使用 utf8mb4 字符集存储 emoji 表情 1. 基本原则 2. 三个条件的说明 2.1 应用客户端 2.2 应用到 RDS MySQL 实例的连接 2.3 RDS 实例配置 3. 通过 set names 命令设置会话字符集 1. 基本原则 如果要实现存储 emoji 表情到 RDS for MySQL 实例,需要应用客户端.到 RDS for MySQL 实例的连接.RDS 实例内部 3 个方面统一使用或者支持 utf8mb4 字符集. 注:关于 utf8

RDS for MySQL CPU 性能问题浅析

RDS for MySQL CPU 性能问题浅析 1. 原因 1.1 应用负载高 1.2 查询执行成本高 2. 解决方法2.1 相关工具 2.2 应用负载高 2.3 查询语句执行成本高 3. 避免出现的一般原则 RDS for MySQL 实例在日常使用中,会碰到 CPU 使用率达到 100% 的情况.比如: 1. 原因 根本原因:应用提交的查询访问的 逻辑读(逻辑 IO) 总量 (需要访问的 表 数据) 过高. 大量逻辑读会导致数据缓存 Buffer Pool 中用于维护数据一致性的 Latc

RDS for MySQL Online DDL 使用

RDS for MySQL Online DDL 使用   Online DDL 的限制 Online DDL 建议的选项 异常处理 RDS for MySQL 5.6 支持 Online DDL 特性. Online DDL (在线 DDL)功能允许在表上执行 DDL 的操作(比如创建索引)的同时不阻塞并发的 DML 操作 和 查询(select)操作.  注: 从低版本(比如 RDS for MySQL 5.5)升级到 RDS for MySQL 5.6,第一次执行 DDL 时有可能会因为表

RDS for MySQL InnoDB 行锁等待和锁等待超时的处理

RDS for MySQL InnoDB 行锁等待和锁等待超时的处理   1. InnoDB 引擎表行锁等待和等待超时发生的场景 2.InnoDB 引擎行锁等待情况的处理 2.1 InnoDB 行锁等待超时参数 innodb_lock_wait_timeout 2.2 大量行锁等待和行锁等待超时的处理 1. InnoDB 引擎表行锁等待和等待超时发生的场景 当一个 RDS for MySQL 连接会话等待另外一个会话持有的互斥行锁时,会发生 InnoDB 引擎表行锁等待情况. 通常情况下,持有该