ITPub博客

首页 > 数据库 > > 16.1 配置复制

16.1 配置复制

作者:飘絮絮絮丶 时间:2020-05-11 14:15:20 0 删除 编辑

参考官方文档:
dev.mysql.com/doc/refma


复制功能可将来自一台MySQL数据库服务器(主服务器)的数据复制到一台或多台MySQL数据库服务器(从服务器)。 默认情况下复制是异步的; 从属设备不需要永久连接以接收来自主设备的更新。 根据配置,您可以复制数据库中的所有数据库,选定数据库或甚至选定的表。


MySQL中复制的优点包括:

  • 横向扩展解决方案 - 将负载分散到多个从站以提高性能。 在此环境中,所有写入和更新都必须在主服务器上进行。 然而,读可能发生在一个或多个slave身上。 该模型可以提高写入性能(因为主机专门用于更新),同时越来越多的从机提高读取速度。
  • 数据安全性 - 因为数据被复制到slave,并且slave可以暂停复制过程,所以可以在从属设备上运行备份服务而不会破坏相应的主数据。
  • 分析 - 可以在主设备上创建实时数据,而信息分析可以在从设备上进行,而不会影响主设备的性能。
  • 远程数据分发 - 您可以使用复制为远程站点创建本地数据副本,而无需永久访问主数据。


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服务器以使用基于二进制日志文件位置的复制。 有多种不同的设置复制方法,使用的确切方法取决于您如何设置复制以及您的主数据库中是否已有数据。



有一些通用任务对所有设置都是通用的:

  • 在主设备上,您必须启用二进制日志记录并配置唯一的服务器标识。 这可能需要重新启动服务器。
  • 在要连接到主站的每个slave上,您必须配置一个唯一的服务器ID。 这可能需要重新启动服务器。
  • 可选的,在读取二进制日志进行复制时,为主服务器创建一个单独的用户,以便在与主服务器进行身份验证时使用它
  • 在创建数据快照或启动复制过程之前,在主数据库上应记录二进制日志中的当前位置。 在配置从站时需要此信息,以便从站知道二进制日志内的哪个位置开始执行事件
  • 如果主服务器上已有数据并希望使用它来同步从服务器,则需要创建数据快照以将数据复制到从服务器。 您正在使用的存储引擎会影响您创建快照的方式。 在使用MyISAM时,必须停止处理主服务器上的语句以获取读锁定,然后获取其当前二进制日志坐标并转储其数据,然后再允许主服务器继续执行语句。 如果不停止语句的执行,数据转储和主状态信息将不匹配,从而导致从服务器上的数据库不一致或损坏。 有关复制MyISAM主节点的更多信息,请参见第16.1.2.3节“获取复制主二进制日志坐标”。 如果您使用的是InnoDB,则不需要读取锁,并且足够长的传输数据快照的事务已足够。 有关更多信息,请参见第14.19节“InnoDB和MySQL复制”。
  • 使用连接到主站的设置来配置从站,例如主机名,登录凭证和二进制日志文件的名称和位置。



注意:
设置过程中的某些步骤需要SUPER权限。 如果您没有此权限,则可能无法启用复制。


配置基本选项后,选择您的方案:

  • 要设置全新安装主站和不包含数据的从站的复制,请参见第16.1.2.5.3节“设置新主站和从站之间的复制”。
  • 要使用来自现有MySQL服务器的数据设置新主数据库的复制,请参见第16.1.2.5.4节“使用现有数据设置复制”。
  • 要将复制从服务器添加到现有复制环境,请参见第16.1.2.6节“将从服务器添加到复制环境”。



    16.1.2.1 配置master 复制配置




    要将主服务器配置为使用基于二进制日志文件位置的复制,您必须启用二进制日志记录并建立唯一的服务器ID。 如果尚未完成,则需要重新启动服务器。


    二进制日志记录必须在主服务器上启用,因为二进制日志是将主服务器的更改复制到其从服务器的基础。 如果在使用log-bin选项的主服务器上未启用二进制日志记录,则复制是不可能的。


    复制组中的每个服务器都必须配置唯一的服务器标识。 此ID用于标识组中的单个服务器,并且必须是1到(2的32次方)-1之间的正整数。 您如何组织和选择数字是您的选择。


    要配置二进制日志和服务器ID选项,请关闭MySQL服务器并编辑my.cnf或my.ini文件。 在配置文件的[mysqld]部分中,添加log-bin和server-id选项。 如果这些选项已经存在,但已被注释掉,请取消注释选项并根据您的需要更改它们。 例如,要使用mysql-bin的日志文件名前缀启用二进制日志记录,并将服务器ID配置为1,请使用以下行:


    [mysqld]
    log-bin=mysql-bin
    server-id=1


    进行更改后,重新启动服务器。



    注意:
    以下选项对此过程有影响:
  • 如果您省略server-id(或者将其明确设置为默认值0),则主设备会拒绝来自从设备的任何连接。
  • 为了在使用InnoDB和事务的复制设置中实现最大可能的持久性和一致性,您应该在master my.cnf文件中使用innodb_flush_log_at_trx_commit = 1和sync_binlog = 1。
  • 确保您的复制主服务器上未启用跳过网络选项。 如果网络已禁用,则从站无法与主站通信,复制失败。




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选择数据快照的方法


如果主数据库包含现有数据,则需要将此数据复制到每个从属设备。 有多种方法可以从主数据库转储数据。 以下各节介绍可能的选项。


要选择转储数据库的适当方法,请在以下选项中进行选择:

  • 使用mysqldump工具来创建您想要复制的所有数据库的转储。 这是推荐的方法,尤其是使用InnoDB时。
  • 如果您的数据库存储在二进制可移植文件中,则可以将原始数据文件复制到从站。 这可以比使用mysqldump并在每个从属设备上导入文件更有效,因为它会在重播INSERT语句时跳过更新索引的开销。 对于像InnoDB这样的存储引擎,这是不推荐的。



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。 选择以下选项之一:

  • 使用--ignore-table选项排除数据库中的所有表。
  • 使用--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选项,否则所有数据库中的所有表都存储在系统表空间文件中。


以下文件不需要复制:

  • 与mysql数据库相关的文件。
  • 主信息存储库文件(如果使用的话)(请参见第16.2.4节“复制中继和状态日志”)。
  • master的二进制日志
  • 任何relay log 文件



根据您是否使用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


以下各节介绍如何设置从站。 在继续之前,请确保您拥有:

  • 使用必要的配置属性配置MySQL主服务器。
  • 包含master状态信息
  • 在master 上,释放读锁:

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节“设置新主站和从站之间的复制”。
  • 如果您有要导入的数据库快照。





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时,两个文件存储在数据目录中,名为master.info和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。

如果您已经重新启动了现有的从站,则还要在现有的从站上发出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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42234