为什么单事务的mysqldump比没有事务的mysqldump更一致?

Uda*_*day 7 mysql mysqldump

我已经阅读了手册,并且提到每个事务都会BEGIN在开始转储之前添加一个语句.有人可以用更容易理解的方式详细说明这一点吗?

这是我读到的:

此选项在从服务器转储数据之前发出BEGIN SQL语句.它仅适用于InnoDB和BDB等事务表,因为它会在发布BEGIN时转储数据库的一致状态,而不会阻塞任何应用程序."

有人可以详细说明这个吗?

Eri*_*lje 22

由于转储在一个事务中,因此您可以获得数据库中所有表的一致视图.这可能是一个反例最好的解释.假设您转储带有两个表的数据库,Orders并且OrderLines

  1. 您在没有单个事务的情况下启动转储.
  2. 另一个进程在Orders表中插入一行.
  3. 另一个进程在OrderLines表中插入一行.
  4. 转储处理OrderLines表.
  5. 另一个进程删除OrdersOrderLines记录.
  6. 转储处理Orders表.

在此示例中,您的转储将包含行OrderLines,但不包含Orders.如果在Orders和之间存在外键,则数据将处于不一致状态并且在还原时将失败OrderLines.

如果您在单个事务中完成了它,则转储将既没有订单也没有行(但它会保持一致),因为两者都被插入然后在事务开始后被删除.


Dan*_*ong 5

我曾经遇到过这样的问题:没有--single-transaction参数的mysqldump会因转储期间数据被更改而一直失败.据我所知,当您在单个事务中运行它时,它会阻止转储期间发生的任何更改导致问题.实质上,当您发出--single-transaction时,它会在此时获取数据库的快照并转储它,而不是转储在实用程序运行时可能正在更改的数据.

  • @Uday 不要太担心“如何”它是如何做到的,因为它取决于各种因素。对于各种不同的引擎,无论是 MySQL、MSSQL、Oracle 等等,这个概念都是一样的。 (2认同)

Cyl*_*ric 5

这对备份很重要,因为这意味着您可以获得所有数据,就像在某个时间点一样.

例如,想象一下一个简单的博客数据库,以及一些典型的活动可能

  1. 创建一个新用户
  2. 由用户创建新帖子
  3. 删除删除帖子的用户

现在,当您备份数据库时,备份可以按此顺序备份表

  1. 帖子
  2. 用户

如果有人备份到达#1 删除帖子所需的用户会发生什么?

还原数据时,您会发现您有一个帖子,但备份中不存在该用户.

围绕整个事务进行事务意味着备份不会看到备份期间在数据库上发生的所有更新,插入和删除.