3

Assuming that a backup takes 15 minutes, what happens to an INSERT query during a MySQL backup? Does it end up in the backup? What happens to the new row?

I got asked this question on an interview.

4

2 回答 2

3

使用mysqldump,这实际上取决于您使用的选项。该--opt标签很常见(一堆选项的简写)并且 contains --lock-tables,根据文档:

对于每个转储的数据库,在转储它们之前锁定所有要转储的表。在 MyISAM 表的情况下,表被 READ LOCAL 锁定以允许并发插入。对于诸如 InnoDB 之类的事务表,--single-transaction 是比--lock-tables 更好的选择,因为它根本不需要锁定表。

因此,如果您根本不锁定,则可能会出现不一致的表。如果您使用--lock-tables,您可能会有不一致的数据库。

这还取决于您使用的是 MyISAM 还是 InnoDB。

如果您从奴隶备份,--lock-all-tables是一个更好的选择。

通常,锁定任何生产数据库都是一个坏主意。

您还应该记住,从奴隶备份也可能很危险!您必须监视从属复制进度并确保它不会不同步。如果复制从属使用“MIXED”或“STATEMENT”模式,则副本本身可能与主控不一致,具体取决于所使用的查询(检查错误日志)。

还有一个选项可以使用InnoDB 的改进版本XtraDB 进行“热备份” 。

有些人还做延迟复制。这里还有一个关于MySQL 备份方法的页面。

至于备份过程中插入的行会发生什么:如果表被锁定,则 INSERT / UPDATE / DELETE 查询将挂起,如果锁定时间过长,最终会超时。超时间隔取决于配置。

我强烈建议仔细阅读mysqldump 文档

于 2013-08-07T07:01:27.293 回答
1

在这种情况下,备份可能不一致。您可以锁定您的表以防止这种情况发生。如果无法锁定表,则可以设置主从复制。从站可以被锁定并在解锁后获得最新的更改。

于 2013-08-07T06:46:45.023 回答