如果源数据库包含现有数据,则有必要将此数据复制到每个副本。从源数据库转储数据有多种方法。以下部分描述了可能的选项。
要选择合适的数据库转储方法,请在以下选项之间进行选择
如果您的数据库存储在可移植的二进制文件中,则可以将原始数据文件复制到副本。这可能比使用 mysqldump 并将文件导入到每个副本上更有效,因为它跳过了在重放
INSERT
语句时更新索引的开销。对于InnoDB
等存储引擎,不推荐这样做。使用 MySQL Server 的克隆插件将所有数据从现有副本传输到克隆。有关使用此方法的说明,请参见 第 7.6.7.7 节,“克隆以进行复制”。
要部署多个 MySQL 实例,可以使用 InnoDB 集群,它使您能够轻松管理 MySQL Shell 中的一组 MySQL 服务器实例。InnoDB 集群将 MySQL 组复制封装在一个编程环境中,使您能够轻松部署一组 MySQL 实例以实现高可用性。此外,InnoDB 集群与 MySQL 路由器 无缝集成,使您的应用程序能够连接到集群而无需编写自己的故障转移过程。但是,对于类似的用例,这些用例不需要高可用性,您可以使用 InnoDB 副本集。有关 MySQL Shell 的安装说明,请参见 此处。
要创建现有源数据库中数据的快照,请使用 mysqldump 工具。完成数据转储后,在启动复制过程之前将此数据导入副本。
以下示例将所有数据库转储到名为 dbdump.db
的文件中,并包含 --source-data
选项,该选项会自动附加副本上所需的 CHANGE REPLICATION SOURCE TO
语句以启动复制过程
$> mysqldump --all-databases --source-data > dbdump.db
如果您没有使用 --source-data
,则必须在单独的会话中手动锁定所有表。请参阅 第 19.1.2.4 节,“获取复制源二进制日志坐标”。
可以使用 mysqldump 工具从转储中排除某些数据库。如果您要选择要包含在转储中的数据库,请勿使用 --all-databases
。选择以下选项之一
使用
--ignore-table
选项排除数据库中的所有表。仅使用
--databases
选项命名要转储的数据库。
默认情况下,如果源上使用 GTID (gtid_mode=ON
),mysqldump 会将源上 gtid_executed
集中的 GTID 包含在转储输出中,以便将它们添加到副本上的 gtid_purged
集中。如果您只转储特定数据库或表,请注意,mysqldump 包含的值包括源上 gtid_executed
集中所有事务的 GTID,即使这些事务更改了数据库的抑制部分,或者服务器上未包含在部分转储中的其他数据库。查看 mysqldump 的 --set-gtid-purged
选项的描述,以了解您使用的 MySQL Server 版本的默认行为结果,以及在结果不适合您的情况时如何更改行为。
有关更多信息,请参阅 第 6.5.4 节,“mysqldump — 数据库备份程序”。
要导入数据,请将转储文件复制到副本,或者在远程连接到副本时从源访问文件。
本节介绍如何使用构成数据库的原始文件创建数据快照。对于使用具有复杂缓存或日志记录算法的存储引擎的表,使用此方法需要额外的步骤才能生成完美的“时间点”快照:初始复制命令可能会遗漏缓存信息和日志记录更新,即使您已获取全局读锁定。存储引擎对这种情况的响应方式取决于其崩溃恢复能力。
如果您使用 InnoDB
表,可以使用 MySQL Enterprise Backup 组件中的 mysqlbackup 命令生成一致的快照。此命令记录与快照相对应的日志名称和偏移量,以供副本使用。MySQL Enterprise Backup 是一个商业产品,包含在 MySQL Enterprise 订阅中。有关详细信息,请参阅 第 32.1 节,“MySQL Enterprise Backup 概述”。
如果源和副本的 ft_stopword_file
、ft_min_word_len
或 ft_max_word_len
值不同,并且您正在复制具有全文索引的表,则此方法也不可靠。
假设上述异常不适用于您的数据库,请使用 冷备份 技术获取 InnoDB
表的可靠二进制快照:执行 缓慢关闭 MySQL Server,然后手动复制数据文件。
要创建 MyISAM
表的原始数据快照(当您的 MySQL 数据文件位于单个文件系统上时),可以使用标准文件复制工具(如 cp 或 copy),远程复制工具(如 scp 或 rsync),存档工具(如 zip 或 tar)或文件系统快照工具(如 dump)。如果您只复制某些数据库,请仅复制与这些表相关的文件。对于 InnoDB
,所有数据库中的所有表都存储在 系统表空间 文件中,除非您启用了 innodb_file_per_table
选项。
以下文件对于复制不是必需的
与
mysql
数据库相关的文件。副本的连接元数据存储库文件
master.info
(如果使用);现在不建议使用此文件(请参阅 第 19.2.4 节,“中继日志和复制元数据存储库”)。源的二进制日志文件,如果您要使用它来查找副本的源二进制日志坐标,则二进制日志索引文件除外。
任何中继日志文件。
根据您使用的是 InnoDB
表还是其他表,请选择以下选项之一
如果您使用的是 InnoDB
表,并且还需要使用原始数据快照获得最一致的结果,请在过程中关闭源服务器,方法如下
获取读锁定并获取源的状态。请参阅 第 19.1.2.4 节,“获取复制源二进制日志坐标”。
在单独的会话中,关闭源服务器
$> mysqladmin shutdown
复制 MySQL 数据文件。以下示例显示了常见的做法。您只需要选择其中一种
$> tar cf /tmp/db.tar ./data $> zip -r /tmp/db.zip ./data $> rsync --recursive ./data /tmp/dbdata
重新启动源服务器。
如果您不使用 InnoDB
表,则可以通过以下步骤从源获取系统快照,而无需关闭服务器
获取读锁定并获取源的状态。请参阅 第 19.1.2.4 节,“获取复制源二进制日志坐标”。
复制 MySQL 数据文件。以下示例显示了常见的做法。您只需要选择其中一种
$> tar cf /tmp/db.tar ./data $> zip -r /tmp/db.zip ./data $> rsync --recursive ./data /tmp/dbdata
在获取读锁定的客户端中,释放锁定
mysql> UNLOCK TABLES;
创建数据库的存档或副本后,在启动复制过程之前将文件复制到每个副本。