MySQL
MySQL高可用配置
MySQL Slave状态参数详解
基于二进制日志文件的复制
使用全局事务标识符GTID复制
MySQL安装升级
MySQL RPM包安装参考
MySQL编译化安装参考
MySQL Server版本升级
MySQL 操作手册/说明
MySQL导入导出操作
库,表,字段的字符集修改方法
根据字段生成自定义SQL语句
MySQL查询流程概述
MySQL 常用脚本
MySQL数据库冷备脚本
MySQL内存占用分析
MySQL内存消耗分析
检查MySQL引起的高内存占用
InnoDB下的内存分析和优化计算
MySQL常见问题
MySQL告警:Aborted connection日志的分析
MySQL使用命令kill进程后出现killed死锁问题
从库重起初始化relaylog失败
安全插件Connection-Control导致无法登录的问题
MySQL性能优化
MySQL查询慢性能分析
本文档使用 MrDoc 发布
-
+
home page
基于二进制日志文件的复制
## 1、配置概述 本节介绍基于二进制日志文件位置方法的 MySQL 服务器之间的复制,其中作为主数据库(数据库更改的主数据库)运行的 MySQL 实例将更新和更改作为“事件”写入二进制日志。根据记录的数据库更改,二进制日志中的信息以不同的日志格式存储。从实例配置为从主数据库读取二进制日志并在从实例的本地数据库上执行二进制日志中的事件。 每个从实例都会收到一份二进制日志全部内容的从实例。从实例有权决定应该执行二进制日志中的哪些语句。除非您另外指定,否则主数据库二进制日志中的所有事件都在从实例上执行。如有需要,您可以将从实例配置为仅处理适用于特定数据库或表的事件。 > *重要: 您不能将主数据库配置为仅记录某些事件。* 每个从实例都会记录二进制日志坐标:它从主数据库读取和处理的文件名和文件中的位置。这意味着多个从实例可以连接到主数据库并执行同一二进制日志的不同部分。由于从实例控制此过程,因此单个从实例可以与服务器连接和断开连接,而不会影响主数据库的操作。此外,由于每个从实例都记录了二进制日志中的当前位置,因此从实例可能会断开连接,重新连接,然后继续处理。 主数据库和每个从实例必须配置一个唯一的 ID(使用`server_id`系统变量)。此外,每个从实例都必须配置有关主数据库主机名、日志文件名和该文件中位置的信息。可以使用`CHANGE MASTER TO`从实例上的语句从 MySQL 会话中控制这些详细信息。详细信息存储在从实例的连接元数据存储库中,它可以是文件或表。 ## 2、 配置基于二进制文件的复制 本节介绍如何设置 MySQL 服务器以使用基于二进制日志文件位置的复制。设置复制有多种不同的方法,使用的确切方法取决于您设置复制的方式以及主数据库数据库中是否已有数据。 有一些通用任务对所有设置都是通用的: 1. 在主主数据库上,您必须启用二进制日志记录并配置唯一的服务器 ID。这可能需要重新启动服务器。 2. 在要连接到主数据库的每个从实例上,您必须配置唯一的服务器 ID。这可能需要重新启动服务器。 3. 在读取二进制日志以进行复制时,在主主数据库上为您的从实例创建一个单独的用户,以便在对主数据库进行身份验证期间使用。 4. 在开始复制之前,您应该在主数据库上记录二进制日志中的当前位置。配置从实例时需要此信息,以便从实例知道二进制日志中的何处开始执行事件。 5. 如果您已经在主数据库上有数据并希望使用它来同步从实例,则需要创建数据快照以将数据复制到从实例。您使用的存储引擎会影响您创建快照的方式。使用MyISAM引擎时,必须停止处理主数据库上的语句并缩表为仅读,然后获取其当前二进制日志坐标并转储其数据,然后才能允许主数据库继续执行语句。如果不停止语句的执行,数据转储和主数据库的状态信息不匹配,导致从实例上的数据库不一致或损坏。 > 说明: 设置过程中的某些步骤需要 **SUPER** 特权。如果您没有此权限,则可能无法启用复制。 ## 3、 设置复制主数据库配置 要将主数据库配置为使用基于二进制日志文件位置的复制,您必须确保启用二进制日志记录,并建立唯一的服务器 ID。 复制拓扑中的每个服务器都必须配置一个唯一的服务器 ID,您可以使用server_id系统变量指定该 ID 。此服务器 ID 用于标识复制拓扑中的各个服务器,并且必须是 1 和 (2 32 )-1之间的正整数。您可以server_id通过发出如下语句来动态更改该 值: ```sql SET GLOBAL server_id = 2; ``` 默认服务器 ID 为 0 时,主数据库拒绝来自从实例的任何连接,从实例拒绝连接到主数据库,因此无法在复制拓扑中使用此值。只要每个服务器 ID 与复制拓扑中的任何其他服务器使用的每个其他服务器 ID 保持不同即可。 > 注意: 如果先前为服务器 ID 设置了值 0,则必须重新启动服务器以使用新的非零服务器 ID 初始化主数据库。否则,不需要重新启动服务器,除非您需要启用二进制日志记录或进行其他需要重新启动的配置更改。 必须在主数据库上启用二进制日志记录,因为二进制日志是将更改主实例复制到其从实例的基础。如果在主数据库上未启用`log-bin` 选项,则无法进行复制。要在尚未启用的服务器上启用二进制日志记录,您必须重新启动服务器。 在这种情况下,关闭 MySQL 服务器并编辑 my.cnf或my.ini文件。在[mysqld]配置文件的部分中,添加`log-bin`和 `server-id`选项。如果这些选项已经存在,但已被注释掉,请取消注释这些选项并根据您的需要更改它们。例如,要使用日志文件名前缀启用二进制日志记录 mysql-bin,并将服务器 ID 配置为 1,请使用以下行: ``` [mysqld] log-bin=mysql-bin server-id=1 ``` 进行更改后,重新启动服务器。 为了在使用InnoDB事务的复制设置中获得最大可能的持久性和一致性 ,您应该在my.cnf的主数据库文件中使用如下变量: ``` innodb_flush_log_at_trx_commit=1 sync_binlog=1 ``` 并且确保在主数据库文件中未启用系统变量`skip_networking`。如果网络已禁用,从实例将无法与主数据库通信并且复制失败。 ## 4、创建复制用户 每个从实例都使用 MySQL 用户名和密码连接到主数据库,因此主数据库上必须有一个用户帐户可用于从实例连接。设置从实例时,用户名由命令中的`MASTER_USER`选项指定`CHANGE MASTER TO`。 任何帐户都可以用于此操作,前提是它已被授予`REPLICATION SLAVE` 特权。您可以选择为每个从实例创建不同的帐户,或者为每个从实例使用相同的帐户连接到主数据库。 要创建新帐户,请使用`CREATE USER`。要授予此帐户复制所需的权限,请使用`GRANT` 语句。如果您仅以复制为目的的创建帐户,则该帐户只需要 `REPLICATION SLAVE`权限。例如,要设置一个repl可以从example.com域内的任何主机连接以进行复制的新用户 ,请在主数据库上发出以下语句: ``` mysql> mysql>CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com'; ``` ## 5、获取主实例的日志坐标 要将从实例配置为在正确的点开始复制过程,您需要在其二进制日志中记录主数据库的当前坐标。 > 警告: 此过程使用`FLUSH TABLES WITH READ LOCK`,它会阻止 COMMIT对InnoDB表的操作。 要获取主数据库的二进制日志坐标,请执行以下步骤: 通过使用命令行客户端连接到主数据库,在主数据库上启动会话,并通过执行以下语句刷新所有表并阻止写入语句: ``` mysql> FLUSH TABLES WITH READ LOCK; ``` > 警告 让您从中发出FLUSH TABLES语句的客户端保持 运行状态,以便读取锁定保持有效。如果退出客户端,则锁定被释放。 在主数据库上的不同会话中,使用该 `SHOW MASTER STATUS`语句来确定当前的二进制日志文件名和位置: ```sql mysql > SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 73 | test | manual,mysql | +------------------+----------+--------------+------------------+ ``` 该File列显示日志文件的名称,该列显示文件Position中的位置。在这个例子中,二进制日志文件是mysql-bin.000003,位置是 73。记录这些值。稍后在设置从实例时需要它们。它们表示从实例应开始处理来自主数据库的新更新的复制坐标。 >说明: 如果主数据库之前在未启用二进制日志记录的情况下运行,则`SHOW MASTER STATUS`或`mysqldump --master-data`显示的日志文件名和位置值为空。在这种情况下,您稍后在指定主数据库的日志文件和位置时需要使用的值为空字符串 ( '') 和4。 下一步取决于您是否有主数据库上的现有数据。选择以下选项之一: - 如果您的现有数据需要在开始复制之前与从实例同步,请让客户端保持运行状态,以便锁定保持原位。这可以防止进行任何进一步的更改,以便复制到从实例的数据与主数据库同步。 - 如果您正在设置新的复制拓扑,您可以退出第一个会话以释放读锁。 ## 6、使用 mysqldump 创建数据快照 要在现有主数据库中创建数据的快照,请使用mysqldump工具。完成数据转储后,在开始复制过程之前将此数据导入从实例。 以下示例将所有数据库转储到名为dbdump.db的文件中,并包括`--master-data`自动附加从实例所需的`CHANGE MASTER TO`语句以启动复制过程的选项: ``` shell> mysqldump --all-databases --master-data > dbdump.db ``` > 说明: 如果不使用 --master-data,则需要手动锁定单独会话中的所有表 可以使用mysqldump工具从转储中排除某些数据库。如果要选择包含在转储中的数据库,请不要使用`--all-databases`. 选择以下选项之一: 1、 使用`--ignore-table`选项排除数据库中的所有表 。 2、 仅命名要使用该`--databases`选项转储的那些数据库 。 要导入数据,请将转储文件复制到从实例,或者在远程连接到从实例时从主数据库访问文件。 ## 7、设置从实例 以下部分描述了如何设置从实例。在继续之前,请确保您拥有: 使用必要的配置属性配置主数据库。 获取主数据库的状态信息,或在数据快照关闭期间制作的主数据库二进制日志索引文件的从实例。 在主数据库上,释放读锁: ``` mysql> UNLOCK TABLES; ``` ## 8、 设置从实例配置 每个从实例必须有一个唯一的服务器 ID,由`server_id`系统变量指定 。如果您要设置多个从实例,则每个从实例都必须具有`server_id`与主数据库和任何其他从实例不同的唯一值。如果尚未设置从实例的服务器 ID,或者当前值与您为主数据库服务器或其他从实例选择的值冲突,您必须更改它。默认 `server_id`值为 0,从实例拒绝连接到主数据库。 您可以server_id 通过发出如下语句来动态更改该值: ``` SET GLOBAL server_id = 21; ``` 如果server_id 之前设置了默认值 0,则必须重新启动服务器以使用新的非零服务器 ID 初始化从实例。否则,更改服务器 ID 时不需要重新启动服务器,除非您进行其他需要它的配置更改。例如,如果在服务器上禁用了二进制日志记录,而您希望为从实例启用它,则需要重新启动服务器才能启用此功能。 如果要关闭从实例服务器,则可以编辑[mysqld]配置文件的 部分以指定唯一的服务器 ID。例如: ``` [mysqld] server-id=21 ``` 从实例不需要启用二进制日志记录即可进行复制。但是,从实例上的二进制日志意味着从实例的二进制日志可用于数据备份和崩溃恢复。启用了二进制日志记录的从实例也可以用作更复杂的复制拓扑的一部分。如果要在从实例上启用二进制日志记录,请使用配置文件部分中`[mysqld]`配置下的`log-bin`选项 。需要重新启动服务器才能在以前未使用它的服务器上启动二进制日志记录。 ## 9、 在从实例上设置主数据库配置 要将从实例设置为与复制主数据库通信,请使用必要的连接信息配置从实例。为此,请在从实例上执行以下语句,将选项值替换为与您的系统相关的实际值: ``` mysql> CHANGE MASTER TO MASTER_HOST='ipaddress',MASTER_USER='username',\ MASTER_PASSWORD='userpassword',MASTER_LOG_FILE='log_file_name',\ MASTER_LOG_POS=log_position; ``` > 说明 主从复制不能使用 Unix 套接字文件。您必须能够使用 TCP/IP 连接到主数据库 MySQL 服务器。 该`CHANGE MASTER TO`语句还有其他选项。例如,可以使用 SSL 设置安全复制。有关选项的完整列表以及有关字符串值选项的最大允许长度的信息。 ## 9、在新主数据库和从实例之间设置复制 当没有要导入的先前数据库的快照时,将从实例配置为从新的主数据库开始复制。 要在主数据库和新从实例之间设置复制: - 启动从实例并连接到它。 - 执行一条`CHANGE MASTER TO` 语句来设置主数据库配置。 - 在每个从实例上执行这些设置步骤 如果您正在设置新服务器,但有来自不同服务器的数据库的现有转储要加载到您的复制配置中,也可以使用此方法。通过将数据加载到新主数据库,数据会自动复制到从实例。 如果要使用来自不同现有数据库服务器的数据设置新的复制环境以创建新主数据库,请在新主数据库上运行从该服务器生成的转储文件。数据库更新会自动传播到从实例: ``` shell> mysql -h master < fulldb.dump ``` ## 10、使用现有数据设置复制 使用现有数据设置复制时,请在开始复制之前将快照从主数据库传输到从实例。将数据导入从实例的过程取决于您在主数据库上创建数据快照的方式。 1. 如果您使用mysqldump: 使用该`--skip-slave-start`选项启动从实例, 以便不启动复制。 导入转储文件: ``` shell> mysql < fulldb.dump ``` 2. 如果您使用原始数据文件创建了快照: 将数据文件提取到从实例的数据目录中。例如: ``` shell> tar xvf dbdump.tar ``` 您可能需要设置文件的权限和所有权,以便从实例服务器可以访问和修改它们。 使用该`--skip-slave-start`选项启动从实例, 以便不启动复制。 使用来自主数据库的复制坐标配置从实例。这告诉从实例二进制日志文件和文件中复制需要开始的位置。此外,使用主数据库的登录凭据和主机名配置从实例。 启动复制线程: ``` mysql> START SLAVE; ``` 执行此过程后,从实例将连接到主数据库并复制自拍摄快照以来主数据库上发生的任何更新。 如果`server_id`主数据库的系统变量设置不正确,从实例将无法连接到它。同样,如果您没有为从实例正确设置`server_id` ,您会在从实例的错误日志中收到以下错误: >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 主数据库的单个快照足以支持多个从实例。要设置其他从实例,请使用相同的主数据库快照并按照刚才描述的过程的从实例部分进行操作。
Nathan
April 25, 2024, 1:27 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password