RDS MySQL mysqldump选项设置

GTID特性介绍

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

选项名称

默认值

可选值

作用

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 MySQL 5.5版本实例数据时,需要设置set-gtid-purged为OFF,否则会报以下错误:

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

避免表级锁等待

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

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

选项名称

默认值

可选值

作用

lock-all-tables

FALSE

TRUE|FALSE

在数据导出期间设置global read lock,所有库下的所有表在导出期间为只读。自动关闭lock-tables和single-transaction选项。RDS不支持该选项。

lock-tables

TRUE

TRUE|FALSE

导出期间在导出表上设置表级锁。默认开启。可以通过指定 skip-lock-tables选项来关闭。

single-transaction

FALSE

TRUE|FALSE

导出操作被放置在一个事务中执行。自动关闭lock-tables选项。

更多表级锁的内容请参见RDS MySQL中表级锁等待的介绍

设置导出字符集

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

选项名称

默认值

可选值

作用

default-character-set

UTF8

实例支持的字符集

设置导出的字符集。

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

选项名称

默认值

可选值

作用

no-defaults

NA

NA

除了.mylogin.cnf,不读取任何选项文件。

defaults-file=file_name

NA

NA

读取指定的选项文件。

add-drop-database

FALSE

TRUE|FALSE

在create database语句前增加drop database语句。

add-drop-table

TRUE

TRUE|FALSE

在create table语句前增加drop table语句,默认开启,使用选项skip-add-drop-table来关闭。

add-locks

TRUE

TRUE|FALSE

在表相关语句前后增加lock tables tab_name write和unlock tables语句。这样在导入数据时可以加快数据导入。

compatible=name

NA

ansi|postgresql|oracle|mssql

增强与指定的数据库类型的兼容性。

compact

FALSE

TRUE|FALSE

启用skip-add-drop-table、skip-add-locks、skip-comments、skip-disable-keys、skip-set-charset 选项。

databases

TRUE

TRUE|FALSE

导出多个库。默认mysqldump将第一个名字识别为库,其后的名字识别为表。指定该选项后,mysqldump会将所有名称识别为库,并在每个库前增加create database和use database语句。

disable-keys

TRUE

TRUE|FALSE

在插入数据前后增加/!40000 ALTER TABLE tab_name DISABLE KEYS / /!40000 ALTER TABLE tab_name ENABLE KEYS /语句来加速插入。该选项仅对 MyISAM 引擎表的非唯一索引有效。

events

FALSE

TRUE|FALSE

导出数据库内的计划事件(定时任务)。

extended-insert

TRUE

TRUE|FALSE

使用扩展的Insert语句,一条Insert语句插入多行。

hex-blob

FALSE

TRUE|FALSE

以16进制导出Binary、VarBinary、BLOB类型数据。如果跨版本迁移数据,建议增加该选项。

ignore-table=db.tab

TRUE

TRUE|FALSE

不导出某表或视图。格式:库名.表名(db.tab)。可以多次使用该选项来忽略多张表。

max-allowed-packet

24MB

24MB-1GB

mysqldump和RDS实例通信缓存最大值。默认24MB。最大1GB。

no-create-db

FALSE

TRUE|FALSE

输出中不包含create database语句。

no-create-info

FALSE

TRUE|FALSE

输出中不包含create table语句。

no-data

FALSE

TRUE|FALSE

不导出数据。

opt

TRUE

TRUE|FALSE

启用add-drop-table、add-locks、create-options、disable-keys、extended-insert、lock-tables、quick、set-charset,可以通过指定skip-opt选项关闭默认opt选项。

dump-date

TRUE

TRUE|FALSE

如果指定了comments选项(默认开启),在输出的注释中显示导出日期时间。

routines

FALSE

TRUE|FALSE

导出存储过程和函数(默认不导出)。

result-file

TRUE

TRUE|FALSE

将输出重定向到文件。

set-charset

TRUE

TRUE|FALSE

在导出文件中加上set names default_chararacter_set。

triggers

TRUE

TRUE|FALSE

导出表上的Trigger。

RDS MySQL 不支持的选项

选项名称

默认值

可选值

作用

all-databases

FALSE

实例支持的字符集

导出所有数据库,包括 mysql。

flush-logs

FALSE

TRUE|FALSE

导出前在实例中执行flush logs;命令。

flush-privileges

FALSE

TRUE|FALSE

导出MySQL系统库后,输出中包含flush privileges;命令。

lock-all-tables

FALSE

TRUE|FALSE

在数据导出期间放置global read lock,所有库下的所有表在导出期间为只读。自动关闭lock-tables和single-transaction选项。

tab=dir_name

NA

NA

在指定的目录下生成tbl_name.sql文件(包含表创建语句)和以tab作为分隔符的tbl_name.txt文本格式的数据文件。

原因说明

  • all-databases:RDS 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 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 MySQL不支持MySQL系统库的导出,因此没必要使用该选项。

  • lock-all-tables:RDS 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 MySQL实例在同一物理机上,因此不支持。但该选项可以和no-data选项搭配使用来获取表的创建语句。

    # 和no-data选项搭配,获取test库下每个表的创建语句文件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 test
    #  —no-daa 选希望导出数据)时候的错误信息:
    mysqldump  —no-defaults -uuser_name -ppass_word -hxxx.mysql.rds.aliyuncs.com -P3306 —set-gtid-purged=off —single-transaction —tab=/tmp test
    mysqldump: Got error: 1045: Access denied for user ‘xxx’@’%’ (using password: YES) when executing ‘SELECT INTO OUTFILE’