如果源数据库包含现有数据,则需要将这些数据复制到每个副本。从源数据库转储数据的几种方法。以下部分描述了可能的选项。
要选择合适的数据库转储方法,请在以下选项中选择:
如果您的数据库存储在二进制可移植文件中,则可以将原始数据文件复制到副本。这比使用 mysqldump 并在每个副本上导入文件更有效率,因为它跳过了在重放
INSERT
语句时更新索引的开销。对于InnoDB
等存储引擎,不推荐此方法。使用 MySQL Server 的克隆插件将所有数据从现有副本传输到克隆。有关使用此方法的说明,请参见 第 7.6.7.7 节,“复制克隆”。
要部署多个 MySQL 实例,可以使用 InnoDB Cluster,它使您能够轻松地在 MySQL Shell 中管理一组 MySQL 服务器实例。InnoDB Cluster 将 MySQL 组复制包装在编程环境中,使您能够轻松地部署一组 MySQL 实例以实现高可用性。此外,InnoDB Cluster 与 MySQL Router 无缝衔接,使您的应用程序能够连接到集群而无需编写自己的故障转移进程。但是,对于不需要高可用性的类似用例,您可以使用 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;
创建数据库的存档或副本后,在启动复制过程之前将文件复制到每个副本。