zoukankan      html  css  js  c++  java
  • MySQL--当mysqldump --single-transaction遇到alter table(1)

    部分生产环境采用mysqldump --single-transaction的方式在夜间进行数据库备份,而同事恰好在备份期间执行了alter table操作,操作部分成功部分失败,为啥呢?

    ##========================================================================##

    以下测试在MySQL 5.6.36上执行,该问题存在版本差异!

    MySQL 5.5 版本测试结果:《MySQL--当mysqldump --single-transaction遇到alter table(2)

    ##========================================================================##

    在mysqldump对single-transaction参数的解释为:

    Creates a consistent snapshot by dumping all tables in a
    single transaction. Works ONLY for tables stored in
    storage engines which support multiversioning (currently
    only InnoDB does); the dump is NOT guaranteed to be
    consistent for other storage engines. While a
    --single-transaction dump is in process, to ensure a
    valid dump file (correct table contents and binary log
    position), no other connection should use the following
    statements: ALTER TABLE, DROP TABLE, RENAME TABLE,
    TRUNCATE TABLE, as consistent snapshot is not isolated
    from them. Option automatically turns off --lock-tables.

    红色字体部分是重点,但是看得有些迷糊,还是动手测试下。

    根据《mysqldump的几个主要选项探究》的介绍,我们备份执行的命令mysqldump --single-transaction --master-data相当于执行下面代码:

    FLUSH TABLES;
    FLUSH TABLES WITH READ LOCK;
    SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    START TRANSACTION WITH CONSISTENT SNAPSHOT;
    SHOW MASTER STATUS;
    UNLOCK TABLES;
    
    SHOW TABLES LIKE 'xxx'
    SET OPTION SQL_QUOTE_SHOW_CREATE=1
    SHWO CREATE TABLE 'xxx'
    SHOW FIELDS FROM 'xxx'
    SHOW TABLE STATUS LIKE 'xxx'
    SELECT /*!40001 SQL_NO_CACHE */ * FROM  xxx
    
    QUIT

    场景1:mysqldump开始但尚未备份到表tb001时,另外回话对表tb001进行alter操作,然后mysqldump对表tb001进行导出

    alter操作顺利完成,但是mysqldump操作失败。

    场景2:mysqldump开始备份并完成tb001的导出,在对其他表进行导出过程中,其他回话对表进行alter操作

    alter table操作被阻塞直至mysqldump完成或失败后退出。

    使用mysqldump备份时,模拟场景2的环境,报错信息为:

    mysqldump: Error 1412: Table definition has changed, please retry transaction when dumping table `tb1002` at row: 0

    查看导出文件,最后内容为:

    --
    -- Dumping data for table `tb1002`
    --
    
    LOCK TABLES `tb1002` WRITE;
    /*!40000 ALTER TABLE `tb1002` DISABLE KEYS */;

    ##========================================================================##

    总结: 

    single-transaction参数通过Innodb的多版本来获得数据一致性,而ALTER TABLE, DROP TABLE, RENAME TABLE,TRUNCATE TABLE等操作会破坏数据一致性,两种操作不能并发执行。

    如果修改表操作在 ”mysqldump开启后但还未导出修改表数据前“ 的时间段内开始,则修改表操作成功完成,而mysqldump会执行失败;

    如果修改表操作在 “mysqldum已导出修改表数据但还未结束mysqldump操作前”的时间段内开始,则修改表操作被阻塞,mysqldum能成功完成,在mysqldump操作完成后修改表操作方可正常执行。

    ##========================================================================##

  • 相关阅读:
    使用python向Redis批量导入数据
    SkinSharp用法
    java设计模式演示样例
    [LeetCode] Search for a Range [34]
    Java 实现组合(Composite)模式
    机房收费系统重构中的一些感受
    qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果
    Windows下FFmpeg高速入门
    C# DataTable的詳細使用方法
    NGUI 3.5教程(六)Font字体
  • 原文地址:https://www.cnblogs.com/TeyGao/p/7121232.html
Copyright © 2011-2022 走看看