美文网首页
MySQL数据库备份探究01

MySQL数据库备份探究01

作者: 黄埔陈超 | 来源:发表于2017-08-31 10:24 被阅读0次

    1.深度分析mysqldump --single-transaction 和不加该参数的内部实现机制。

    1.1 --single-transaction的作用

           此选项将事务隔离模式设置为REPEATABLE READ,并在转储数据之前向服务器发送START TRANSACTION SQL语句。它仅适用于诸如InnoDB这样的事务表,因为在发出START TRANSACTION时,它会转储数据库的一致状态,而不会阻止任何应用程序。

           使用此选项时,只有InnoDB表被转储为一致的状态。例如,使用此选项时转储的任何MyISAM或MEMORY表仍可能更改状态。

           在进行单事务转储时,为确保有效的转储文件(正确的表内容和二进制日志坐标),没有其他连接应使用以下语句:ALTER TABLE,CREATE TABLE,DROP TABLE,RENAME TABLE,TRUNCATE表。一致的读取并不与这些语句隔离,因此在转储表上使用它们可能导致由mysqldump执行的SELECT检索表内容以获取不正确的内容或失败。

          --single-transaction选项和--lock-tables选项是互斥的,因为LOCK TABLES导致任何未处理的事务被隐式提交。

           要转储大型表,请将--single-transaction选项与--quick选项相结合。

    1.2  --single-transaction的逻辑实现

    -- single-transaction备份日志

    1.设置事务隔离级别REPEATABLE READ

    2.创建事务一致性快照

    3.对所有表释放锁

    4.保持还原点

    5.处理表数据

    6.回滚到还原点

    1.3 普通备份 mysqldump  tbl_table  > dump.sql


    mysqldump普通备份日志

    普通备份对所有表建立本地读锁,然后再进行数据的处理。

    2.FLUSH TABLES WITH READ LOCK了解该锁是干什么的

    2.1 FLUSH TABLES WITH READ LOCK;

             建立一个读锁;使其他客户端可以在数据库目录中复制文件时继续查询表。 需要刷新以确保在开始备份之前将所有活动索引页写入磁盘。(关闭所有打开的表,并使用全局读锁锁定所有数据库的所有表。 如果您具有可以及时拍摄快照的文件系统(如Veritas或ZFS),这是一种非常方便的备份方式。 使用UNLOCK TABLES释放锁。

            具有READ LOCK的FLUSH表获取全局读取锁而不是表锁,因此它不会受到与LOCK TABLES和UNLOCK TABLES相关的表锁定和隐式提交的相同行为:

          1.UNLOCK TABLES仅当任何表当前已使用LOCK TAB锁定时才隐式提交任何活动的事务。 在FLUSH TABLES WITH READ LOCK之后,UNLOCK TABLES不会发生提交,因为后一个语句不会获取表锁。

          2.开始一个事务会导致使用LOCK TABLES获取的表锁被释放,就好像你已经执行了UNLOCK TABLES一样。 开始事务不会释放使用FLUSH TABLES WITH READ LOCK获取的全局读锁。

          3.FLUSH TABLES WITH READ LOCK和分布式XA事务不兼容

    注意:FLUSH LOGS,FLUSH TABLES WITH READ LOCK,FLUSH TABLES tbl_name ... FOR EXPORT在任何情况下都不会写入二进制日志,因为它们会在复制到从属设备时引起问题。

    2.2 FLUSH TABLEStbl_name[,tbl_name] ... WITH READ LOCK

            此语句刷新并获取命名表的读取锁。该语句首先获取表的独占元数据锁,因此它等待具有这些表的交易完成。然后该语句从表缓存中刷新表,重新打开表,获取表锁(如LOCK TABLES ... READ),并将元数据锁从独占级别降级为共享。在语句获取锁定和降级元数据锁之后,其他会话可以读取但不能修改表。

             因为此语句获取表锁,除了使用任何FLUSH语句所需的RELOAD特权之外,还必须为每个表提供LOCK TABLES特权。

             此语句仅适用于现有的基础(非TEMPORARY)表。如果名称引用基表,则使用该表。如果它是指TEMPORARY表,它将被忽略。如果名称适用于视图,则会发生ER_WRONG_OBJECT错误。否则,将发生ER_NO_SUCH_TABLE错误。

             使用UNLOCK TABLES释放锁,LOCK TABLES释放锁并获取其他锁,或START TRANSACTION释放锁并开始新的事务。

             此FLUSH TABLES变量使表能够在一个操作中刷新和锁定。它提供了一个解决方法,当有活动的LOCK TABLES ... READ时,不允许使用FLUSH TABLES。

              此语句不执行隐式UNLOCK TABLES,因此如果在存在任何活动的LOCK TABLES时使用该语句,或者在不首先释放所获取的锁的情况下再次使用该语句,则会导致错误。

    相关文章

      网友评论

          本文标题:MySQL数据库备份探究01

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