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.
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.
使用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 文档。
在这种情况下,备份可能不一致。您可以锁定您的表以防止这种情况发生。如果无法锁定表,则可以设置主从复制。从站可以被锁定并在解锁后获得最新的更改。