美文网首页
mysqldump常用参数

mysqldump常用参数

作者: 二手三流科学家 | 来源:发表于2019-04-26 21:33 被阅读0次
    首先,给出我的MySQL版本
    SELECT  VERSION();
    5.7.25-log
    
    mysqldump的三种调用形式
    1. dump一张或者多张表
      mysqldump [options] db_name [tbl_name ...]
      
    2. dump一个或者多个库
      mysqldump [options] --databases db_name ...
      
    3. dump所有库
      mysqldump [options] --all-databases
      

    调用说明

    1. 只有在后两种调用模式下,才会出现建库语句,所以,--add-drop-database也只会出现在后两种调用模式下
    2. 全库导出只会导出用户库和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 \
    
    参数说明
    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的其他选项手工指定
      经过测试,这样虽然不报错,但是,导出的备份文件不对。明显的两个问题是没有添加DROP TABLE语句,也就是说,--add-drop-table无效,还有,SOURCE这个导出文件的时候,会报错,mysql.user表不存在。
      那就不要用这种自创参数,给成如下格式

      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会在导出的备份文件中加入
      SET @@GLOBAL.GTID_PURGEDSET @@SESSION.SQL_LOG_BIN= 0
      三种情况:

      1. 导出的文件用于本地备份,给成OFF
      2. 导出的文件用于从库导入数据,给成ON
      3. 导出的文件用于其他不相关节点,给成OFF
    3. --master-data=2
      会在导出的备份文件中加入
      -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=1474;
      这样的注释。

    4. --single-transaction
      将隔离级别设为RR,并在进行导出前,执行START TRANSACTION
      但是对于非事务性存储引擎,还是会出现不一致性,
      所以,在备份过程中,禁止出现以下语句
      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. 关于锁
      经过试验,--add-locks会在导出的备份文件中的每个表的数据插入前后分别执行
      LOCK TABLES table_name WRITE;UNLOCK TABLES;
      那么,如何查看出--lock-all-tables--lock-tables申请是什么样的锁呢?
      根据文档,--master-data--single-transaction一起使用的时候会申请全局锁FLUSH TABLES WITH READ LOCK
      在这种情况下,在dump开始的时候,进程会申请锁,一旦获取锁,就会得到the binary log coordinates (file name and position),同时,释放锁。所以,并不会hang住数据库。
      --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的隔离性,所以这个锁会保持到备份完成,所以,在此期间,数据库会hang住。而有了--single-transaction选项,因为通过隔离性保证了一致性读,所以,一旦获得了the binary log coordinates,锁会立即释放。
      至于--lock-tables,推测是申请的表级锁,因为与--single-transaction互斥,所以并不推荐使用。
    参考文档

    4.5.4 mysqldump — A Database Backup Program

    相关文章

      网友评论

          本文标题:mysqldump常用参数

          本文链接:https://www.haomeiwen.com/subject/aujigqtx.html