我已经阅读了手册,并且提到每个事务都会BEGIN在开始转储之前添加一个语句.有人可以用更容易理解的方式详细说明这一点吗?
这是我读到的:
此选项在从服务器转储数据之前发出BEGIN SQL语句.它仅适用于InnoDB和BDB等事务表,因为它会在发布BEGIN时转储数据库的一致状态,而不会阻塞任何应用程序."
有人可以详细说明这个吗?
Eri*_*lje 22
由于转储在一个事务中,因此您可以获得数据库中所有表的一致视图.这可能是一个反例最好的解释.假设您转储带有两个表的数据库,Orders并且OrderLines
Orders表中插入一行.OrderLines表中插入一行.OrderLines表.Orders和OrderLines记录.Orders表.在此示例中,您的转储将包含行OrderLines,但不包含Orders.如果在Orders和之间存在外键,则数据将处于不一致状态并且在还原时将失败OrderLines.
如果您在单个事务中完成了它,则转储将既没有订单也没有行(但它会保持一致),因为两者都被插入然后在事务开始后被删除.
我曾经遇到过这样的问题:没有--single-transaction参数的mysqldump会因转储期间数据被更改而一直失败.据我所知,当您在单个事务中运行它时,它会阻止转储期间发生的任何更改导致问题.实质上,当您发出--single-transaction时,它会在此时获取数据库的快照并转储它,而不是转储在实用程序运行时可能正在更改的数据.
这对备份很重要,因为这意味着您可以获得所有数据,就像在某个时间点一样.
例如,想象一下一个简单的博客数据库,以及一些典型的活动可能
现在,当您备份数据库时,备份可以按此顺序备份表
如果有人在备份到达#1 后删除帖子所需的用户会发生什么?
还原数据时,您会发现您有一个帖子,但备份中不存在该用户.
围绕整个事务进行事务意味着备份不会看到备份期间在数据库上发生的所有更新,插入和删除.
| 归档时间: |
|
| 查看次数: |
14977 次 |
| 最近记录: |