文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  选择数据快照的方法

19.1.2.5 选择数据快照的方法

如果源数据库包含现有数据,则有必要将此数据复制到每个副本。从源数据库转储数据有多种方法。以下部分描述了可能的选项。

要选择合适的数据库转储方法,请在以下选项之间进行选择

  • 使用 mysqldump 工具创建要复制的所有数据库的转储。这是推荐的方法,尤其是在使用 InnoDB 时。

  • 如果您的数据库存储在可移植的二进制文件中,则可以将原始数据文件复制到副本。这可能比使用 mysqldump 并将文件导入到每个副本上更有效,因为它跳过了在重放 INSERT 语句时更新索引的开销。对于 InnoDB 等存储引擎,不推荐这样做。

  • 使用 MySQL Server 的克隆插件将所有数据从现有副本传输到克隆。有关使用此方法的说明,请参见 第 7.6.7.7 节,“克隆以进行复制”

提示

要部署多个 MySQL 实例,可以使用 InnoDB 集群,它使您能够轻松管理 MySQL Shell 中的一组 MySQL 服务器实例。InnoDB 集群将 MySQL 组复制封装在一个编程环境中,使您能够轻松部署一组 MySQL 实例以实现高可用性。此外,InnoDB 集群与 MySQL 路由器 无缝集成,使您的应用程序能够连接到集群而无需编写自己的故障转移过程。但是,对于类似的用例,这些用例不需要高可用性,您可以使用 InnoDB 副本集。有关 MySQL Shell 的安装说明,请参见 此处

19.1.2.5.1 使用 mysqldump 创建数据快照

要创建现有源数据库中数据的快照,请使用 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。选择以下选项之一

注意

默认情况下,如果源上使用 GTID (gtid_mode=ON),mysqldump 会将源上 gtid_executed 集中的 GTID 包含在转储输出中,以便将它们添加到副本上的 gtid_purged 集中。如果您只转储特定数据库或表,请注意,mysqldump 包含的值包括源上 gtid_executed 集中所有事务的 GTID,即使这些事务更改了数据库的抑制部分,或者服务器上未包含在部分转储中的其他数据库。查看 mysqldump 的 --set-gtid-purged 选项的描述,以了解您使用的 MySQL Server 版本的默认行为结果,以及在结果不适合您的情况时如何更改行为。

有关更多信息,请参阅 第 6.5.4 节,“mysqldump — 数据库备份程序”

要导入数据,请将转储文件复制到副本,或者在远程连接到副本时从源访问文件。

19.1.2.5.2 使用原始数据文件创建数据快照

本节介绍如何使用构成数据库的原始文件创建数据快照。对于使用具有复杂缓存或日志记录算法的存储引擎的表,使用此方法需要额外的步骤才能生成完美的“时间点”快照:初始复制命令可能会遗漏缓存信息和日志记录更新,即使您已获取全局读锁定。存储引擎对这种情况的响应方式取决于其崩溃恢复能力。

如果您使用 InnoDB 表,可以使用 MySQL Enterprise Backup 组件中的 mysqlbackup 命令生成一致的快照。此命令记录与快照相对应的日志名称和偏移量,以供副本使用。MySQL Enterprise Backup 是一个商业产品,包含在 MySQL Enterprise 订阅中。有关详细信息,请参阅 第 32.1 节,“MySQL Enterprise Backup 概述”

如果源和副本的 ft_stopword_fileft_min_word_lenft_max_word_len 值不同,并且您正在复制具有全文索引的表,则此方法也不可靠。

假设上述异常不适用于您的数据库,请使用 冷备份 技术获取 InnoDB 表的可靠二进制快照:执行 缓慢关闭 MySQL Server,然后手动复制数据文件。

要创建 MyISAM 表的原始数据快照(当您的 MySQL 数据文件位于单个文件系统上时),可以使用标准文件复制工具(如 cpcopy),远程复制工具(如 scprsync),存档工具(如 ziptar)或文件系统快照工具(如 dump)。如果您只复制某些数据库,请仅复制与这些表相关的文件。对于 InnoDB,所有数据库中的所有表都存储在 系统表空间 文件中,除非您启用了 innodb_file_per_table 选项。

以下文件对于复制不是必需的

  • mysql 数据库相关的文件。

  • 副本的连接元数据存储库文件 master.info(如果使用);现在不建议使用此文件(请参阅 第 19.2.4 节,“中继日志和复制元数据存储库”)。

  • 源的二进制日志文件,如果您要使用它来查找副本的源二进制日志坐标,则二进制日志索引文件除外。

  • 任何中继日志文件。

根据您使用的是 InnoDB 表还是其他表,请选择以下选项之一

如果您使用的是 InnoDB 表,并且还需要使用原始数据快照获得最一致的结果,请在过程中关闭源服务器,方法如下

  1. 获取读锁定并获取源的状态。请参阅 第 19.1.2.4 节,“获取复制源二进制日志坐标”

  2. 在单独的会话中,关闭源服务器

    $> mysqladmin shutdown
  3. 复制 MySQL 数据文件。以下示例显示了常见的做法。您只需要选择其中一种

    $> tar cf /tmp/db.tar ./data
    $> zip -r /tmp/db.zip ./data
    $> rsync --recursive ./data /tmp/dbdata
  4. 重新启动源服务器。

如果您不使用 InnoDB 表,则可以通过以下步骤从源获取系统快照,而无需关闭服务器

  1. 获取读锁定并获取源的状态。请参阅 第 19.1.2.4 节,“获取复制源二进制日志坐标”

  2. 复制 MySQL 数据文件。以下示例显示了常见的做法。您只需要选择其中一种

    $> tar cf /tmp/db.tar ./data
    $> zip -r /tmp/db.zip ./data
    $> rsync --recursive ./data /tmp/dbdata
  3. 在获取读锁定的客户端中,释放锁定

    mysql> UNLOCK TABLES;

创建数据库的存档或副本后,在启动复制过程之前将文件复制到每个副本。