创build主从关系时避免服务器停机的方法?

我准备build立一个MySQL主从关系或主 – 主关系。 现在我有一个MySQL生产服务器,当然我不想在连接从服务器的时候停机。

有没有办法让我连接一个空的奴隶,让它“缓慢”同步从主人的数据,直到他们是相同的?

我注意到,我可以在主服务器上使用mysqldump进行事务转储,然后将其导入到从服务器中,但是当从服务器导入了转储服务器时,会有很多新的行被写入,从服务器如何获取这些?

我希望我在这里忽略一些明显的东西,但大量的谷歌search会给出这样的build议,比如“因为这样会导致更less的停机时间,现在有些停机时间可能不是那么糟糕”。 但我真的想避免这种情况。

MyISAM的相关问题 ,但我使用InnoDB。

如果你使用100%的InnoDB,那么你很幸运。 您可以使用XtraBackup对主数据库进行完整备份,而无需任何停机时间或任何表locking。 这将是一致的快照式备份,与您在执行FLUSH TABLES WITH READ LOCK--master-data选项时得到的sorting相同。

XtraBackup工具还会在备份目录中删除一个额外的文件,该文件包含需要在从服务器上启动复制的MASTER_LOG_POS和MASTER_LOG_FILE信息。

完成备份后,需要在备份上运行XtraBackup的–prepare选项,将其加载到从服务器,启动从服务器MySQL进程,并告诉它需要新的MASTER_LOG_POS和MASTER_LOG_FILE值。

在启动slave之前,您需要在my.cnf中skip-slave-start

另外请记住,默认情况下, mysql模式是MyISAM(如果内存正确,它只能是MyISAM),所以在运行备份的时候,你还是要小心不要对这些表进行任何修改。 只要你坚持这个规则,主信息仍然是正确的。

忽略从属my.cnf中的mysql模式通常是一个好主意,并且只能创build具有SELECT权限的用户。 即使在使用Percona(和Maatkit之前)提供的工具的情况下,不一致的和不同步的从属设备也很难被检测到并且很难处理。

编辑:

虽然你说你在使用InnoDB,但是如果你使用的是MyISAM表格,还有另一种方法。 如果您有一个带有快照的卷pipe理器(例如ZFS或LVM ),则可以运行带FLUSH TABLES WITH READ LOCKFLUSH TABLES WITH READ LOCK然后SHOW MASTER STATUS ,创build快照并运行UNLOCK TABLES 。 停机时间应该相当小。 为了比较,昨晚做了这个备份我们的数据库的cron作业需要6秒钟的时间来创build数据库“closures”的快照,27分钟的时间将快照中的文件复制到备份服务器。

从头开始复制mysql是不可能的。

相反,在转储数据库时,可以使用mysqldump和--master-data=2参数 – 即:

 mysqldump --master-data=2 --all-databases --opt -p > myinitialdump.sql 

该命令将在转储期间locking受影响的数据库中的所有表,并将复制坐标以注释掉的方式写入转储的标题,如下所示:

 -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000018', MASTER_LOG_POS=106; 

导入完成后,您可以手动运行“master master to”命令,并使用主服务器的主机名和身份validation数据 – 复制将在转储点离开。

请记住,由于locking争用,mysqldump进程本身会产生“宕机” – 它将在整个转储过程中在所有表上放置读锁(类似于FLUSH TABLES WITH READ LOCK命令将执行的操作)。 因此,除非转储完成,否则写入任何表的请求都不会返回。 此外,写入请求可能也会阻止任何随后的读取请求,除非您在MySQLconfiguration中指定了low_priority_updates ,或者在转储之前发出了SET GLOBAL LOW_PRIORITY_UPDATES = 1。