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 for 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’