我知道有两种解决此问题的基本方法。首先,如果您运行的是InnoDB而不是Myisam,则可以在事务中进行备份(--single-transaction --lock-tables = FALSE),该操作与--flush-logs(不是必需的,但很好)结合在一起,并且--master-data将为您提供具有复制位置信息的一致备份。刷新日志将在创建转储之前重置日志,这意味着位置将始终为106,而--master-data将日志文件名和位置放在转储文件中。当然,您必须在主服务器上运行此命令,才能使--master-data正常工作。
您提到的第二种方法是使用第三台主机创建备份。在这种情况下,您需要停止复制,确保数据库是只读的(尽管实际上,所有副本都应该是只读的,因为这不会影响复制的写操作),然后创建备份并记录复制位置。在这种情况下,不能使用--master-data。相反,您可以执行以下操作:
echo 'stop slave' | mysql {options)
mysqldump {your options} > DB.sql
echo 'show slave status\G' > DB.replication
echo 'start slave' | mysql {options)
如果需要从此备份中还原,则可以运行还原,然后设置复制,其中两个参数master_log_file和master_log_pos来自DB.replication文件:
master_log_file = value of Master_Log_File
master_log_pos = value of Exec_Master_Log_Pos
注意:您可以并且应该从另一个副本进行测试。
附加说明:如果您有一个副本池(例如,如果您将Web应用程序的读写与读取分开),则副本可能与新的主副本不同步;如果故障转移发生在繁重的写入I / O期间,则可能会发生这种情况,因为这些副本是异步流式传输的,并且不能保证当您进行故障转移时,备用数据库与其他副本位于同一位置。但是,这还没有发生在我身上...