mysqldump常用參數(shù)

首先,給出我的MySQL版本
SELECT  VERSION();
5.7.25-log
mysqldump的三種調(diào)用形式
  1. dump一張或者多張表
    mysqldump [options] db_name [tbl_name ...]
    
  2. dump一個或者多個庫
    mysqldump [options] --databases db_name ...
    
  3. dump所有庫
    mysqldump [options] --all-databases
    

調(diào)用說明

  1. 只有在后兩種調(diào)用模式下,才會出現(xiàn)建庫語句,所以,--add-drop-database也只會出現(xiàn)在后兩種調(diào)用模式下
  2. 全庫導(dǎo)出只會導(dǎo)出用戶庫和mysql
全量備份所有庫(基于binlog)
mysqldump \
    --all-databases \
    --set-charset \
    --default-character-set=utf8 \
    --create-options \
    --triggers \
    --routines \
    --events \
    --add-drop-database \
    --add-drop-table \
    --add-drop-trigger \
    --add-locks \
    --disable-keys \
    --extended-insert \
    --set-gtid-purged=OFF \
    --master-data=2 \
    --single-transaction \
    --quick \
    --flush-privileges \
    --flush-logs \
    --skip-opt \
    --result-file=/var/local/mysql/dump.sql \
    --log-error=/var/log/mysql/dump_error_log \
    -S /var/local/mysql/mysql.sock \
    -p \
參數(shù)說明
  1. --skip-opt
    --opt相當于
    --add-drop-table,
    --add-locks,
    --create-options,
    --disable-keys,
    --extended-insert,
    --lock-tables,
    --quick,
    --set-charset
    其中,--lock-tables--single-transaction互斥,為了避免歧義,這里禁用--opt,除了--lock-tables的其他選項手工指定
    經(jīng)過測試,這樣雖然不報錯,但是,導(dǎo)出的備份文件不對。明顯的兩個問題是沒有添加DROP TABLE語句,也就是說,--add-drop-table無效,還有,SOURCE這個導(dǎo)出文件的時候,會報錯,mysql.user表不存在。
    那就不要用這種自創(chuàng)參數(shù),給成如下格式

    mysqldump \
        --all-databases \
        --default-character-set=utf8 \
        --triggers \
        --routines \
        --events \
        --add-drop-database \
        --add-drop-trigger \
        --set-gtid-purged=OFF \
        --master-data=2 \
        --single-transaction \
        --flush-privileges \
        --flush-logs \
        --opt \
        --result-file=/var/local/mysql/dump.sql \
        --log-error=/var/log/mysql/dump_error_log \
        -S /var/local/mysql/mysql.sock \
        -p \
    
  2. --set-gtid-purged
    為ON會在導(dǎo)出的備份文件中加入
    SET @@GLOBAL.GTID_PURGEDSET @@SESSION.SQL_LOG_BIN= 0
    三種情況:

    1. 導(dǎo)出的文件用于本地備份,給成OFF
    2. 導(dǎo)出的文件用于從庫導(dǎo)入數(shù)據(jù),給成ON
    3. 導(dǎo)出的文件用于其他不相關(guān)節(jié)點,給成OFF
  3. --master-data=2
    會在導(dǎo)出的備份文件中加入
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=1474;
    這樣的注釋。

  4. --single-transaction
    將隔離級別設(shè)為RR,并在進行導(dǎo)出前,執(zhí)行START TRANSACTION。
    但是對于非事務(wù)性存儲引擎,還是會出現(xiàn)不一致性,
    所以,在備份過程中,禁止出現(xiàn)以下語句
    ALTER TABLE,
    CREATE TABLE,
    DROP TABLE,
    RENAME TABLE,
    TRUNCATE TABLE
    這個選項和--lock-tables互斥

  5. 不要使用--compact選項

    Produce more compact output. This option enables the --skip-add-drop-table,--skip-add-locks, --skip-comments,--skip-disable-keys,and --skip-set-charset options.

遺留問題
  1. 關(guān)于鎖
    經(jīng)過試驗,--add-locks會在導(dǎo)出的備份文件中的每個表的數(shù)據(jù)插入前后分別執(zhí)行
    LOCK TABLES table_name WRITE;UNLOCK TABLES;
    那么,如何查看出--lock-all-tables--lock-tables申請是什么樣的鎖呢?
    根據(jù)文檔,--master-data--single-transaction一起使用的時候會申請全局鎖FLUSH TABLES WITH READ LOCK。
    在這種情況下,在dump開始的時候,進程會申請鎖,一旦獲取鎖,就會得到the binary log coordinates (file name and position),同時,釋放鎖。所以,并不會hang住數(shù)據(jù)庫。
    --flush-logs--lock-all-talbes,--master-data或者--single-transaction一起使用的時候,也會申請全局鎖FLUSH TABLES WITH READ LOCK。如果想要保證dump文件和the binary log coordinates的一致性,要做到上述的--flush-logs--lock-all-talbes,--master-data或者--single-transaction一起使用。
    推測--lock-all-tables申請的鎖也是FLUSH TABLES WITH READ LOCK,但是在沒有--single-transaction的情況下,由于無法做到RR的隔離性,所以這個鎖會保持到備份完成,所以,在此期間,數(shù)據(jù)庫會hang住。而有了--single-transaction選項,因為通過隔離性保證了一致性讀,所以,一旦獲得了the binary log coordinates,鎖會立即釋放。
    至于--lock-tables,推測是申請的表級鎖,因為與--single-transaction互斥,所以并不推薦使用。
參考文檔

4.5.4 mysqldump — A Database Backup Program

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容