【问题标题】:Impacts of mysqldump with single-transaction argument带有单事务参数的 mysqldump 的影响
【发布时间】:2014-12-02 14:20:39
【问题描述】:

我发现一些文章表明运行“mysqldump -u user -p password --single-transaction schema > file.sql”是转储数据库而不是锁定表并确保状态一致的正确方法。

因此,我很乐观地认为,在我们的应用程序提供数据的同时转储我们的 100GB INNODB 数据库将对我们的应用程序性能产生最小的影响。然而,事实并非如此。我们的应用程序的日志表明 mysql 活动被阻止了 20 分钟(转储大约需要 90 分钟,所以只是其中的一部分)。不幸的是,我不知道它当时在做什么。

另外,“单一事务”如何工作?它怎么能不锁定表并及时捕获特定时刻?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这个问题可能更适合dba.stackexchange.com,不过……

    简单地说,带有--single-transaction 的MySQL 转储通过启动隔离级别设置为REPEATABLE READ 的事务来避免使用表锁。

    此读取是一种一致性读取(即同一事务期间的其他读取将看到原始行,即使其他人已更改它们)。从事务中再次查询相同的数据将看到原始快照。 MySQL 使用非常传统的MVCC 来实现这个快照。这可确保您在转储数据库时拥有一致的状态(转储事务看不到新的更改)。

    实际上在某些情况下仍然使用全表锁(--flush logs--master-data),但假设您的示例命令具有代表性,那么您并没有使用它们。

    除了--single-transaction 的解释之外,如果您的查询真正被锁定,我们需要更多信息。如果您知道您的查询何时被阻止,请在当时运行 SHOW FULL PROCESSLISTSHOW ENGINE INNODB STATUS 以帮助您缩小正在发生的事情的范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-26
      • 2013-10-04
      • 2018-12-24
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多