zoukankan      html  css  js  c++  java
  • 【转载】mysqldump的single-transaction和master-data

    先看一下--lock-tables和--lock-all-tables

     --lock-all-tables

    一次性锁定所有数据库的所有表,在整个dump期间一直获取global read lock;

    该选项自动关闭—lock-tables和—single-transaction;

    --lock-tables

    以database为单位,dump前锁定其下所有表;如果是Myisam表则采用 read local模式,允许同时insert;

    --opt自动启用—lock-tables;

    注:--opt包含--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset

    再看一下官方对于single-transaction的解释

    --single-transaction

    This option sets the transaction isolation mode to REPEATABLE READ and sends a START TRANSACTION SQL statement to the server before dumping data. It is useful only with transactional tables such as InnoDB, because then it dumps the consistent state of the database at the time when START TRANSACTION was issued without blocking any applications.

    When using this option, you should keep in mind that only InnoDB tables are dumped in a consistent state. For example, any MyISAM or MEMORY tables dumped while using this option may still change state.

    While a --single-transaction dump is in process, to ensure a valid dump file (correct table contents and binary log coordinates), no other connection should use the following statements: ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE. A consistent read is not isolated from those statements, so use of them on a table to be dumped can cause the SELECT that is performed by mysqldump to retrieve the table contents to obtain incorrect contents or fail.

    The --single-transaction option and the --lock-tables option are mutually exclusive because LOCK TABLES causes any pending transactions to be committed implicitly.

    To dump large tables, combine the --single-transaction option with the --quick option.

    可以总结出以下几点:

    1 只适用于innodb;

    2 需要repeatable read模式开启一个事务

    3 执行期间不阻碍DML和DDL,但是不要人工执行alter/create/drop/rename/truncate table;

    4  不能与lock-tables共用,后者执行的LOCK TABLES会隐式提交所有pending事务

    执行流程

    (1)SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

    (2)START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */

    (3)UNLOCK TABLES

    如果mysqldump只指定single-transaction,期间不会加锁也不会阻止任何的事务;

    --master-data

    默认启用—lock-all-tables,如果显示指定—single-transaction则弃用—lock-all-tables,此时只在dump开始时短暂获取global read lock;

    执行流程

    (1)FLUSH  TABLES

    (2)FLUSH TABLES WITH READ LOCK

    (3)SHOW MASTER STATUS

    同时使用Master-data和single-transaction可以对Innodb进行Online backup

    shell> mysqldump --all-databases --master-data --single-transaction > all_databases.sql

    执行流程

    (1)FLUSH   TABLES

    (2)FLUSH TABLES WITH READ LOCK

    (3)SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

    (4)START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */

    (5)SHOW MASTER STATUS

    (6)UNLOCK TABLES

    global read lock的持续时间很短,获取当前binlog的位置信息后立即释放;

    注意:

      在执行时如果当前有一个事务长时间没有结束,那么FLUSH TABLES WITH READ LOCK将会一直等待,而更加严重的是,阻塞的FLUSH TABLES WITH READ LOCK会进一步阻塞后续的DML,从而造成mysql hang;


    --dump-slave

    5.5引入了dump-slave选项,可对slave执行mysqldump,得出的change master to却是指向master,即使用slave创建一个新的slave;

    执行期间会停止slave sql thread,完成后自动恢复;

     MDL
    5.5有了MDL(Meta data lock),所以–single-transaction时,事务内操作过的表都会持有MDL,因此不会被DDL破坏。
    例如,mysqldump已经备份了a,b,c表,因为它们在事务内,事务还没提交,它们的MDL不会释放,因此另外的线程如果做a,b,c中任意一张表的DDL操作,都会出现Waiting for table metadata lock,而还没备份到的表不会持有MDL,因此还可以做DDL。
    http://www.penglixun.com/tech/database/the_process_of_mysqldump.html

  • 相关阅读:
    【图论】拓扑排序应用
    【图论】广度优先搜索和深度优先搜索
    最小生成树-Prim算法和Kruskal算法
    最短路径—Dijkstra算法和Floyd算法
    【图论】信手拈来的Prim,Kruskal和Dijkstra
    javascript获取iframe框架中页面document对象,获取子页面里面的内容,iframe获取父页面的元素,
    javascript 中的 true 或 false
    解决IIS7该问.svc文件的错误问题
    mysql常用函数
    异步上传文件,ajax上传文件,jQuery插件之ajaxFileUpload
  • 原文地址:https://www.cnblogs.com/hankyoon/p/5169775.html
Copyright © 2011-2022 走看看