参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/replication.html
复制功能可将来自一台MySQL数据库服务器(主服务器)的数据复制到一台或多台MySQL数据库服务器(从服务器)。 默认情况下复制是异步的; 从属设备不需要永久连接以接收来自主设备的更新。 根据配置,您可以复制数据库中的所有数据库,选定数据库或甚至选定的表。
MySQL中复制的优点包括:
MySQL 5.7支持不同的复制方法。 传统方法基于从主站的二进制日志中复制事件,并要求主站和从站之间的日志文件和位置同步。 基于全局事务标识符(GTID)的更新方法是事务性的,因此不需要使用这些文件中的日志文件或位置,这大大简化了许多常见的复制任务。 只要在主站上提交的所有事务都已应用于从站,使用GTID的复制保证了主站和从站之间的一致性。
MySQL中的复制支持不同类型的同步。原始类型的同步是单向异步复制,其中一台服务器充当主服务器,另一台服务器充当从服务器。这与作为NDB集群特性的同步复制相反(参见第21章,MySQL NDB集群7.5和NDB集群7.6)。在MySQL 5.7中,除了内置的异步复制以外,还支持半同步复制。使用半同步复制,在返回执行事务的会话之前在主块上执行的提交,直到至少一个从服务器确认它已接收并记录事务的事件;请参见第16.3.9节“半同步复制”。 MySQL 5.7还支持延迟复制,使得从服务器故意在主服务器后面至少延迟一段指定的时间;请参见第16.3.10节“延迟复制”。
有许多解决方案可用于设置服务器之间的复制,最佳使用方法取决于数据的存储以及您正在使用的引擎类型。
有两种核心类型的复制格式:复制整个SQL语句的 Statement Based Replication(SBR)和仅复制已更改行的Row Based Replication(RBR)。 您还可以使用第三种Mixed Based Replication(MBR)。
复制通过许多不同的选项和变量进行控制。
您可以使用复制来解决许多不同的问题,包括性能,支持不同数据库的备份,以及作为缓解系统故障的更大解决方案的一部分。
16.1.1 二进制日志文件位置 基础的复制配置概述
本节介绍基于二进制日志文件位置方法的MySQL服务器之间的复制,其中作为主服务器运行的MySQL实例(数据库更改源)将更新和更改作为“事件”写入二进制日志。 根据记录的数据库更改,二进制日志中的信息以不同的日志记录格式存储。 从站被配置为从主站读取二进制日志,并在从站的本地数据库中执行二进制日志中的事件。
每个从设备都会收到二进制日志的全部内容的副本。 slave决定执行二进制日志中的哪些语句。 除非另有说明,否则主站二进制日志中的所有事件都将在从站上执行。 如果需要,您可以将从站配置为仅处理适用于特定数据库或表的事件。
重要:
您无法将主设备配置为仅记录特定事件。
每个slave都保存二进制日志坐标的记录:文件名称和它从主机读取并处理的文件内的位置。 这意味着可以将多个从站连接到主站并执行相同二进制日志的不同部分。 由于从站控制此过程,因此各个从站可以与服务器连接和断开连接,而不会影响主站的操作。 另外,由于每个slave都记录二进制日志中的当前位置,因此可能会断开从站的连接,重新连接并恢复处理。
主站和每个slave必须配置一个唯一的ID(使用server-id选项)。 另外,每个从站必须配置有关主站主机名,日志文件名以及该文件中的位置的信息。 这些细节可以在MySQL会话中使用从站上的CHANGE MASTER TO语句进行控制。 详细信息存储在从属主信息库中,可以是文件或表.
16.1.2 设置基于二进制文件位置的复制
本节介绍如何设置MySQL服务器以使用基于二进制日志文件位置的复制。 有多种不同的设置复制方法,使用的确切方法取决于您如何设置复制以及您的主数据库中是否已有数据。
有一些通用任务对所有设置都是通用的:
注意:
设置过程中的某些步骤需要SUPER权限。 如果您没有此权限,则可能无法启用复制。
配置基本选项后,选择您的方案:
16.1.2.2 为复制创建一个用户
每个从设备都使用MySQL用户名和密码连接到主设备,因此主设备上必须有一个用户帐户,以便从设备可以使用该帐户进行连接。 在设置复制从站时,用户名由CHANGE MASTER TO命令中的MASTER_USER选项指定。 任何帐户都可以用于此操作,只要它已被授予REPLICATION SLAVE权限即可。 您可以选择为每个从站创建一个不同的帐户,或者使用每个从站的相同帐户连接到主站。
虽然您不必专门为复制创建帐户,但应该知道复制用户名和密码以纯文本形式存储在主信息存储库文件或表中(请参见第16.2.4.2节“从属状态日志”)。 因此,您可能希望创建一个仅具有复制过程权限的单独帐户,以最大限度地减少对其他帐户造成危害的可能性。
要创建一个新帐户,请使用CREATE USER。 要授予此帐户复制所需的权限,请使用GRANT语句。 如果您仅为复制目的创建帐户,则该帐户只需要REPLICATION SLAVE权限。 例如,要设置一个新用户repl,它可以连接到http://example.com域中的任何主机进行复制,请在主服务器上发出以下语句:
mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';
16.1.2.3获取复制主二进制日志坐标
要将从站配置为在正确的位置启动复制过程,您需要主站的二进制日志中的当前坐标。
如果主服务器先前没有启用二进制日志记录,则由SHOW MASTER STATUS或mysqldump --master-data显示的日志文件名称和位置值为空。 在这种情况下,稍后在指定从站的日志文件和位置时需要使用的值是空字符串('')和4。
如果以前主服务器已经进行了二进制日志记录,则使用此过程获取主二进制日志坐标:
警告:
此过程使用FLUSH TABLES WITH READ LOCK,它会阻止InnoDB表的COMMIT操作。
1.通过使用命令行客户端连接到主服务器来启动主服务器上的会话,并通过执行FLUSH TABLES WITH READ LOCK语句来清除所有表并阻止写入语句:
mysql> FLUSH TABLES WITH READ LOCK;
警告:
保持您发出FLUSH TABLES语句的客户端正在运行,以便读取锁保持有效。 如果您退出客户端,则锁定被释放。
2.在master上的不同会话中,使用SHOW MASTER STATUS语句来确定当前二进制日志文件的名称和位置:
mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73 | test | manual,mysql |
+------------------+----------+--------------+------------------+
“文件”列显示日志文件的名称,“位置”列显示文件中的位置。 在这个例子中,二进制日志文件是mysql-bin.000003,位置是73.记录这些值。 您在设置从站时稍后需要它们。 它们表示从站应该开始处理来自主站的新更新的复制坐标。
您现在拥有了所需的信息,可以使从服务器从正确位置的二进制日志中开始读取以开始复制。
下一步取决于您是否拥有主数据。 选择以下选项之一:
--有客户端连接写数据,就需要lock,否则不用。
16.1.2.4选择数据快照的方法
如果主数据库包含现有数据,则需要将此数据复制到每个从属设备。 有多种方法可以从主数据库转储数据。 以下各节介绍可能的选项。
要选择转储数据库的适当方法,请在以下选项中进行选择:
16.1.2.4.1 使用mysqldump 创建一个数据快照
要在现有主数据库中创建数据的快照,请使用mysqldump工具。 数据转储完成后,在开始复制过程之前将该数据导入到slave中。
以下示例将所有数据库转储到名为dbdump.db的文件,并包含--master-data选项,该选项会自动追加从属服务器上所需的CHANGE MASTER TO语句以启动复制过程:
shell> mysqldump --all-databases --master-data > dbdump.db
注意:
如果您不使用--master-data,则需要手动将所有表锁定在单独的会话中。
可以使用mysqldump工具从转储中排除某些数据库。 如果要选择要包含在转储中的数据库,请不要使用--all-databases。 选择以下选项之一:
要导入数据,请将转储文件复制到从站,或者在远程连接到从站时从主站访问该文件。
16.1.2.4.2使用原始数据文件创建数据快照
本节介绍如何使用组成数据库的原始文件创建数据快照。 将此方法与使用具有复杂缓存或日志记录算法的存储引擎的表配合使用时,需要执行额外的步骤才能生成完美的“时间点”快照:即使您获得了一个完整的“时间点”快照,初始复制命令也可能会遗漏高速缓存信息和日志记录更新即使有全局读锁。 存储引擎对此的响应取决于其崩溃恢复能力。
如果您使用InnoDB表,则可以使用MySQL Enterprise Backup组件中的mysqlbackup命令来生成一致的快照。 该命令记录从站上使用的快照对应的日志名称和偏移量。 MySQL企业备份是作为MySQL企业订阅的一部分包含的商业产品.
如果主站和从站对ft_stopword_file,ft_min_word_len或ft_max_word_len具有不同的值,并且您正在复制具有全文索引的表,则此方法也不可靠。
假设上述例外不适用于您的数据库,请使用冷备份技术获取InnoDB表的可靠二进制快照:对MySQL服务器执行缓慢关闭,然后手动复制数据文件。
要在单个文件系统上存在MySQL数据文件时创建MyISAM表的原始数据快照,可以使用标准文件复制工具(例如cp或copy),远程复制工具(如scp或rsync),归档工具(如zip 或tar或文件系统快照工具(如转储)。 如果您只复制某些数据库,则只复制与这些表相关的文件。 对于InnoDB,除非启用了innodb_file_per_table选项,否则所有数据库中的所有表都存储在系统表空间文件中。
以下文件不需要复制:
根据您是否使用InnoDB表,选择以下选项之一:
如果您正在使用InnoDB表,并且为了获得与原始数据快照最一致的结果,请在此过程中关闭主服务器,如下所示:
1.获取读取锁定并获取主人的状态。
2.在单独的会话中,关闭主服务器:
shell> mysqladmin shutdown
3.制作MySQL数据文件的副本。 以下示例显示了执行此操作的常用方法。 你只需要选择其中的一个:
shell> tar cf /tmp/db.tar ./data
shell> zip -r /tmp/db.zip ./data
shell> rsync --recursive ./data /tmp/dbdata
4.重启master 服务器
如果您没有使用InnoDB表,则可以从主服务器获取系统快照,而无需关闭服务器,如以下步骤中所述:
1.获取读取锁定并获取主人的状态。
2.制作MySQL数据文件的副本。 以下示例显示了执行此操作的常用方法。 你只需要选择其中的一个:
shell> tar cf /tmp/db.tar ./data
shell> zip -r /tmp/db.zip ./data
shell> rsync --recursive ./data /tmp/dbdata
3.在您获取读锁的客户端,释放锁:
mysql> UNLOCK TABLES;
一旦创建了数据库的存档或副本,请在开始从属复制过程之前将这些文件复制到每个从属设备。
16.1.2.5 设置复制slave
以下各节介绍如何设置从站。 在继续之前,请确保您拥有:
unlock tables;
16.1.2.5.1 设置复制从属配置
每个复制从站都必须具有唯一的服务器标识。 如果还没有完成,则这部分从属设置需要服务器重新启动。
如果从服务器ID尚未设置,或者当前值与您为主服务器选择的值冲突,请关闭从服务器并编辑配置文件的[mysqld]部分以指定唯一的服务器ID。 例如:
[mysqld]
server-id=2
进行更改后,重新启动服务器。
如果您要设置多个从站,则每个从站都必须具有唯一的服务器ID值,该值与主站和任何其他从站的值不同。
注意:
如果您省略server-id(或者将其明确设置为其默认值0),则从站拒绝连接到主站。
您不必在从站上启用二进制日志记录即可设置复制。 但是,如果在从服务器上启用二进制日志记录,则可以使用从服务器的二进制日志进行数据备份和崩溃恢复,还可以将从服务器用作更复杂的复制拓扑的一部分。 例如,这个slave作为其他slave的master。
16.1.2.5.2 在slave 上设置master 配置
要设置从站与主站进行通信以进行复制,请使用必要的连接信息配置从站。 为此,请在从站上执行以下语句,将选项值替换为与系统相关的实际值:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
注意:
复制不能使用Unix套接字文件。 您必须能够使用TCP / IP连接到主MySQL服务器。
CHANGE MASTER TO语句还有其他选项。 例如,可以使用SSL设置安全复制。
接下来的步骤取决于您是否有现成的数据导入到从站。 有关更多信息,请参见第16.1.2.4节“为数据快照选择方法”。 选择下列之一:
16.1.2.5.3 在新master 和 slaves 之间设置复制
如果没有要导入的以前数据库的快照,请将从站配置为从新主站启动复制。
要设置主站和新站之间的复制,请执行以下操作:
1.启动MySQL从站并连接到它。
2.执行CHANGE MASTER TO语句以设置主复制服务器配置。
在每个从站上执行这些从站设置步骤。
如果您正在设置新服务器,但是却要从要加载到复制配置中的其他服务器中获取数据库的现有转储,则也可以使用此方法。 通过将数据加载到新的主数据中,数据会自动复制到从服务器。
如果使用来自其他现有数据库服务器的数据创建新复制环境以创建新主数据库,请在新主数据库上运行该服务器生成的转储文件。 数据库更新会自动传播到从站:
shell> mysql -h master < fulldb.dump
16.1.2.5.4 使用现有数据设置复制
使用现有数据设置复制时,请在开始复制之前将快照从主服务器传输到从服务器。 将数据导入从服务器的过程取决于您如何在主服务器上创建数据快照。
如果使用mysqldump:
1.使用 --skip-slave-start 启动slave,这样复制不会启动。
2.导入dump file:
shell> mysql < fulldb.dump
3.使用主站的复制坐标配置从站。 这告诉从属二进制日志文件和位置在需要启动复制的文件中。 另外,使用主设备的登录凭证和主机名称来配置从设备。
4.启用slave 线程:
mysql> START SLAVE;
执行此过程后,从属服务器连接到主服务器,并复制自从创建快照以来在主服务器上发生的所有更新。
如果主站的server-id选项没有正确设置,则从站无法连接到它。 同样,如果您没有正确设置server的server-id选项,那么在slave的错误日志中会出现以下错误:
Warning: You should set server-id to a non-0 value if master_host is set; we will force server id to 2, but this MySQL server will not act as a slave.
如果由于任何其他原因无法复制,您也可以在从站的错误日志中找到错误消息
从站在主信息存储库中存储有关您配置的主站的信息。 主信息存储库可以是文件或表格的形式,由--master-info-repository设置的值确定。 当一个从机使用--master-info-repository = FILE时,两个文件存储在数据目录中,名为http://master.info和http://relay-log.info。 如果使用--master-info-repository = TABLE,则将此信息保存在mysql数据库的master_slave_info表中。 在任何一种情况下,请勿删除或编辑文件或表。 始终使用CHANGE MASTER TO语句来更改复制参数。 从站可以使用语句中指定的值自动更新状态文件
注意:
主信息存储库的内容会覆盖命令行或my.cnf中指定的一些服务器选项。
主机的一个快照足以满足多个从机的需求。 要设置更多的从站,请使用相同的主站快照,并按照上述过程的从站部分进行操作。
16.1.2.6 为复制环境增加一个slave
您可以将另一个从站添加到现有的复制配置,而无需停止主站。 相反,通过复制现有的从设备来设置新的从设备,不同之处在于您使用不同的服务器标识值配置新的从设备。
要复制现有的从站:
1.关闭现有的从站:
shell> mysqladmin shutdown
2.将数据目录从现有的从站复制到新的从站。 您可以通过使用tar或WinZip创建存档或使用cp或rsync等工具执行直接复制来完成此操作。 确保您也复制日志文件和中继日志文件。
添加新复制从服务器时遇到的一个常见问题是,新从服务器失败,并显示如下一系列警告和错误消息:
071118 16:44:10 [Warning] Neither --relay-log nor --relay-log-index were used; so
replication may break when this MySQL server acts as a slave and has his hostname
changed!! Please use '--relay-log=new_slave_hostname-relay-bin' to avoid this problem. 071118 16:44:10 [ERROR] Failed to open the relay log './old_slave_hostname-relay-bin.003525'
(relay_log_pos 22940879)
071118 16:44:10 [ERROR] Could not find target log during relay log initialization
071118 16:44:10 [ERROR] Failed to initialize the master info structure
如果未指定--relay-log选项,则会出现此情况,因为中继日志文件包含主机名作为其文件名的一部分。 如果不使用--relay-log-index选项,这也适用于中继日志索引文件。
为避免此问题,请在现有从站上使用的新从站上使用相同的值--relay-log。 如果未在现有从站上明确设置此选项,请使用existing_slave_hostname-relay-bin。 如果这不可行,请将现有从站的中继日志索引文件复制到新的从站,并在新的从站上设置--relay-log-index选项以匹配现有从站上使用的选项。 如果未在现有从站上明确设置此选项,请使用existing_slave_hostname-relay-bin.index。 或者,如果您已按照本节中的其余步骤尝试启动新的从站,并遇到类似前面所述的错误,请执行以下步骤:
如果您已经重新启动了现有的从站,则还要在现有的从站上发出STOP SLAVE。
3.当拷贝完成,重新现存的slave
4.启动新的从属服务器,指定--skip-slave-start选项,以便复制尚未启动。 使用性能架构复制表或发出SHOW SLAVE STATUS以确认新从站与现有从站相比具有正确的设置。 还显示服务器ID和服务器UUID,并验证这些对于新从站是否正确且唯一。
5.开始新的slave。 从站使用其主信息库中的信息来启动复制过程。
6.通过发出START SLAVE语句启动从属线程:
mysql> START SLAVE;
新的slave现在使用其主信息库中的信息来启动复制过程。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3164990/ ,如需转载,请注明出处,否则将追究法律责任。