GTID 特性相关避免表级锁等待设置导出字符集其他导出时需要注意的选项举例RDS for MySQL 不支持的选项RDS for MySQL 逻辑备份
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>
mysqldump 默认会启用 lock-tables 选项,对要导出的表加表级锁,阻止表上的 DML 操作。
RDS for MySQL 实例默认支持的 InnoDB 和 TokuDB 引擎均支持事务,建议使用 single-transaction 选项进行导出,而不要设置 lock-all-tables 或 lock-tables 选项。
#选项名称默认值可选值作用1lock-all-tablesFALSEFALSE,TRUE在数据导出期间放置 global read lock,所有库下的所有表在导出期间为只读。自动关闭 lock-tables 和 single-transaction 选项。RDS 不支持该选项。2lock-tablesTRUEFALSE,TRUE导出期间在导出表上放置表级锁。默认开启。可以通过指定 --skip-lock-tables 选项来关闭。3single-transactionFALSEFALSE,TRUE导出操作被放置在一个事务中执行。自动关闭 lock-tables 选项。关于表级锁的情况,请参考:RDS for MySQL InnoDB表级锁等待
如果不指定,mysqldump 默认使用 UTF8 字符集进行导出。
#选项名称默认值可选值作用1default-character-setUTF8实例支持的字符集mysqldump 到 RDS 实例导出连接的字符集
ansi,postgresql,
oracle,mssql
增强与指定的数据库类型的兼容性7compactFALSEFALSE,TRUE启用 --skip-add-drop-table, --skip-add-locks, --skip-comments, --skip-disable-keys, --skip-set-charset 选项8databasesTRUEFALSE,TRUE导出多个库。默认 mysqldump 将第一个名字识别为库,其后的名字识别为表。指定该选项后,mysqldump会将所有名称识别为库,并在每个库前增加 create database 和 use database 语句。9disable-keysTRUEFALSE,TRUE在插入数据前后增加 /!40000 ALTER TABLE tab_name DISABLE KEYS / 和 /!40000 ALTER TABLE tab_name ENABLE KEYS / 语句来加速插入。该选项仅对 MyISAM 引擎表的非唯一索引有效。10eventsFALSEFALSE,TRUE导出数据库内的计划事件(定时任务)11extended-insertTRUEFALSE,TRUE使用扩展的 Insert 语句,一条 Insert 语句插入多行。12hex-blobFALSEFALSE,TRUE以16进制导出 Binary、VarBinary、BLOB 类型数据。
如果跨版本迁移数据,建议增加该选项。
13ignore-table=db.tabTRUEFALSE,TRUE不导出某表或视图。格式:库名.表名(db.tab)。可以多次使用该选项来忽略多张表。14max-allowed-packet24 MB24 MB - 1 GBmysqldump 和 RDS 实例通信缓存最大值。默认24 MB。最大 1 GB。15no-create-dbFALSEFALSE,TRUE输出中不包含 create database 语句16no-create-infoFALSEFALSE,TRUE输出中不包含 create table 语句17no-dataFALSEFALSE,TRUE不导出数据18optTRUEFALSE,TRUE启用 --add-drop-table, --add-locks, --create-options --disable-keys, --extended-insert, --lock-tables, --quick, --set-charset; 可以通过指定 skip-opt 选项关闭默认 opt 选项。19dump-dateTRUEFALSE,TRUE如果指定了 --comments 选项(默认开启),在输出的注释中显示导出日期时间。20routinesFALSEFALSE,TRUE导出存储过程和函数(默认不导出)21result-fileTRUEFALSE,TRUE将输出重定向到文件22set-charsetTRUEFALSE,TRUE在导出文件中加上 set names default_chararacter_set23triggersTRUEFALSE,TRUE导出表上的 Trigger
--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’
