从现有副本创建新的 MySQL 副本

Creating a new MySQL replica from an existing replica

我使用的是标准 MySQL 副本设置,只有一个主服务器和一个副本。现在我想创建一个新的副本,以便我有一个主控和两个副本。要设置新副本,我想对现有副本进行 MySQL 转储,而不是从主副本执行此操作。

执行此操作时,我想我首先需要停止副本以获得一致的数据集:

mysql> STOP SLAVE;

然后我会找到复制坐标,这样我就可以在正确的复制点启动我的新副本:

mysql> SHOW SLAVE STATUS\G

然后我会在副本上通过 运行 这个命令进行转储:

bash> mysqldump --single-transaction --quick --lock-tables=false --insert-ignore --all-databases --master-data=2 | gzip > data-for-replica.sql.gz

并且在 MySQL 转储完成后,我将重新启动副本以使其恢复:

mysql> START SLAVE; 

我的问题是:由于我在进行转储时使用 --单事务处理,我可以并行执行这些任务吗:

  1. 停止复制,检查坐标,然后启动 MySQL 转储
  2. 在进行转储时在单独的 shell 中重新启动副本

会不会出什么问题?我会得到不一致的数据和坐标,从而阻止我在正常状态下创建新副本吗?

我希望避免在重新启动从中获取备份的副本之前必须等待大型数据库的转储完成。由于转储发生在单个事务中,来自主服务器的任何更新都不会包含在转储中,因此转储将与我在副本停止时检查的坐标一致。我错过了什么吗?

mysqldump 是只读操作,不是事务。因此,如果 mysqldump 仅转储未提交的数据,并且您的事务在转储期间保持打开状态,新从属中的导入和新从属的激活,那么理论上您可以这样做。但在实践中,我认为这种情况不太可能奏效。