如果源数据库包含现有数据,则需要将其复制到每个副本中。有多种方法可以从源数据库转储数据。以下部分将描述可能的选项。
要选择适当的数据库转储方法,请从以下选项中选择:
-
如果您的数据库存储在二进制可移植文件中,可以将原始数据文件复制到副本中。这比使用 mysqldump 并在每个副本上导入文件更高效,因为它跳过了在重新播放
INSERT
语句时更新索引的开销。使用存储引擎如InnoDB
时,这不是推荐的方法。 -
使用 MySQL 服务器的克隆插件将所有数据从现有的副本传输到克隆。有关使用此方法的说明,请参阅 第 7.6.7.7 节,“克隆用于复制”。
要部署多个 MySQL 实例,可以使用 InnoDB 集群,它使您可以轻松管理一组 MySQL 服务器实例的高可用性。在noDB 集群将 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执行集gtid_executed
,以便将其添加到副本上的gtid_purged
集中。如果您只转储特定的数据库或表格,请注意,mysqldump包括源服务器上的所有事务GTID,即使这些事务更改了数据库的其他部分或服务器上的其他数据库,这些数据库未包含在部分转储中。请查看mysqldump的--set-gtid-purged
选项的描述,以了解默认行为的结果,并了解如何更改行为以适应您的情况。
有关更多信息,请参阅第 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 服务器的慢关闭,然后手动复制数据文件。
要创建 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;
一旦您创建了数据库的存档或副本,就将文件复制到每个副本,然后启动复制过程。