我想知道是否按mysqldump
以下方式执行
mysqldump --all-databases --master-data > dump.sql
整个过程中所有表都被锁定,还是只是逐个表锁定?换句话说,是否会mysqldump
中断(暂停)进程期间的所有写入查询,或者仅中断(暂停)那些试图修改当前正在导出的表的查询?这些查询是否被中断或暂停?
我有一个大型数据库,持续为客户使用的应用程序提供服务。它大约有 50GB,需要几个小时才能转储完成。我无法停止数据库,需要转储它而不影响其工作能力。我计划使用该转储在主从策略下将数据库复制到另一台服务器上。仅供参考,二进制日志已打开并server_id
已设置。
+-------------------------------+
| version() |
+-------------------------------+
| 5.6.14-1+debphp.org~precise+1 |
+-------------------------------+
FLUSH TABLES WITH READ LOCK
是的,如果您的数据库使用非事务表,mysqldump 必须锁定所有表(它使用)。这是为了确保备份中数据的一致状态。更好的做法是使用支持事务的 InnoDB 表,并使用以下命令运行转储:
使用事务允许 mysqldump 根据需要运行,而无需锁定表。凭借可重复读事务隔离,它可以确保转储的数据状态一致。
与此同时,其他客户端可以继续读取和写入数据库中的任何表。
InnoDB 是 MySQL 5.6.14 中的默认存储引擎(FWIW 于 2013 年 9 月 20 日发布,因此距今已有十多年历史,不再受支持)。