如果源上的数据库包含现有数据,则有必要将此数据复制到每个副本。有多种方法可以从源中转储数据。以下部分描述了可能的选项。
要选择转储数据库的适当方法,请在以下选项之间进行选择:
要在现有源中创建数据快照,请使用mysqldump工具。数据转储完成后,在开始复制过程之前将此数据导入副本。
以下示例将所有数据库转储到名为 的文件
dbdump.db
,并包括
--master-data
自动附加CHANGE MASTER
TO
副本所需语句以启动复制过程的选项:
$> mysqldump --all-databases --master-data > dbdump.db
如果不使用
--master-data
,则需要手动锁定单独会话中的所有表。请参阅第 16.1.2.3 节,“获取复制源的二进制日志坐标”。
可以使用mysqldump工具从转储中排除某些数据库。如果要选择要包含在转储中的数据库,请不要使用
--all-databases
. 选择以下选项之一:
--ignore-table
使用选项 排除数据库中的所有表 。--databases
使用该选项 仅命名要转储的那些数据库 。
有关详细信息,请参阅第 4.5.4 节,“mysqldump — 数据库备份程序”。
要导入数据,请将转储文件复制到副本,或者在远程连接到副本时从源访问该文件。
本节介绍如何使用构成数据库的原始文件创建数据快照。使用具有复杂缓存或日志算法的存储引擎对表使用此方法需要额外的步骤来生成完美的“时间点”快照:初始复制命令可能会遗漏缓存信息和日志更新,即使您已经获得了一个全局读锁。存储引擎对此如何响应取决于它的崩溃恢复能力。
如果您使用InnoDB
表,您可以使用 MySQL Enterprise Backup 组件中的mysqlbackup命令来生成一致的快照。此命令记录与要在副本上使用的快照对应的日志名称和偏移量。MySQL Enterprise Backup 是一种商业产品,作为 MySQL Enterprise 订阅的一部分包含在内。有关详细信息,请参阅
第 28.2 节,“MySQL 企业备份概述”。
ft_stopword_file
如果源和副本具有不同的、
ft_min_word_len
或
值ft_max_word_len
并且您正在复制具有全文索引的表,
则此方法也无法可靠地工作
。
假设上述异常不适用于您的数据库,请使用冷备份
技术获取
InnoDB
表的可靠二进制快照:
缓慢关闭MySQL 服务器,然后手动复制数据文件。
当您的 MySQL 数据文件存在于单个文件系统上时,要创建
MyISAM
表的原始数据快照,您可以使用标准文件复制工具(例如cp或
copy)、远程复制工具(例如
scp或rsync)、归档工具(例如zip或
tar或文件系统快照工具,例如
dump。如果您只复制某些数据库,则只复制那些与这些表相关的文件。对于InnoDB
,所有数据库中的所有表都存储在系统表空间中文件,除非您
innodb_file_per_table
启用了该选项。
复制不需要以下文件:
与
mysql
数据库相关的文件。副本的连接元数据存储库文件,如果使用(请参阅第 16.2.4 节,“中继日志和复制元数据存储库”)。
源的二进制日志文件,如果您要使用二进制日志索引文件来定位副本的源二进制日志坐标,则二进制日志索引文件除外。
任何中继日志文件。
根据您是否使用InnoDB
表格,选择以下选项之一:
如果您使用的是InnoDB
表,并且还希望通过原始数据快照获得最一致的结果,请在此过程中关闭源服务器,如下所示:
获取读锁并获取源的状态。请参阅 第 16.1.2.3 节,“获取复制源的二进制日志坐标”。
在单独的会话中,关闭源服务器:
$> mysqladmin shutdown
制作 MySQL 数据文件的副本。以下示例显示了执行此操作的常用方法。您只需选择其中一项:
$> tar cf /tmp/db.tar ./data $> zip -r /tmp/db.zip ./data $> rsync --recursive ./data /tmp/dbdata
重新启动源服务器。
如果您不使用InnoDB
表,则可以从源获取系统快照而无需关闭服务器,如以下步骤所述:
获取读锁并获取源的状态。请参阅 第 16.1.2.3 节,“获取复制源的二进制日志坐标”。
制作 MySQL 数据文件的副本。以下示例显示了执行此操作的常用方法。您只需选择其中一项:
$> tar cf /tmp/db.tar ./data $> zip -r /tmp/db.zip ./data $> rsync --recursive ./data /tmp/dbdata
在您获取读锁的客户端中,释放锁:
mysql> UNLOCK TABLES;
创建数据库的存档或副本后,在开始复制过程之前将文件复制到每个副本。