19.1.2.5 选择数据快照方法
如果源数据库已经包含了数据,那么需要将这些数据复制到每个副本中。有多种方法可以从源数据库中dump数据。以下部分描述了可能的选项。
要选择合适的dump数据方法,请从以下选项中选择:
-
如果您的数据库存储在二进制可移植文件中,可以将原始数据文件复制到副本中。这可以比使用mysqldump并在每个副本中导入文件更高效,因为它跳过了在
INSERT
语句被重新播放时更新索引的开销。使用存储引擎如InnoDB
时,这不推荐。 -
使用MySQL Server的clone插件将现有副本中的所有数据转移到克隆中。要使用该方法,请参阅Section 7.6.7.7, “Cloning for Replication”。
要部署多个MySQL实例,可以使用InnoDB Cluster,它使您可以轻松地管理一组MySQL服务器实例在MySQL Shell中。InnoDB Cluster将MySQL Group Replication包装在程序化环境中,使您可以轻松地部署一组MySQL实例以实现高可用性。此外,InnoDB Cluster与MySQL Router无缝接口,使您的应用程序可以连接到集群而无需编写自己的故障转移过程。对于类似用例,但不需要高可用性,可以使用InnoDB ReplicaSet。MySQL Shell的安装指南可以在这里找到。
要创建现有源数据库中的数据快照,请使用mysqldump工具。完成数据dump后,在开始复制过程前将数据导入副本。
以下示例将所有数据库dump到名为dbdump.db
的文件中,并包括--source-data
选项,该选项自动添加CHANGE REPLICATION SOURCE TO
语句,以便在复制服务器上启动复制过程:
$> mysqldump --all-databases --source-data > dbdump.db
如果您不使用--source-data
,那么需要手动锁定所有表在单独的会话中。请参阅第19.1.2.4节,“获取复制源二进制日志坐标”。
可以使用mysqldump工具排除某些数据库从dump中。要选择要包括在dump中的数据库,不要使用--all-databases
。选择以下选项之一:
-
排除数据库中的所有表使用
--ignore-table
选项。 -
仅名称要dump的数据库使用
--databases
选项。
默认情况下,如果源服务器上的GTIDs在使用(gtid_mode=ON
),mysqldump将在dump输出中包括源服务器上的GTIDs,从gtid_executed
集中获取的GTIDs添加到gtid_purged
集中。如果您只dump特定的数据库或表,需要注意mysqldump包括了源服务器上的所有事务在gtid_executed
集中,即使这些事务改变了数据库的某些部分,或者其他数据库服务器上的数据库不包括在部分dump中。查看mysqldump的--set-gtid-purged
选项,以了解MySQL Server版本的默认行为和如何更改行为以适应您的情况。
更多信息,请参阅第6.5.4节,“mysqldump — 数据库备份程序”。
要导入数据,可以将dump文件复制到复制服务器上,或者从源服务器远程连接到复制服务器访问文件。
本节描述了使用原始文件创建数据快照的方法。使用具有复杂缓存或日志算法的存储引擎的表需要额外步骤来生产完美的“某个时间点”快照:初始复制命令可能会遗漏缓存信息和日志更新,即使您已经获取了全局读锁。存储引擎对此的响应取决于其崩溃恢复能力。
如果您使用InnoDB
表,可以使用MySQL Enterprise Backup组件中的mysqlbackup命令来生产一致快照。这条命令记录了快照对应的日志名称和偏移量,以便在复制服务器上使用。MySQL Enterprise Backup是MySQL Enterprise订阅的一部分。详细信息请见第32.1节,“MySQL Enterprise Backup Overview”。
此方法在源服务器和复制服务器具有不同值的ft_stopword_file
、ft_min_word_len
或ft_max_word_len
的场景下不工作,如果您正在复制具有全文索引的表。
假设上述异常不适用于您的数据库,可以使用冷备份技术来获取可靠的二进制快照:将MySQL Server进行慢速关机,然后手动复制数据文件。
要创建MyISAM
表的原始数据快照,可以使用标准文件复制工具,如cp或copy,远程复制工具,如scp或rsync,归档工具,如zip或tar,或文件系统快照工具,如dump。如果您只复制某些数据库,仅复制与那些表相关的文件。对于系统表空间文件中的所有表,在innodb_file_per_table
选项启用时除外。
以下文件不需要复制:
-
与mysql数据库相关的文件。
-
复制服务器的连接元数据存储文件19.2.4节,“Relay Log and Replication Metadata Repositories”中的master.info文件,如果使用该文件现在已弃用(见Section 19.2.4, “Relay Log and Replication Metadata Repositories”)。
-
源服务器的二进制日志文件,除了用于定位源二进制日志坐标的二进制日志索引文件,如果您计划使用该方法来定位源二进制日志坐标。
-
任何中继日志文件。
根据您是否使用InnoDB
表,选择以下之一:
如果您使用InnoDB
表,并且要获取最consistent的结果与原始数据快照,关闭源服务器,以以下方式进行:
-
获取读锁并获取源服务器的状态。见第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;
在您创建存档或数据库副本后,将文件复制到每个副本,然后启动复制过程。