我正在准备设置 MySQL 主从或主主关系。目前我有一个 MySQL 生产服务器,当然我不希望在连接从服务器时出现大量停机时间。
我有没有办法连接一个空的从属设备并让它“缓慢地”同步来自主设备的数据,直到它们相同?
我注意到我可以在主服务器上使用 mysqldump 进行事务转储,然后将其导入到从服务器上,但是当从服务器导入转储时,会写入许多新行,从服务器将如何获取这些行?
我希望我在这里忽略了一些显而易见的东西,但经过广泛的谷歌搜索,我得到了这样的建议:“由于这将导致将来停机时间减少,因此现在停机一段时间可能并不是一件坏事”。但我真的想避免这种情况。
有关的关于 MyISAM 的问题,但我使用InnoDB。
答案1
如果你使用的是 100% InnoDB,那么你很幸运。你可以使用超级备份对您的主数据库进行完整备份,无需停机或锁定任何表。这将是一致的快照式备份,与您执行FLUSH TABLES WITH READ LOCK
或--master-data
选项时获得的备份类型相同。
XtraBackup 工具还会在备份目录中删除一个额外的文件,其中包含在从属服务器上启动复制所需的 MASTER_LOG_POS 和 MASTER_LOG_FILE 信息。
一旦完成备份,您将需要--prepare
在备份上运行 XtraBackup 选项,将其加载到从属服务器中,启动从属服务器 MySQL 进程备份并告诉它所需的新 MASTER_LOG_POS 和 MASTER_LOG_FILE 值。
在启动从属服务器之前,您将需要skip-slave-start
my.cnf。
还请记住,mysql
默认情况下模式是 MyISAM(如果我没记错的话,它只能是 MyISAM),因此在运行备份时,您仍然必须小心不要对任何表进行任何更改。只要您遵守该规则,主信息仍然是正确的。
通常来说忽略mysql
my.cnf 中的架构在从服务器上,并且只创建具有 SELECT 权限的用户。即使使用 Percona(以及之前的 Maatkit)提供的工具,不一致和不同步的从服务器也很难检测,处理起来也很麻烦。
编辑:
虽然你说你正在使用 InnoDB,但为了完整性,如果你使用 MyISAM 表,还有另一种方法。如果你有一个带快照功能的卷管理器(例如虚拟文件系统或者逻辑卷管理器),您可以先运行,FLUSH TABLES WITH READ LOCK
然后运行SHOW MASTER STATUS
,创建快照并运行UNLOCK TABLES
。停机时间应该相当短。相比之下,昨晚执行此操作以备份我们的一个数据库的 cron 作业花了 6 秒钟创建快照,这是数据库“停机”的部分,并花了 27 分钟将文件从快照复制到备份服务器。
答案2
无法“从头开始”启动 mysql 复制。
--master-data=2
相反,您可以在转储数据库时使用带有参数的 mysqldump - 例如像这样:
mysqldump --master-data=2 --all-databases --opt -p > myinitialdump.sql
此命令将在转储期间锁定受影响数据库内的所有表,并以注释掉的方式将复制坐标写入转储的标题中,如下所示:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000018', MASTER_LOG_POS=106;
导入完成后,您可以手动运行“change master to”命令,并添加主服务器的主机名和身份验证数据 - 复制将在转储点启动。
请记住,mysqldump 进程本身会因锁定争用而导致“停机”——它会在整个转储期间对所有表设置读取锁定(类似于 FLUSH TABLES WITH READ LOCK 命令所做的操作)。因此,除非转储完成,否则不会返回任何写入任何表的请求。此外,除非您指定了写入请求,否则写入请求可能还会阻止任何后续读取请求低优先级更新在您的 MySQL 配置中或者在转储之前发出 SET GLOBAL LOW_PRIORITY_UPDATES=1。