复制允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。 默认情况下,复制是异步的 从站不需要永久连接以接收来自主站的更新。 根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。
MySQL中复制的优点包括:
横向扩展解决方案 - 在多个从站之间分配负载以提高性能。 在此环境中,所有写入和更新都必须在主服务器上进行。 但是,读取可能发生在一个或多个从站上。 该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。
数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。
分析 - 可以在主服务器上创建实时数据,而信息的分析可以在从服务器上进行,而不会影响主服务器的性能。
远程数据分发 - 您可以使用复制为远程站点创建数据的本地副本,而无需永久访问主服务器。
有关如何在此类方案中使用复制的信息,请参见 第17.3节“复制解决方案” 。
MySQL 8.0支持不同的复制方法。 传统方法基于从主机的二进制日志复制事件,并要求其中的日志文件和位置在主机和从机之间同步。 基于 全局事务标识符 (GTID) 的较新方法 是事务性的,因此不需要处理这些文件中的日志文件或位置,这极大地简化了许多常见的复制任务。 只要在主服务器上提交的所有事务也已应用于从服务器,使用GTID进行复制可确保主服务器和从服务器之间的一致性。 有关MySQL中基于GTID和GTID的复制的更多信息,请参见 第17.1.3节“使用全局事务标识符复制” 。 有关使用基于二进制日志文件位置的复制的信息,请参见 第17.1节“配置复制” 。
MySQL中的复制支持不同类型的同步。 原始类型的同步是单向异步复制,其中一个服务器充当主服务器,而一个或多个其他服务器充当从服务器。 这与 作为NDB Cluster特征 的 同步 复制 形成对比 (参见 第22章, MySQL NDB Cluster 8.0 )。 在MySQL 8.0中,除了内置的异步复制之外,还支持半同步复制。 使用半同步复制,在返回执行事务的会话之前对主块执行提交,直到至少一个从服务器确认已接收并记录事务的事件为止; 看到 第17.3.11节“半同步复制” 。 MySQL 8.0还支持延迟复制,使得从属服务器故意滞后于主服务器至少一段指定的时间; 请参见 第17.3.12节“延迟复制” 。 对于 需要 同步 复制的 方案 ,请使用NDB Cluster(请参阅 第22章, MySQL NDB Cluster 8.0 )。
有许多解决方案可用于在服务器之间设置复制,最佳使用方法取决于您使用的数据和引擎类型的存在。 有关可用选项的更多信息,请参见 第17.1.2节“设置基于二进制日志文件位置的复制” 。
有两种核心类型的复制格式:基于语句的复制(SBR),它复制整个SQL语句,以及基于行的复制(RBR),它仅复制已更改的行。 您还可以使用第三种混合复制(MBR)。 有关不同复制格式的更多信息,请参见 第17.2.1节“复制格式” 。
通过许多不同的选项和变量来控制复制。 有关更多信息,请参见 第17.1.6节“复制和二进制日志记录选项和变量” 。
您可以使用复制来解决许多不同的问题,包括性能,支持不同数据库的备份,以及作为缓解系统故障的更大解决方案的一部分。 有关如何解决这些问题的信息,请参见 第17.3节“复制解决方案” 。
有关如何在复制期间处理不同数据类型和语句的说明和提示,包括复制功能,版本兼容性,升级和潜在问题及其解决方案的详细信息,请参见 第17.4节“复制说明和提示” 。 有关MySQL Replication新手经常提出的一些问题的答案,请参见 第A.13节“MySQL 8.0 FAQ:复制” 。
有关复制实现,复制如何工作,二进制日志的过程和内容,后台线程以及用于决定如何记录和复制语句的规则的详细信息,请参见 第17.2节“复制实现” 。
本节介绍如何配置MySQL中可用的不同类型的复制,并包括复制环境所需的设置和配置,包括创建新复制环境的分步说明。 本节的主要组成部分是:
有关使用二进制日志文件位置设置两个或多个服务器进行复制的指南, 第17.1.2节“设置基于二进制日志文件位置的复制”还 介绍了服务器的配置,并提供了在主服务器之间复制数据的方法和奴隶。
有关使用GTID事务设置两个或多个服务器进行复制的指南, 第17.1.3节“使用全局事务标识符复制” 处理服务器的配置。
二进制日志中的事件使用多种格式记录。 这些被称为基于语句的复制(SBR)或基于行的复制(RBR)。 第三种类型的混合格式复制(MIXED)自动使用SBR或RBR复制,以在适当时利用SBR和RBR格式的优势。 第17.2.1节“复制格式” 中讨论了不同的格式 。
有关适用于复制的不同配置选项和变量的详细信息,请参见 第17.1.6节“复制和二进制日志记录选项和变量” 。
一旦启动,复制过程应该几乎不需要管理或监视。 但是,有关您可能要执行的常见任务的建议,请参见 第17.1.7节“通用复制管理任务” 。
本节介绍基于二进制日志文件位置方法的MySQL服务器之间的复制,其中作为主服务器运行的MySQL实例(数据库源更改)将更新和更改作为 “ 事件 ” 写入 二进制日志。 二进制日志中的信息根据记录的数据库更改以不同的日志记录格式存储。 从站配置为从主站读取二进制日志,并在从站的本地数据库上执行二进制日志中的事件。
每个从站都会收到二进制日志的全部内容的副本。 从属设备负责决定应该执行二进制日志中的哪些语句。 除非另行指定,否则主从二进制日志中的所有事件都在从站上执行。 如果需要,您可以将从站配置为仅处理适用于特定数据库或表的事件。
您无法将主服务器配置为仅记录特定事件。
每个从站都会记录二进制日志坐标:文件名和文件中它从主站读取和处理的位置。 这意味着可以将多个从站连接到主站并执行同一二进制日志的不同部分。 由于从站控制此过程,因此可以在服务器上连接和断开各个从站,而不会影响主站的操作。 此外,由于每个从站都记录了二进制日志中的当前位置,因此可以断开从站的连接,重新连接然后恢复处理。
必须使用唯一ID配置主站和每个从站(使用该
server-id
选项)。
此外,必须为每个从站配置有关主主机名,日志文件名和该文件中位置的信息。
可以使用
CHANGE
MASTER TO
从属语句在
MySQL会话中控制这些详细信息
。
详细信息存储在从属主信息存储库中(请参见
第17.2.4节“复制中继和状态日志”
)。
本节介绍如何设置MySQL服务器以使用基于二进制日志文件位置的复制。 设置复制有许多不同的方法,确切的使用方法取决于您如何设置复制,以及您是否已在主数据库中拥有数据。
所有设置都有一些通用的通用任务:
在主服务器上,您必须确保启用了二进制日志记录,并配置唯一的服务器ID。 这可能需要重新启动服务器。 请参见 第17.1.2.1节“设置复制主配置” 。
在要连接到主服务器的每个从服务器上,必须配置唯一的服务器ID。 这可能需要重新启动服务器。 请参见 第17.1.2.2节“设置复制从站配置” 。
(可选)在读取二进制日志以进行复制时,为主服务器创建一个单独的用户,以便在与主服务器进行身份验 请参见 第17.1.2.3节“为复制创建用户” 。
在创建数据快照或启动复制过程之前,您应该在主服务器上记录二进制日志中的当前位置。 配置从站时需要此信息,以便从站知道二进制日志中的哪个位置开始执行事件。 请参见 第17.1.2.4节“获取复制主二进制日志坐标” 。
如果您已经拥有主服务器上的数据并希望使用它来同步从服务器,则需要创建数据快照以将数据复制到从服务器。
您使用的存储引擎会影响您创建快照的方式。
在使用时
MyISAM
,必须停止处理主服务器上的语句以获取读锁定,然后获取其当前的二进制日志坐标并转储其数据,然后才允许主服务器继续执行语句。
如果不停止执行语句,则数据转储和主状态信息将不匹配,从而导致从站上的数据库不一致或损坏。
有关复制
MyISAM
主服务器的
更多信息
,请参阅
第17.1.2.4节“获取复制主二进制日志坐标”
。
如果您正在使用
InnoDB
,则不需要读锁定,并且足够长的事务来传输数据快照就足够了。
有关更多信息,请参见
第15.18节“InnoDB和MySQL复制”
。
使用用于连接到主服务器的设置配置从服务器,例如主机名,登录凭据和二进制日志文件名和位置。 请参见 第17.1.2.7节“在从站上设置主站配置” 。
设置过程中的某些步骤需要该
SUPER
权限。
如果您没有此权限,则可能无法启用复制。
配置基本选项后,选择您的方案:
要为不包含数据的主站和从站的全新安装设置复制,请参见 第17.1.2.6.1节“使用新主站和从站设置复制” 。
要使用现有MySQL服务器中的数据 设置新主 服务器的 复制 ,请参见 第17.1.2.6.2节“使用现有数据设置复制” 。
要将复制从站添加到现有复制环境,请参见 第17.1.2.8节“将从站添加到复制环境” 。
在管理MySQL复制服务器之前,请阅读整章并尝试 第13.4.1节“用于控制主服务器的SQL语句” 和 第13.4.2节“用于控制从属服务器的SQL语句 ”中 提到的所有语句 。 还要熟悉 第17.1.6节“复制和二进制日志记录选项和变量”中 所述的复制启动选项 。
要将主服务器配置为使用基于二进制日志文件位置的复制,必须确保启用二进制日志记录,并建立唯一的服务器ID。 如果尚未执行此操作,则需要重新启动服务器。
主服务器上需要二进制日志记录,因为二进制日志是将更改从主服务器复制到其从服务器的基础。
默认情况下启用二进制日志记录(
log_bin
系统变量设置为ON)。
该
--log-bin
选项告诉服务器用于二进制日志文件的基本名称。
建议您指定此选项以为二进制日志文件提供非默认基本名称,以便在主机名更改时,您可以轻松地继续使用相同的二进制日志文件名(请参见
第B.4.7节“已知” MySQL中的问题“
)。
必须使用唯一的服务器ID配置复制拓扑中的每个服务器,您可以使用该
--server-id
选项
指定该服务器ID
。
此服务器标识用于标识复制拓扑中的各个服务器,并且必须是介于1和(2
32
)-1
之间的正整数
。
如果在主服务器上设置服务器ID为0,则拒绝来自从服务器的任何连接,如果在从服务器上设置服务器ID为0,则拒绝连接到主服务器。
除此之外,您可以选择如何组织和选择数字,只要每个服务器ID与复制拓扑中任何其他服务器使用的每个其他服务器ID不同即可。
该
server_id
系统变量默认设置为1。
可以使用此默认服务器ID启动服务器,但如果未明确指定服务器ID,则会发出信息性消息。
以下选项也会对复制主机产生影响:
为了在使用
InnoDB
with transaction
的复制设置中实现最大的持久性和一致性
,您应该
在复制主
文件中
使用
innodb_flush_log_at_trx_commit=1
和
。
sync_binlog=1
my.cnf
确保
skip-networking
未在复制主机上启用
该
选项。
如果已禁用网络,则从属设备无法与主服务器通信,并且复制失败。
每个复制从站必须具有唯一的服务器ID。 如果尚未完成此操作,则从属设置的这一部分需要重新启动服务器。
如果尚未设置从属服务器ID,或者当前值与您为主服务器选择的值冲突,请关闭从属服务器并编辑
[mysqld]
配置文件
的
部分以指定唯一的服务器ID。
例如:
的[mysqld] 服务器ID = 2
进行更改后,重新启动服务器。
如果要设置多个从站,则每个从站必须具有唯一的非零
server-id
值,该值不同于主站和任何其他从站的
非零
值。
默认情况下,在所有服务器上启用二进制日志记录 从站不需要启用二进制日志记录以进行复制。 但是,从站上的二进制日志记录意味着从站的二进制日志可用于数据备份和崩溃恢复。
启用了二进制日志记录的从站也可以用作更复杂的复制拓扑的一部分。 例如,您可能希望使用此链式排列设置复制服务器:
A - > B - > C.
在这里,
A
作为奴隶的主人
B
,并
B
作为奴隶的主人
C
。
为此,
B
必须是主人
和
奴隶。
收到的更新
A
必须记录
B
到其二进制日志中,以便传递给
C
。
除二进制日志记录外,此复制拓扑还需要
--log-slave-updates
启用
该
选项。
使用此选项,从站将从主服务器接收并由从属SQL线程执行的更新写入从属自己的二进制日志。
--log-slave-updates
默认情况下启用
该
选项。
如果需要在从属服务器上禁用二进制日志记录或从属更新日志记录,则可以通过为从属服务器指定
--skip-log-bin
和
--skip-log-slave-updates
选项
来执行此操作
。
每个从站使用MySQL用户名和密码连接到主站,因此主站上必须有用户帐户,从站可以使用该帐户进行连接。
设置复制从站时
,用户名由
命令
MASTER_USER
上
的
选项
指定
CHANGE
MASTER TO
。
任何帐户都可以用于此操作,只要它已被授予
REPLICATION
SLAVE
特权。
您可以选择为每个从站创建不同的帐户,也可以使用每个从站的相同帐户连接到主站。
虽然您不必专门为复制创建帐户,但您应该知道复制用户名和密码以纯文本形式存储在主信息存储库表中
mysql.slave_master_info
(请参见
第17.2.4.2节“从属状态日志”
)。
因此,您可能希望创建一个仅具有复制过程权限的单独帐户,以最大程度地降低对其他帐户的危害。
要创建新帐户,请使用
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';
有关 操作用户帐户的语句的更多信息 , 请参见 第13.7.1节“帐户管理语句” 。
要使用使用
caching_sha2_password
插件进行
身份验证的用户帐户连接到复制主
服务器,必须按
第17.3.9节“设置复制以使用加密连接”中
所述设置安全连接
,或启用未加密连接以支持密码使用RSA密钥对进行交换。
该
caching_sha2_password
认证插件是从MySQL 8.0中创建新用户的默认(详见
第6.4.1.3,“缓存SHA-2插入式验证”
)。
如果您创建或用于复制的用户帐户(由
MASTER_USER
选项)使用此身份验证插件,并且您没有使用安全连接,必须启用基于RSA密钥对的密码交换才能成功连接。
要将从站配置为在正确的位置启动复制过程,您需要在其二进制日志中记下主站的当前坐标。
此过程使用
FLUSH TABLES
WITH
READ LOCK
,它阻止
表的
COMMIT
操作
InnoDB
。
如果您计划关闭主服务器以创建数据快照,则可以选择跳过此过程,而是存储二进制日志索引文件的副本以及数据快照。 在这种情况下,主服务器会在重新启动时创建新的二进制日志文件。 因此,从属服务器必须启动复制过程的主二进制日志坐标是该新文件的开始,该文件是在复制的二进制日志索引文件中列出的文件之后的主服务器上的下一个二进制日志文件。
要获取主二进制日志坐标,请按照下列步骤操作:
通过使用命令行客户端连接到主服务器来启动主服务器上的会话,并通过执行以下
FLUSH
TABLES WITH READ LOCK
语句
来刷新所有表和阻止写
语句:
MySQL的> FLUSH TABLES WITH READ LOCK;
让发出
FLUSH TABLES
语句
的客户端保持
运行状态,以使读锁定保持有效。
如果退出客户端,则会释放锁定。
在master上的不同会话中,使用该
SHOW MASTER STATUS
语句确定当前二进制日志文件的名称和位置:
mysql> SHOW MASTER STATUS;
+ ------------------ + ---------- + -------------- + ---- -------------- +
| 档案| 职位| Binlog_Do_DB | Binlog_Ignore_DB |
+ ------------------ + ---------- + -------------- + ---- -------------- +
| mysql-bin.000003 | 73 | 测试| manual,mysql |
+ ------------------ + ---------- + -------------- + ---- -------------- +
该
File
列显示日志文件的名称,列显示文件
Position
中的位置。
在此示例中,二进制日志文件是
mysql-bin.000003
,位置为73.记录这些值。
您在以后设置奴隶时需要它们。
它们表示从属服务器应从主服务器开始处理新更新的复制坐标。
如果主服务器先前已禁用二进制日志记录,则由
mysqldump
SHOW MASTER
STATUS
或
master-data
显示的日志文件名和位置值
将为空。
在这种情况下,稍后在指定从属日志文件和位置时需要使用的值是空字符串(
''
)和
4
。
现在,您可以获得所需的信息,以使从服务器能够从正确的位置开始读取二进制日志以开始复制。
下一步取决于您是否在主服务器上有现有数据。 选择以下选项之一:
如果在启动复制之前有现有数据需要与从属设备同步,请保持客户端正常运行,以便锁定保持不变。 这可以防止进行任何进一步的更改,以便复制到从站的数据与主站同步。 继续 第17.1.2.5节“选择数据快照的方法” 。
如果要设置新的主从复制组,则可以退出第一个会话以释放读锁定。 有关 如何继续 , 请参见 第17.1.2.6.1节“使用新主站和从站设置复制” 。
如果主数据库包含现有数据,则必须将此数据复制到每个从站。 有多种方法可以从master数据库转储数据。 以下部分描述了可能的选项。
要选择转储数据库的适当方法,请在以下选项之间进行选择:
要在现有主数据库中创建数据的快照,请使用 mysqldump 工具。 完成数据转储后,在开始复制过程之前将此数据导入从属服务器。
以下示例将所有数据库转储到名为的文件
dbdump.db
,并包含一个
--master-data
选项,
该
选项会自动附加
CHANGE MASTER
TO
从属服务器上所需
的
语句以启动复制过程:
外壳> mysqldump --all-databases --master-data > dbdump.db
如果不使用
--master-data
,则需要手动锁定单独会话中的所有表。
请参见
第17.1.2.4节“获取复制主二进制日志坐标”
。
可以使用
mysqldump
工具
从转储中排除某些数据库
。
如果要选择要包含在转储中的数据库,请不要使用
--all-databases
。
选择以下选项之一:
使用
--ignore-table
选项
排除数据库中的所有表
。
仅命名要使用该
--databases
选项
转储的数据库
。
有关更多信息,请参见 第4.5.4节“ mysqldump - 数据库备份程序” 。
要导入数据,请将转储文件复制到从站,或者在远程连接到从站时从主站访问该文件。
本节介绍如何使用组成数据库的原始文件创建数据快照。 将此方法与使用具有复杂缓存或记录算法的存储引擎的表一起使用需要额外的步骤来生成完美的 “ 时间点 ” 快照:初始复制命令可能会遗漏缓存信息并记录更新,即使您已获得了全局读锁。 存储引擎如何响应这取决于其崩溃恢复能力。
如果使用
InnoDB
表,则可以使用
MySQL Enterprise Backup组件中
的
mysqlbackup
命令生成一致的快照。
此命令记录与从站上使用的快照对应的日志名称和偏移量。
MySQL Enterprise Backup是一种商业产品,作为MySQL Enterprise订阅的一部分包含在内。
有关
详细信息
,
请参见
第30.2节“MySQL Enterprise备份概述”
。
这种方法还不能可靠地工作,如果主机和从机有不同的价值观
ft_stopword_file
,
ft_min_word_len
或者
ft_max_word_len
你是具有全文索引复制表。
假设上述异常不适用于您的数据库,请使用
冷备份
技术获取
InnoDB
表
的可靠二进制快照
:执行
MySQL服务器
的
慢速关闭
,然后手动复制数据文件。
要
MyISAM
在单个文件系统上存在MySQL数据文件时
创建
表
的原始数据快照
,可以使用标准文件复制工具(如
cp
或
copy)
,远程复制工具(如
scp
或
rsync)
,归档工具(如
zip
或
tar
,或
转储
等文件系统快照工具
。
如果仅复制某些数据库,请仅复制与这些表相关的文件。
对于
InnoDB
,所有数据库中的所有表都存储在
系统表空间中
文件,除非您
innodb_file_per_table
启用
了该
选项。
复制不需要以下文件:
与
mysql
数据库
相关的
文件。
主信息存储库文件
master.info
(如果使用);
现在不推荐使用此文件(请参见
第17.2.4节“复制中继和状态日志”
)。
主服务器的二进制日志文件,但二进制日志索引文件除外,如果您要使用它来定位从服务器的主二进制日志坐标。
任何中继日志文件。
根据您是否使用
InnoDB
表,请选择以下选项之一:
如果您正在使用
InnoDB
表,并且还要使用原始数据快照获得最一致的结果,请在此过程中关闭主服务器,如下所示:
获取读锁定并获取主控状态。 请参见 第17.1.2.4节“获取复制主二进制日志坐标” 。
在单独的会话中,关闭主服务器:
外壳> mysqladmin shutdown
制作MySQL数据文件的副本。 以下示例显示了执行此操作的常用方法。 您只需要选择其中一个:
shell> shell> shell>tar cf
/tmp/db.tar
./data
zip -r
/tmp/db.zip
./data
rsync --recursive
./data
/tmp/dbdata
重新启动主服务器。
如果您不使用
InnoDB
表,则可以从主服务器获取系统的快照,而无需按照以下步骤中所述关闭服务器:
获取读锁定并获取主控状态。 请参见 第17.1.2.4节“获取复制主二进制日志坐标” 。
制作MySQL数据文件的副本。 以下示例显示了执行此操作的常用方法。 您只需要选择其中一个:
shell> shell> shell>tar cf
/tmp/db.tar
./data
zip -r
/tmp/db.zip
./data
rsync --recursive
./data
/tmp/dbdata
在获取读锁定的客户端中,释放锁定:
MySQL的> UNLOCK TABLES;
创建数据库的存档或副本后,在启动从属复制过程之前将文件复制到每个从属服务器。
以下部分描述了如何设置从站。 在继续之前,请确保您拥有:
使用必要的配置属性配置MySQL主服务器。 请参见 第17.1.2.1节“设置复制主配置” 。
获取主数据状态信息,或者在关闭数据快照期间生成的主服务器二进制日志索引文件的副本。 请参见 第17.1.2.4节“获取复制主二进制日志坐标” 。
在master上,释放了读锁:
MySQL的> UNLOCK TABLES;
在slave上,编辑了MySQL配置。 请参见 第17.1.2.2节“设置复制从站配置” 。
接下来的步骤取决于您是否有现有数据导入到从属设备。 有关 更多信息 , 请参见 第17.1.2.5节“为数据快照选择方法” 。 选择以下之一:
如果没有要导入的数据库的快照,请参见 第17.1.2.6.1节“使用新主服务器和从服务器设置复制” 。
如果要导入数据库的快照,请参见 第17.1.2.6.2节“使用现有数据设置复制” 。
如果没有要导入的先前数据库的快照,请配置从属服务器以从新主服务器启动复制。
要在主服务器和新服务器之间设置复制:
启动MySQL slave。
执行
CHANGE MASTER TO
语句以设置主复制服务器配置。
请参见
第17.1.2.7节“在从站上设置主站配置”
。
在每个从站上执行这些从站设置步骤。
如果要设置新服务器但是要从要加载到复制配置中的其他服务器中转储现有数据库,也可以使用此方法。 通过将数据加载到新主服务器中,数据将自动复制到从服务器。
如果要使用来自其他现有数据库服务器的数据设置新的复制环境以创建新主服务器,请在新主服务器上运行从该服务器生成的转储文件。 数据库更新会自动传播到从属服务器:
外壳> mysql -h master < fulldb.dump
使用现有数据设置复制时,请在开始复制之前将快照从主服务器传输到从服务器。 将数据导入从站的过程取决于您在主站上创建数据快照的方式。
选择以下之一:
如果你使用 mysqldump :
使用该
--skip-slave-start
选项
启动从站,
以便不启动复制。
导入转储文件:
外壳> mysql < fulldb.dump
如果使用原始数据文件创建了快照:
将数据文件解压缩到从属数据目录中。 例如:
外壳> tar xvf dbdump.tar
您可能需要设置文件的权限和所有权,以便从服务器可以访问和修改它们。
使用该
--skip-slave-start
选项
启动从站,
以便不启动复制。
使用主服务器的复制坐标配置从服务器。
这告诉从服务器二进制日志文件和复制需要启动的文件中的位置。
此外,使用主服务器的登录凭据和主机名配置从服务器。
有关
CHANGE MASTER TO
所需语句的
更多信息
,请参见
第17.1.2.7节“在从站上设置主站配置”
。
启动从属线程:
MySQL的> START SLAVE;
执行此过程后,从属设备将连接到主服务器,并复制自拍摄快照以来主服务器上发生的所有更新。 如果由于任何原因无法复制,则会向从属的错误日志发出错误消息。
从站使用记录在其主信息日志和中继日志信息日志中的信息来跟踪它已处理的主站二进制日志的数量。
从MySQL 8.0,默认情况下,这些奴隶状态日志存储库是命名表
slave_master_info
,并
slave_relay_log_info
在
mysql
数据库中。
替代设置
--master-info-repository=FILE
以及
--relay-log-info-repository=FILE
存储库是命名文件
master.info
和
relay-log.info
数据目录
中的文件
现在已弃用,将在以后的版本中删除。
不要
不
删除或修改这些表(或文件,如果使用的话),除非你知道自己在做什么并完全理解的含义。
即使在这种情况下,也最好使用该
CHANGE MASTER
TO
语句来更改复制参数。
从站使用语句中指定的值自动更新从站状态日志。
有关
更多信息
,
请参见
第17.2.4节“复制中继和状态日志”
。
主信息日志的内容会覆盖命令行或中指定的某些服务器选项
my.cnf
。
有关
更多详细信息
,
请参见
第17.1.6节“复制和二进制日志记录选项和变量”
。
主站的单个快照足以满足多个从站的需要。 要设置其他从站,请使用相同的主快照,并按照上述过程的从属部分进行操作。
要将从站设置为与主站通信以进行复制,请使用必要的连接信息配置从站。 为此,请在从站上执行以下语句,将选项值替换为与系统相关的实际值:
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设置安全复制。
有关选项的完整列表以及有关字符串值选项的最大允许长度的信息,请参见
第13.4.2.1节“将语法更改为语法”
。
如
第17.1.2.3节“为复制创建用户”中所述
,如果未使用安全连接且
MASTER_USER
选项中
指定的用户帐户
使用
caching_sha2_password
插件进行
身份验证
(默认情况下为MySQL 8.0),则必须指定
MASTER_PUBLIC_KEY_PATH
或
GET_MASTER_PUBLIC_KEY
选项在
CHANGE MASTER TO
语句中启用基于RSA密钥对的密码交换。
您可以将另一个从站添加到现有复制配置,而无需停止主站。 为此,您可以通过复制现有从站的数据目录并为新从站提供不同的服务器ID(由用户指定)和服务器UUID(在启动时生成)来设置新从站。
要复制现有的从属:
停止现有从站并记录从站状态信息,尤其是主二进制日志文件和中继日志文件位置。
您可以在性能架构复制表中查看从站状态(请参见
第26.12.11节“性能架构复制表”
),或者按以下方式发出
SHOW SLAVE STATUS
以下命令:
mysql>STOP SLAVE;
mysql>SHOW SLAVE STATUS\G
关闭现有的奴隶:
外壳> mysqladmin shutdown
将数据目录从现有从站复制到新从站,包括日志文件和中继日志文件。
您可以通过创建归档做到这一点
焦油
或
WinZip
,或通过使用工具,如进行直接复制
的cp
或
rsync的
。
在复制之前,请验证与现有从站相关的所有文件是否实际存储在数据目录中。
例如,
InnoDB
系统表空间,撤消表空间和重做日志可能存储在备用位置。
InnoDB
表空间文件和每表文件表空间可能已在其他目录中创建。
从站的二进制日志和中继日志可能位于数据目录之外的自己的目录中。
检查为现有从站设置的系统变量,并查找已指定的任何备用路径。
如果找到任何内容,请同时复制这些目录。
在复制期间,如果文件已用于主信息和中继日志信息存储库(请参见 第17.2.4节“复制中继和状态日志” ),请确保还将这些文件从现有从属文件复制到新从属文件。 如果表已用于存储库(默认情况下是MySQL 8.0),则表位于数据目录中。
复制后,
auto.cnf
从新从属服务器上的数据目录副本中
删除该
文件,以便使用不同的生成服务器UUID启动新从属服务器。
服务器UUID必须是唯一的。
添加新复制从属设备时遇到的一个常见问题是新的从属服务器失败并出现一系列警告和错误消息,如下所示:
071118 16:44:10 [警告]没有使用--relay-log和--relay-log-index; 所以 当此MySQL服务器充当从属服务器并具有其主机名时,复制可能会中断 变!请使用'--relay-log =new_slave_hostname
-relay-bin'来避免此问题。 071118 16:44:10 [错误]无法打开中继日志'./old_slave_hostname
-relay-bin.003525' (relay_log_pos 22940879) 071118 16:44:10 [错误]在中继日志初始化期间找不到目标日志 071118 16:44:10 [错误]无法初始化主信息结构
如果
--relay-log
未指定选项,
则会出现这种情况
,因为中继日志文件包含主机名作为其文件名的一部分。
如果
--relay-log-index
未使用
该
选项
,则中继日志索引文件也是如此
。
有关这些选项的更多信息
,
请参见
第17.1.6节“复制和二进制日志记录选项和变量”
。
要避免此问题,请
--relay-log
在现有从站上使用的新从站上
使用相同的值
。
如果未在现有从站上明确设置此选项,请使用
。
如果无法做到这一点,请将现有从站的中继日志索引文件复制到新从站,并在新从站上设置
existing_slave_hostname
-relay-bin--relay-log-index
选项以匹配现有从站上使用
的
选项。
如果未在现有从站上明确设置此选项,请使用
。
或者,如果您已按照本节中的其余步骤尝试启动新从站并遇到前面描述的错误,请执行以下步骤:
existing_slave_hostname
-relay-bin.index
如果您还没有这样做,请
STOP SLAVE
在新的奴隶上发布。
如果您已经再次启动现有从站,也可以在现有从站上发出
STOP SLAVE
。
将现有slave的中继日志索引文件的内容复制到新slave的中继日志索引文件中,确保覆盖该文件中已有的任何内容。
继续本节中的其余步骤。
复制完成后,重新启动现有从站。
在新从站上,编辑组态并为新从站提供唯一的服务器ID(使用该
server-id
选项),主服务器或任何现有从站未
使用该服务器ID
。
启动新的从属服务器,指定该
--skip-slave-start
选项,以便尚未启动复制。
SHOW
SLAVE STATUS
与现有从站相比,
使用性能架构复制表或问题
确认新从站具有正确的设置。
还显示服务器ID和服务器UUID,并验证这些对于新从站是否正确且唯一。
通过发出
START SLAVE
语句
启动从属线程
:
MySQL的> START SLAVE;
新的slave现在使用其主信息库中的信息来启动复制过程。
本节介绍使用 全局事务标识符 的基于事务的复制 (GTIDs)。 使用GTID时,可以在原始服务器上提交并由任何从属应用时识别和跟踪每个事务; 这意味着在启动新从站或故障转移到新主站时使用GTID来引用日志文件或这些文件中的位置是不必要的,这极大地简化了这些任务。 由于基于GTID的复制完全基于事务,因此很容易确定主服务器和从服务器是否一致; 只要在主服务器上提交的所有事务也在从服务器上提交,两者之间的一致性就得到保证。 您可以使用基于语句或基于行的复制与GTID(请参见 第17.2.1节“复制格式”) ); 但是,为了获得最佳效果,我们建议您使用基于行的格式。
GTID始终保留在主站和从站之间。 这意味着您始终可以通过检查其二进制日志来确定应用于任何从站的任何事务的源。 此外,一旦在给定服务器上提交具有给定GTID的事务,则该服务器将忽略具有相同GTID的任何后续事务。 因此,在主服务器上提交的事务可以在从服务器上应用不超过一次,这有助于保证一致性。
本节讨论以下主题:
如何定义和创建GTID,以及如何在MySQL服务器中表示它们(请参见 第17.1.3.1节“GTID格式和存储” )。
GTID的生命周期(见 第17.1.3.2节“GTID生命周期” )。
自动定位功能,用于同步使用GTID的从站和主站(参见 第17.1.3.3节“GTID自动定位” )。
设置和启动基于GTID的复制的一般过程(请参见 第17.1.3.4节“使用GTID设置复制” )。
使用GTID时配置新复制服务器的建议方法(请参见 第17.1.3.5节“使用GTID进行故障转移和扩展” )。
使用基于GTID的复制时应注意的限制和限制(请参见 第17.1.3.6节“ 使用GTID进行复制的 限制” )。
可用于 处理GTID的存储函数 (请参见 第17.1.3.7节“存储函数示例以处理GTID” )。
有关MySQL服务器选项和与基于GTID的复制相关的变量的信息,请参见 第17.1.6.5节“全局事务ID选项和变量” 。 另请参见 第12.18节“与全局事务标识符(GTID) 一起使用的函数 ” ,其中描述了MySQL 8.0支持的与GTID一起使用的SQL函数。
全局事务标识符(GTID)是创建的唯一标识符,并与在源服务器(主服务器)上提交的每个事务相关联。 此标识符不仅对其发起的服务器是唯一的,而且在给定复制拓扑中的所有服务器上都是唯一的。
GTID分配区分在主服务器上提交的客户端事务和在从服务器上复制的复制事务。 在主服务器上提交客户端事务时,如果事务已写入二进制日志,则会为其分配新的GTID。 保证客户交易具有单调增加的GTID,而生成的数字之间没有间隙。 如果未将客户端事务写入二进制日志(例如,因为事务已被过滤掉,或者事务是只读的),则不会在源服务器上为其分配GTID。
复制的事务保留与分配给源服务器上的事务相同的GTID。
GTID在复制事务开始执行之前存在,并且即使复制的事务未写入从服务器上的二进制日志,或者在从服务器上过滤掉,也会持久存在。
MySQL系统表
mysql.gtid_executed
用于保存MySQL服务器上应用的所有事务的已分配GTID,但存储在当前活动的二进制日志文件中的事务除外。
GTID的自动跳过功能意味着在主服务器上提交的事务可以在从服务器上应用不超过一次,这有助于保证一致性。 一旦在给定服务器上提交了具有给定GTID的事务,则该服务器将忽略使用相同GTID执行后续事务的任何尝试。 不会引发错误,并且不会执行事务中的语句。
如果具有给定GTID的事务已开始在服务器上执行但尚未提交或回滚,则任何在具有相同GTID的服务器上启动并发事务的尝试都将被阻止。 服务器既不开始执行并发事务也不将控制权返回给客户端。 一旦第一次尝试事务提交或回滚,就可以继续在同一GTID上阻塞的并发会话。 如果第一次尝试回滚,则一个并发会话继续尝试该事务,并且在同一GTID上阻塞的任何其他并发会话仍然被阻止。 如果第一次尝试提交,则所有并发会话都将被阻止,并自动跳过事务的所有语句。
GTID表示为一对坐标,用冒号字符(
:
)
分隔
,如下所示:
GTID =source_id
:transaction_id
该
source_id
标识的源服务器。
通常,主人
server_uuid
用于此目的。
这
transaction_id
是一个序列号,由在主服务器上提交事务的顺序确定。
例如,要提交的第一个事务具有
1
其
transaction_id
,并且被分配一个相同的始发服务器上被提交第十交易
transaction_id
的
10
。
事务不可能
0
在GTID中具有序列号。
例如,最初在具有UUID的服务器上提交的第二十三个事务
3E11FA47-71CA-11E1-9E33-C80AA9429562
具有以下GTID:
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
事务的GTID显示在
mysqlbinlog
的输出中
,例如,它用于标识性能模式复制状态表中的单个事务
replication_applier_status_by_worker
。
gtid_next
系统变量(
@@GLOBAL.gtid_next
)
存储的值
是单个GTID。
GTID集合是包括一个或多个单个GTID或GTID范围的集合。
GTID集以多种方式用于MySQL服务器。
例如,由
系统变量
gtid_executed
和
gtid_purged
系统变量
存储的值
是GTID集。
该
START
SLAVE
条款
UNTIL SQL_BEFORE_GTIDS
并
UNTIL SQL_AFTER_GTIDS
可以用来做一个奴隶交易过程最多只在GTID组第一GTID,或在GTID集中的最后GTID后停止。
内置函数
GTID_SUBSET()
并
GTID_SUBTRACT()
要求GTID集作为输入。
源自同一服务器的一系列GTID可以折叠为单个表达式,如下所示:
3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5
上面的例子表示第一至始发MySQL服务器,其上第五交易
server_uuid
是
3E11FA47-71CA-11E1-9E33-C80AA9429562
。
源自同一服务器的多个单GTID或GTID范围也可以包含在单个表达式中,GTID或范围由冒号分隔,如下例所示:
3E11FA47-71CA-11E1-9E33-C80AA9429562:1-3:11:47-49
GTID集可以包括单个GTID和GTID范围的任意组合,并且它可以包括源自不同服务器的GTID。
此示例显示存储在
已从多个主服务器应用事务的从服务器
的
gtid_executed
系统变量(
@@GLOBAL.gtid_executed
)中
的GTID集
:
2174B383-5441-11E8-B90A-C80AA9429562:1-3,24DA167-0C0C-11E8-8442-00059A3C7B00:1-19
当从服务器变量返回GTID集时,UUID按字母顺序排列,并且数值间隔按升序合并。
GTID集的语法如下:
gtid_set
:uuid_set
[,uuid_set
] ...... | “”uuid_set
:uuid
:interval
[:interval
] ...uuid
:hhhhhhhh
-hhhh
-hhhh
-hhhh
-hhhhhhhhhhhh
h
: [0-9 | AF]interval
:n
[ -n
] (n
> = 1)
GTID存储在
数据库
中名为的表
gtid_executed
中
mysql
。
对于它表示的每个GTID或GTID集合,该表中的一行包含始发服务器的UUID,以及该集合的起始和结束事务ID;
对于仅引用单个GTID的行,这两个最后两个值是相同的。
在
mysql.gtid_executed
创建表(如果它不存在),当MySQL服务器安装或升级,采用了
CREATE
TABLE
如下所示类似的语句:
CREATE TABLE gtid_executed( source_uuid CHAR(36)NOT NULL, interval_start BIGINT(20)NOT NULL, interval_end BIGINT(20)NOT NULL, PRIMARY KEY(source_uuid,interval_start) )
与其他MySQL系统表一样,请勿尝试自行创建或修改此表。
该
mysql.gtid_executed
表供MySQL服务器内部使用。
它允许从设备在从设备上禁用二进制日志记录时使用GTID,并且当二进制日志丢失时,它允许保留GTID状态。
该
mysql.gtid_executed
表重置为
RESET
MASTER
。
GTIDs存储在
mysql.gtid_executed
表中,只有当
gtid_mode
是
ON
或
ON_PERMISSIVE
。
存储GTID的点取决于是启用还是禁用二进制日志记录:
如果禁用(
log_bin
is
OFF
)
二进制日志记录
,或者
禁用了二进制日志记录
log_slave_updates
,则服务器将属于每个事务的GTID与表中的事务一起存储。
此外,该表以用户可配置的速率定期压缩;
有关详细信息,
请参阅
mysql.gtid_executed表压缩
。
此情况仅适用于禁用二进制日志记录或从站更新日志记录的复制从站。
它不适用于复制主机,因为在主机上,必须启用二进制日志记录才能进行复制。
如果启用了二进制日志记录(
log_bin
是
ON
),则无论何时旋转二进制日志或关闭服务器,服务器都会将写入先前二进制日志的所有事务的GTID写入
mysql.gtid_executed
表中。
这种情况适用于复制主服务器或启用了二进制日志记录的复制从服务器。
如果服务器意外停止,则当前二进制日志文件中的GTID集不会保存在
mysql.gtid_executed
表中。
在恢复期间,这些GTID将从二进制日志文件添加到表中。
例外情况是,如果在重新启动服务器时禁用二进制日志记录(使用
--skip-log-bin
或
--disable-log-bin
)。
在这种情况下,服务器无法访问二进制日志文件以恢复GTID,因此无法启动复制。
启用二进制日志记录后,该
mysql.gtid_executed
表不会保存所有已执行事务的GTID的完整记录。
该信息由
gtid_executed
系统变量
的全局值提供
。
始终使用
@@GLOBAL.gtid_executed
,在每次提交后更新,以表示MySQL服务器的GTID状态,并且不查询
mysql.gtid_executed
表。
mysql.gtid_executed
即使服务器处于只读模式或超级只读模式,
MySQL服务器也可以写入
表,这样二进制日志文件仍然可以在这些模式下旋转。
如果
mysql.gtid_executed
无法访问表以进行写入,并且由于除了达到最大文件大小(
max_binlog_size
)
之外的任何原因而旋转
二进制日志文件,则继续使用当前二进制日志文件。
将错误消息返回给请求轮换的客户端,并在服务器上记录警告。
如果
mysql.gtid_executed
无法访问表并进行写入
max_binlog_size
,则服务器将根据其
binlog_error_action
设置进行
响应
。
如果
IGNORE_ERROR
如果设置,则在服务器上记录错误并停止二进制日志记录,或者如果
ABORT_SERVER
设置,则服务器将关闭。
随着时间的推移,
mysql.gtid_executed
表可以填充许多行,这些行指的是源自同一服务器的各个GTID,其事务ID构成一个范围,类似于此处所示:
+ -------------------------------------- + ---------- ------ + -------------- + | source_uuid | interval_start | interval_end | | -------------------------------------- + ---------- ------ + -------------- | | 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 37 | 37 | | 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 38 | 38 | | 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 39 | 39 | | 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 40 | 40 | | 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 41 | 41 | | 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 42 | 42 | | 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 43 | 43 | ...
为了节省空间,MySQL服务器
mysql.gtid_executed
通过将每个这样的行集替换为跨越整个事务标识符间隔的行来定期
压缩
表,如下所示:
+ -------------------------------------- + ---------- ------ + -------------- + | source_uuid | interval_start | interval_end | | -------------------------------------- + ---------- ------ + -------------- | | 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 37 | 43 | ...
您可以通过设置
gtid_executed_compression_period
系统变量
来控制压缩表之前允许的事务数,从而控制压缩率
。
此变量的默认值为1000,这意味着默认情况下,在每1000次事务之后执行表的压缩。
设置
gtid_executed_compression_period
为0可以防止执行压缩,如果执行此操作,您应该为
gtid_executed
表
可能需要的磁盘空间量的大幅增加做好准备
。
当启用二进制日志,价值
gtid_executed_compression_period
是
不
使用和
mysql.gtid_executed
表上的每个二进制日志旋转压缩。
mysql.gtid_executed
表的
压缩
由名为的专用前台线程执行
thread/sql/compress_gtid_table
。
此线程未在输出中列出
SHOW
PROCESSLIST
,但可以将其视为
threads
表中
的一行
,如下所示:
MySQL的> SELECT * FROM performance_schema.threads WHERE NAME LIKE '%gtid%'\G
*************************** 1。排******************** *******
THREAD_ID:26
名称:thread / sql / compress_gtid_table
类型:FOREGROUND
PROCESSLIST_ID:1
PROCESSLIST_USER:NULL
PROCESSLIST_HOST:NULL
PROCESSLIST_DB:NULL
PROCESSLIST_COMMAND:守护进程
PROCESSLIST_TIME:1509
PROCESSLIST_STATE:暂停
PROCESSLIST_INFO:NULL
PARENT_THREAD_ID:1
角色:空
仪表:是的
历史:是的
CONNECTION_TYPE:NULL
THREAD_OS_ID:18677
的
thread/sql/compress_gtid_table
螺纹通常休眠,直到
gtid_executed_compression_period
交易已经被执行,那么唤醒到的执行压缩
mysql.gtid_executed
如前所述表。
然后它休眠直到另一个
gtid_executed_compression_period
事务发生,然后唤醒再次执行压缩,无限期地重复此循环。
禁用二进制日志记录时将此值设置为0意味着线程始终处于休眠状态且从不唤醒。
GTID的生命周期包括以下步骤:
事务在主服务器上执行并提交。 此客户端事务被分配一个GTID,该GTID由主服务器的UUID和此服务器上尚未使用的最小非零事务序列号组成。 GTID被写入主服务器的二进制日志(紧接在日志中的事务本身之前)。 如果未将客户端事务写入二进制日志(例如,因为事务已被过滤掉,或者事务是只读的),则不会为其分配GTID。
如果为事务分配了GTID,则通过在事务开始时将其写入二进制日志(作为a
Gtid_log_event
)
,GTID在提交时保持原子性
。
无论何时旋转二进制日志或关闭服务器,服务器都会将写入先前二进制日志文件的所有事务的GTID写入
mysql.gtid_executed
表中。
如果为事务分配了GTID,则通过将GTID添加到
gtid_executed
系统变量(
@@GLOBAL.gtid_executed
)中
的GTID集合,非原子化(在事务提交后不久)外部化
。
此GTID集包含所有已提交的GTID事务集的表示形式,并在复制中用作表示服务器状态的标记。
启用二进制日志记录(根据主服务器的要求),
gtid_executed
系统变量中
的GTID集
是应用事务的完整记录,但
mysql.gtid_executed
表不是,因为最新的历史记录仍在当前的二进制日志文件中。
在将二进制日志数据传输到从站并存储在从站的中继日志中之后(使用已建立的此过程机制,请参见
第17.2节“复制实现”
,详细信息),从站读取GTID并设置其
gtid_next
系统
的值
变量作为这个GTID。
这告诉从服务器必须使用此GTID记录下一个事务。
重要的是要注意从属设置
gtid_next
在会话上下文中。
从站验证没有线程已经获得GTID的所有权
gtid_next
以便处理该事务。
通过首先读取和检查复制事务的GTID,在处理事务本身之前,从设备不仅保证在从设备上没有应用具有此GTID的先前事务,而且还保证没有其他会话已经读取此GTID但尚未提交了相关的交易。
因此,如果多个客户端尝试同时应用同一事务,则服务器只允许其中一个执行,从而解决此问题。
该
gtid_owned
系统变量(
@@GLOBAL.gtid_owned
)对于slave,显示当前正在使用的每个GTID以及拥有它的线程的ID。
如果已经使用了GTID,则不会引发错误,并且使用自动跳过功能来忽略该事务。
如果尚未使用GTID,则从属应用复制的事务。
因为
gtid_next
设置为主设备已分配的GTID,所以从设备不会尝试为此事务生成新的GTID,而是使用存储在其中的GTID
gtid_next
。
如果在从属设备上启用了二进制日志记录,则GTID会在事务开始时将其写入二进制日志(作为a
Gtid_log_event
),
在提交时保持原子状态
。
无论何时旋转二进制日志或关闭服务器,服务器都会将写入先前二进制日志文件的所有事务的GTID写入
mysql.gtid_executed
表中。
如果在从站上禁用二进制日志记录,则通过将GTID直接写入
mysql.gtid_executed
表中来
原子性地保留GTID
。
MySQL在事务中附加一条语句,将GTID插入表中。
从MySQL 8.0开始,此操作对于DDL语句和DML语句都是原子操作。
在这种情况下,该
mysql.gtid_executed
表是从站上应用的事务的完整记录。
在从属设备上提交复制事务后不久,GTID通过将其添加到
gtid_executed
系统变量(
@@GLOBAL.gtid_executed
)中的从属
GTID集合而非原子化外部化
。
至于主数据库,此GTID集包含所有已提交的GTID事务集的表示。
如果在从站上禁用二进制日志记录,则该
mysql.gtid_executed
表也是从站上应用的事务的完整记录。
如果在从站上启用了二进制日志记录,这意味着某些GTID仅记录在二进制日志中,则
gtid_executed
系统变量中
的GTID集
是唯一的完整记录。
在主服务器上完全过滤掉的客户端事务未分配GTID,因此它们不会添加到
gtid_executed
系统变量中
的事务集中,也不会添加到
mysql.gtid_executed
表中。
但是,在从属设备上完全过滤掉的复制事务的GTID是持久的。
如果在从属设备上启用了二进制日志记录,则过滤掉的事务将作为a
Gtid_log_event
后跟仅包含
BEGIN
和
COMMIT
语句
的空事务
写入二进制日志
。
如果禁用二进制日志记录,则已过滤掉的事务的GTID将写入
mysql.gtid_executed
表中。
为过滤掉的事务保留GTID确保了
mysql.gtid_executed
gtid_executed
可以压缩
表和
系统变量中
的GTID集
。
它还确保如果从站重新连接到主站,则不会再次检索过滤掉的事务,如
第17.1.3.3节“GTID自动定位”中所述
。
在多线程复制从属(带
slave_parallel_workers
> 0
)上,可以并行应用事务,因此复制的事务可以无序提交(除非
slave_preserve_commit_order=1
已设置)。
当发生这种情况时,
gtid_executed
系统变量中的GTID
集
将包含多个GTID范围,它们之间存在间隙。
(在主机或单线程复制从机上,将会有单调增加的GTID,数字之间没有间隙。)多线程复制从机上的间隙仅发生在最近应用的事务中,并在复制过程中填充。
使用时干净地停止复制线程
STOP
SLAVE
语句,应用正在进行的事务以填补空白。如果发生关闭(如服务器故障或使用
KILL
语句停止复制线程),则可能会出现间隙。
典型情况是服务器为已提交的事务生成新的GTID。 但是,除了交易之外,GTID还可以分配给其他变更,在某些情况下,可以为单个交易分配多个GTID。
写入二进制日志的每个数据库更改(DDL或DML)都会分配一个GTID。
这包括自动提交的更改以及使用
BEGIN
和/
COMMIT
或
START TRANSACTION
语句
提交的更改
。
GTID还分配给数据库的创建,更改或删除,以及非表数据库对象,例如过程,函数,触发器,事件,视图,用户,角色或授权。
非事务性更新以及事务性更新都分配了GTID。 此外,对于非事务性更新,如果在尝试写入二进制日志高速缓存时发生磁盘写入故障,因此在二进制日志中创建了间隙,则会为生成的事件日志事件分配GTID。
当二进制日志中的生成语句自动删除表时,会为该语句分配GTID。
当复制从服务器开始应用刚刚启动的主服务器以及基于语句的复制正在使用(
binlog_format=STATEMENT
)和具有打开的临时表断开连接的用户会话时,
将自动删除
临时表。
使用
MEMORY
存储引擎的
表
在服务器启动后第一次访问时会自动删除,因为在关闭期间行可能已丢失。
当事务未写入源服务器上的二进制日志时,服务器不会为其分配GTID。
这包括回滚的事务和在源服务器上禁用二进制日志记录时执行的事务,全局(
--skip-log-bin
在服务器的配置中指定)或会话(
SET @@SESSION.sql_log_bin = 0
)。
当使用基于行的复制时,这还包括无操作事务(
binlog_format=ROW
)。
XA事务被分配单独的GTIDs用于
XA
PREPARE
交易的相位和
XA
COMMIT
或
XA ROLLBACK
交易的阶段。
XA事务是持久准备的,以便用户可以在发生故障时将其提交或回滚(在复制拓扑中可能包括故障转移到另一个服务器)。
因此,事务的两个部分是分开复制的,因此它们必须有自己的GTID,即使回滚的非XA事务没有GTID。
在以下特殊情况下,单个语句可以生成多个事务,因此可以分配多个GTID:
调用存储过程以提交多个事务。 为过程提交的每个事务生成一个GTID。
多表
DROP
TABLE
语句删除不同类型的表。
如果任何表使用不支持原子DDL的存储引擎,或者任何表是临时表,则可以生成多个GTID。
一个
CREATE
TABLE ... SELECT
当基于行的复制是在使用语句发出(
binlog_format=ROW
)。
为该
CREATE
TABLE
动作
生成
一个GTID,并为行插入动作生成一个GTID。
默认情况下,对于在用户会话中提交的新事务,服务器会自动生成并分配新的GTID。
在复制从属服务器上应用事务时,将保留来自原始服务器的GTID。
您可以通过设置
gtid_next
系统变量
的会话值来更改此行为
:
如果
gtid_next
设置为
AUTOMATIC
默认值,并且事务已提交并写入二进制日志,则服务器会自动生成并分配新的GTID。
如果由于其他原因而回滚事务或未将事务写入二进制日志,则服务器不会生成并分配GTID。
如果设置
gtid_next
为有效的GTID(由UUID和事务序列号组成,用冒号分隔),服务器会将GTID分配给您的事务。
gtid_executed
即使事务未写入二进制日志,或者事务为空
,
也会
分配和添加此GTID
。
请注意,在设置
gtid_next
为特定GTID并且已提交或回滚事务之后,
SET @@SESSION.gtid_next
必须在任何其他语句之前发出
显式
语句。
AUTOMATIC
如果您不想明确分配任何更多
GTID,可以使用此选项将GTID值设置回
。
当复制应用程序线程应用复制事务时,它们使用此技术,
@@SESSION.gtid_next
显式
设置
为在源服务器上分配的复制事务的GTID。
这意味着保留来自原始服务器的GTID,而不是由复制从站生成和分配的新GTID。
这也意味着
gtid_executed
即使在从站上禁用二进制日志记录或从站更新日志记录,或者当事务是无操作或在从站上过滤掉时
,GTID也会添加到
复制从站上。
客户端可以通过
@@SESSION.gtid_next
在执行事务之前
设置
为特定GTID
来模拟复制
的事务。
mysqlbinlog
使用此技术
生成二进制日志的转储,客户端可以重放该转储以保留GTID。
通过客户端提交的模拟复制事务完全等同于通过复制应用程序线程提交的复制事务,并且事后无法区分它们。
该集在GTIDs的
gtid_purged
系统变量(
@@GLOBAL.gtid_purged
)包含已提交在服务器上,但在任何服务器上的二进制日志文件不存在,所有交易的GTIDs。
gtid_purged
是一个子集
gtid_executed
。
以下类别的GTID包括
gtid_purged
:
在从站上禁用二进制日志记录时提交的复制事务的GTID。
已写入已清除的二进制日志文件的事务的GTID。
由语句明确添加到集合中的GTID
SET @@GLOBAL.gtid_purged
。
您可以更改值,
gtid_purged
以便在服务器上记录已应用某个GTID集中的事务,尽管它们不存在于服务器上的任何二进制日志中。
当您添加GTID时
gtid_purged
,它们也会被添加到
gtid_executed
。
此操作的示例用例是在服务器上还原一个或多个数据库的备份时,但您没有包含服务器上的事务的相关二进制日志。
在MySQL 8.0之前,你只能改变
gtid_purged
when
的值
gtid_executed
(因此
gtid_purged
)是空的。
从MySQL 8.0开始,此限制不适用,您还可以选择是
gtid_purged
使用指定的GTID集
替换整个
GTID集,还是将指定的GTID集添加到已经存在的GTID中
gtid_purged
。
有关如何执行此操作的详细信息,请参阅说明
gtid_purged
。
在GTIDs的集合
gtid_executed
,并
gtid_purged
在服务器启动时系统变量初始化。
每个二进制日志文件都以事件开头,该事件
Previous_gtids_log_event
包含所有先前二进制日志文件中的GTID集合(由前面文件中的
Previous_gtids_log_event
GTID和
Gtid_log_event
前面文件本身中
的每个GTID组成
)。
的内容
Previous_gtids_log_event
在最早和最近的二进制日志文件来计算的
gtid_executed
,并
gtid_purged
套在服务器启动时:
gtid_executed
计算为
Previous_gtids_log_event
最新二进制日志文件中GTID的并集,该二进制日志文件中的事务的GTID以及存储在
mysql.gtid_executed
表中
的GTID
。
此GTID集包含已
gtid_purged
在服务器上
使用(或明确添加
)的
所有GTID
,无论它们当前是否位于服务器上的二进制日志文件中。
它不包括当前正在服务器上处理的事务的GTID(
@@GLOBAL.gtid_owned
)。
gtid_purged
通过首先
Previous_gtids_log_event
在最新的二进制日志文件中
添加GTID并
在该二进制日志文件中添加事务的GTID来计算。
此步骤提供当前或曾经记录在服务器上的二进制日志中的GTID集(
gtids_in_binlog
)。
接下来,从中
Previous_gtids_log_event
减去最旧的二进制日志文件中
的GTID
gtids_in_binlog
。
此步骤提供当前记录在服务器(
gtids_in_binlog_not_purged
)
上的二进制日志中的一组GTID
。
最后,
gtids_in_binlog_not_purged
从中减去
gtid_executed
。
结果是已在服务器上使用的GTID集,但当前未记录在服务器上的二进制日志文件中,并且此结果用于初始化
gtid_purged
。
如果从MySQL 5.7.7或以上的二进制日志都参与了这些计算,有可能不正确GTID设置要计算的
gtid_executed
,并
gtid_purged
和他们保持,即使服务器重新启动后不正确。
有关详细信息,请参阅
binlog_gtid_simple_recovery
系统变量
的说明,该
变量控制如何迭代二进制日志以计算GTID集。
如果其中描述的某种情况适用于服务器,请进行设置
binlog_gtid_simple_recovery=FALSE
在启动它之前在服务器的配置文件中。
该设置使服务器迭代所有二进制日志文件(不仅是最新和最旧的)以查找GTID事件开始出现的位置。
如果服务器具有大量没有GTID事件的二进制日志文件,则此过程可能需要很长时间。
发出
RESET
MASTER
导致将值
gtid_purged
重置为空字符串,并使全局值(但不是会话值)
gtid_executed
重置为空字符串。
GTID替换先前所需的文件偏移对,以确定启动,停止或恢复主设备和从设备之间的数据流的点。 当使用GTID时,从属设备需要与主设备同步的所有信息都直接从复制数据流中获取。
要使用基于GTID的复制启动从属服务器,请不要
在
用于指示从属服务器从给定主服务器进行复制
的
语句中
包含
MASTER_LOG_FILE
或
MASTER_LOG_POS
选项
CHANGE
MASTER TO
。
这些选项指定日志文件的名称和文件中的起始位置,但是对于GTID,从站不需要此非本地数据。
相反,您需要启用该
MASTER_AUTO_POSITION
选项。
有关使用基于GTID的复制配置和启动主站和从站的完整说明,请参见
第17.1.3.4节“
使用GTID
设置复制”
。
MASTER_AUTO_POSITION
默认情况下禁用
该
选项。
如果在从属设备上启用了多源复制,则需要为每个适用的复制通道设置选项。
禁用
MASTER_AUTO_POSITION
再次选项使从恢复到基于文件的复制,在这种情况下,你还必须指定的一个或两个
MASTER_LOG_FILE
或
MASTER_LOG_POS
选项。
当复制从站启用GTID(
GTID_MODE=ON
,
ON_PERMISSIVE,
或
OFF_PERMISSIVE
)并
MASTER_AUTO_POSITION
启用
该
选项时,将激活自动定位以连接到主站。
必须
GTID_MODE=ON
设置
主服务器
才能使连接成功。
在初始握手中,从站发送一个GTID集,其中包含已经收到,已提交或两者都已完成的事务。
此GTID集等于
gtid_executed
系统变量(
@@GLOBAL.gtid_executed
)中GTID集的并集,以及性能模式
replication_connection_status
表中
记录
为接收事务(语句结果
SELECT RECEIVED_TRANSACTION_SET FROM
PERFORMANCE_SCHEMA.replication_connection_status
)
的GTID集
。
主设备通过发送其二进制日志中记录的所有事务来响应,其GTID不包括在从设备发送的GTID集中。 此交换确保主服务器仅使用从服务器尚未接收或提交的GTID发送事务。 如果从属设备从多个主设备接收事务,如菱形拓扑结构,则自动跳过功能可确保事务不会应用两次。
如果主服务器应发送的任何事务已从主服务器的二进制日志中清除,或
gtid_purged
通过其他方法
添加到
系统变量中
的GTID集中
,则主服务器将错误
ER_MASTER_HAS_PURGED_REQUIRED_GTIDS
发送
给从服务器,并且复制不会开始。
将识别丢失的清除事务的GTID,并在警告消息
ER_FOUND_MISSING_GTIDS
中的主控错误日志中
列出
。
从站无法自动从此错误中恢复,因为已清除了赶上主站所需的部分事务历史记录。
试图重新连接没有
MASTER_AUTO_POSITION
启用选项只会导致从站上清除的事务丢失。
从这种情况中恢复的正确方法是从
服务器
从另一个源
复制
ER_FOUND_MISSING_GTIDS
消息中
列出的丢失事务
,或者从更新的备份创建的新从服务器替换从服务器。
考虑修改主服务器上的二进制日志有效期(
binlog_expire_logs_seconds
)以确保不再发生这种情况。
如果在事务交换期间发现从服务器已经在GTID中接收或提交了与主服务器UUID的事务,但主服务器本身没有它们的记录,则主服务器将错误
ER_SLAVE_HAS_MORE_GTIDS_THAN_MASTER
发送
给从服务器并且复制不会开始。
如果没有的主人可能会发生这种情况
sync_binlog=1
设置遇到电源故障或操作系统崩溃,并丢失尚未同步到二进制日志文件但已由从属设备接收的已提交事务。
如果任何客户端在重新启动后在主服务器上提交事务,则主服务器和从服务器可以发散,这可能导致主服务器和从服务器对不同的事务使用相同的GTID。
从这种情况中恢复的正确方法是手动检查主设备和从设备是否已发散。
如果现在对不同的事务使用相同的GTID,则需要根据需要对各个事务执行手动冲突解决,或者从复制拓扑中删除主服务器或从服务器。
本节介绍在MySQL 8.0中配置和启动基于GTID的复制的过程。 这是一个 “ 冷启动 ” 过程,它假定您是第一次启动复制主服务器,或者可以停止它; 有关使用来自正在运行的主服务器的GTID供应复制从服务器的信息,请参见 第17.1.3.5节“使用GTID进行故障转移和扩展” 。 有关在线更改服务器上的GTID模式的信息,请参见 第17.1.5节“在线服务器上更改复制模式” 。
此启动过程中最简单的GTID复制拓扑的关键步骤(包括一个主服务器和一个从服务器)如下所示:
如果复制已在运行,请通过将两个服务器设置为只读来同步它们。
停止两台服务器。
重启两台服务器并启用GTID并配置正确的选项。
启动服务器所需 的 mysqld 选项将在本节后面的示例中讨论。
指示从站使用主站作为复制数据源并使用自动定位。 完成此步骤所需的SQL语句将在本节后面的示例中介绍。
采取新的备份。 包含没有GTID的事务的二进制日志不能在启用了GTID的服务器上使用,因此在此之前进行的备份不能与新配置一起使用。
启动从属设备,然后在两台服务器上禁用只读模式,以便它们可以接受更新。
在以下示例中,使用MySQL的基于二进制日志位置的复制协议,两个服务器已作为主服务器和从服务器运行。
如果
要从
新服务器启动,请参见
第17.1.2.3节“为复制创建用户”
以获取有关为复制连接添加特定用户
的信息,以及有关设置
变量的
信息
,请参见
第17.1.2.1
节“设置复制主配置”
。
server_id
。
以下示例显示如何
在服务器的选项文件中
存储
mysqld
启动选项,
有关详细信息
,请参见
第4.2.2.2节“使用选项文件”
。
或者,您可以在运行
mysqld
时使用启动选项
。
以下大多数步骤都需要使用MySQL
root
帐户或具有该
SUPER
权限的
其他MySQL用户帐户
。
mysqladmin
shutdown
需要
SUPER
特权或
SHUTDOWN
特权。
第1步:同步服务器。
只有在不使用GTID的情况下复制已经复制的服务器时,才需要执行此步骤。
对于新服务器,请继续执行步骤3.
通过发出以下命令,通过在每台服务器上
设置
read_only
系统变量,
使服务器成为只读
ON
:
MySQL的> SET @@GLOBAL.read_only = ON;
等待所有正在进行的事务提交或回滚。 然后,让奴隶赶上主人。 在继续之前确保从站已处理所有更新非常重要 。
如果将二进制日志用于复制以外的任何其他日志,例如进行即时备份和还原,请等到不需要包含没有GTID的事务的旧二进制日志。 理想情况下,等待服务器清除所有二进制日志,并等待任何现有备份过期。
重要的是要了解包含没有GTID的事务的日志不能在启用了GTID的服务器上使用。 在继续之前,您必须确保拓扑中的任何位置都不存在没有GTID的事务。
第2步:停止两台服务器。
使用
mysqladmin
停止每个服务器
,如下所示,
username
具有足够权限关闭服务器的MySQL用户的用户名
在哪里
:
外壳> mysqladmin -uusername
-p shutdown
然后在提示符下提供此用户的密码。
步骤3:启用两台启用了GTID的服务器。
要启用基于GTID的复制,必须通过将
gtid_mode
变量
设置为启用GTID模式来启动每个服务器
ON
,并
enforce_gtid_consistency
启用变量以确保仅记录对基于GTID的复制安全的语句。
例如:
gtid_mode = ON 执行-GTID一致性=真
此外,
--skip-slave-start
在配置从站设置之前
,应该使用该
选项
启动从
站。
有关GTID相关选项和变量的更多信息,请参见
第17.1.6.5节“全局事务ID选项和变量”
。
在使用
mysql.gtid_executed表
时,不必强制启用二进制日志记录以使用GTID
。
主人必须始终启用二进制日志记录才能进行复制。
但是,从服务器可以使用GTID但不使用二进制日志记录。
如果需要在从属服务器上禁用二进制日志记录,可以通过指定从属服务器
--skip-log-bin
和
--skip-log-slave-updates
选项
来执行此操作
。
步骤4:配置从站以使用基于GTID的自动定位。
告诉从属设备使用具有基于GTID的事务的主服务器作为复制数据源,并使用基于GTID的自动定位而不是基于文件的定位。
CHANGE
MASTER TO
在奴隶上
发出
声明,包括
MASTER_AUTO_POSITION
声明中
的
选项,告诉奴隶主人的交易是由GTID识别的。
您可能还需要为主服务器的主机名和端口号提供适当的值,以及复制用户帐户的用户名和密码,从服务器可以使用该帐户连接到主服务器; 如果已经在步骤1之前设置了这些,并且不需要进行进一步的更改,则可以从此处显示的语句中安全地省略相应的选项。
的MySQL>CHANGE MASTER TO
> > > > >MASTER_HOST =
host
,MASTER_PORT =
port
,MASTER_USER =
user
,MASTER_PASSWORD =
password
,MASTER_AUTO_POSITION = 1;
无论是
MASTER_LOG_FILE
选择还是
MASTER_LOG_POS
选择可能与使用
MASTER_AUTO_POSITION
等于1尝试这样做会导致
CHANGE
MASTER
TO
失败,错误陈述。
第5步:进行新备份。 由于您已启用GTID,因此在启用GTID之前创建的现有备份现在无法在这些服务器上使用。 此时进行新备份,这样您就不会没有可用的备份。
例如,您可以
FLUSH
LOGS
在要进行备份的服务器上
执行
。
然后显式地进行备份或等待您可能已设置的任何定期备份例程的下一次迭代。
步骤6:启动从站并禁用只读模式。 像这样启动奴隶:
MySQL的> START SLAVE;
仅当您在步骤1中将服务器配置为只读时,才需要执行以下步骤。要允许服务器再次开始接受更新,请发出以下语句:
MySQL的> SET @@GLOBAL.read_only = OFF;
现在应该正在运行基于GTID的复制,您可以像以前一样在主服务器上开始(或恢复)活动。 第17.1.3.5节“使用GTID进行故障转移和扩展” 讨论了在使用GTID时创建新的从服务器。
将MySQL Replication与全局事务标识符(GTID)一起使用时,有许多技术可用于配置新的从属设备,然后可以将其用于扩展,并根据故障转移的需要提升为主设备。 本节介绍以下技术:
全局事务标识符已添加到MySQL Replication中,以简化复制数据流和特别是故障转移活动的一般管理。 每个标识符唯一地标识一起构成事务的一组二进制日志事件。 GTID在将更改应用于数据库时起着关键作用:服务器自动跳过具有服务器识别为之前已处理的标识符的任何事务。 此行为对于自动复制定位和正确的故障转移至关重要。
在二进制日志中捕获标识符和包括给定事务的事件集之间的映射。 当使用来自另一个现有服务器的数据配置新服务器时,这会带来一些挑战。 要重现在新服务器上设置的标识符,必须将标识符从旧服务器复制到新服务器,并保留标识符与实际事件之间的关系。 这对于恢复立即可用作故障转移或切换成为新主服务器的候选服务器是必要的。
简单的复制。 在新服务器上重现所有标识符和事务的最简单方法是使新服务器成为具有完整执行历史记录的主服务器的从属服务器,并在两个服务器上启用全局事务标识符。 有关 更多信息 , 请参见 第17.1.3.4节“使用GTID设置复制” 。
启动复制后,新服务器将从主服务器复制整个二进制日志,从而获取有关所有GTID的所有信息。
这种方法简单有效,但要求从设备从主设备读取二进制日志; 新的从服务器有时需要相对较长的时间来赶上主服务器,因此这种方法不适合快速故障转移或从备份恢复。 本节介绍如何通过将二进制日志文件复制到新服务器来避免从主服务器获取所有执行历史记录。
将数据和事务复制到从属服务器。 当源服务器先前处理了大量事务时,执行整个事务历史记录可能非常耗时,这可能是设置新复制从站时的主要瓶颈。 为了消除此要求,可以将源服务器包含的数据集快照,二进制日志和全局事务信息导入新从属服务器。 源服务器可以是主服务器,也可以是从服务器,但必须确保源在复制数据之前已处理了所有必需的事务。
这种方法有几种变体,区别在于数据转储和二进制日志中的事务转移到从属的方式,如下所述:
在源服务器上
使用
mysqldump
创建转储文件
。
设置
mysqldump
选项
--master-data
(默认值为1)以包含
CHANGE
MASTER TO
带有二进制日志记录信息
的
语句。
将
--set-gtid-purged
选项
设置
为
AUTO
(缺省值)或
ON
,以包括有关转储中已执行事务的信息。
然后使用
mysql
客户端在目标服务器上导入转储文件。
或者,使用原始数据文件创建源服务器的数据快照,然后按照
第17.1.2.5节“选择数据快照的方法”中
的说明将这些文件复制到目标服务器
。
如果使用
InnoDB
表,则可以使用
MySQL Enterprise Backup组件中
的
mysqlbackup
命令生成一致的快照。
此命令记录与从站上使用的快照对应的日志名称和偏移量。
MySQL Enterprise Backup是一种商业产品,作为MySQL Enterprise订阅的一部分包含在内。
看到
有关详细信息
,请参见第30.2节“MySQL企业备份概述”
。
或者,停止源服务器和目标服务器,将源数据目录的内容复制到新从属数据目录,然后重新启动从属服务器。
如果使用此方法,则必须为从属服务器配置基于GTID的复制,换句话说
gtid_mode=ON
。
有关此方法的说明和重要信息,请参见
第17.1.2.8节“将从站添加到复制环境”
。
如果源服务器在其二进制日志中具有完整的事务历史记录(即,GTID集
@@GLOBAL.gtid_purged
为空),则可以使用这些方法。
使用
带有
和
选项的
mysqlbinlog
将二进制日志从源服务器导入新的从服务器
。
--read-from-remote-server
--read-from-remote-master
或者,将源服务器的二进制日志文件复制到从属服务器。
您可以使用
带有
和
选项的
mysqlbinlog
从slave进行复制
。
通过使用
mysqlbinlog
(不带
选项)将二进制日志文件导出到SQL文件,然后将这些文件传递给
mysql
客户端进行处理
,可以将这些文件
读入从属
服务器。
确保使用单个
mysql
进程
处理所有二进制日志文件
,而不是使用多个连接。
例如:
--read-from-remote-server
--raw
>
file
--raw
外壳> mysqlbinlog copied-binlog.000001 copied-binlog.000002 | mysql -u root -p
有关更多信息,请参见 第4.6.8.3节“使用mysqlbinlog备份二进制日志文件” 。
这种方法的优点是几乎可以立即使用新的服务器; 只有那些在重放快照或转储文件时提交的事务仍需要从现有主服务器获取。 这意味着从属设备的可用性不是即时的,但是从属设备只需要相对较短的时间来赶上这些剩余的事务。
事先将二进制日志复制到目标服务器通常比从主服务器实时读取整个事务执行历史记录更快。 但是,由于大小或其他考虑因素,在需要时将这些文件移动到目标可能并不总是可行的。 本节中讨论的另外两种配置新从站的方法使用其他方法将有关事务的信息传输到新从站。
注入空交易。
master的全局
gtid_executed
变量包含在
master上
执行的所有事务的集合。
在拍摄快照以配置新服务器时,您可以改为记录
gtid_executed
拍摄快照的服务器上的
内容,而不是复制二进制日志
。
在将新服务器添加到复制链之前,只需在新服务器上为主服务器中包含的每个事务标识符提交一个空事务
gtid_executed
,如下所示:
SET GTID_NEXT ='aaa-bbb-ccc-ddd:N'; 开始; 承诺; SET GTID_NEXT ='AUTOMATIC';
使用空事务以这种方式恢复所有事务标识符后,必须刷新并清除slave的二进制日志,如此处所示,其中
N
是当前二进制日志文件名的非零后缀:
FLUSH LOGS;
PURGE BINARY登录N
' master-bin.00000 ';
您应该执行此操作以防止此服务器在以后将其提升为主服务器时使用虚假事务充斥复制流。
(该
FLUSH
LOGS
语句强制创建新的二进制日志文件;
PURGE
BINARY LOGS
清除空事务,但保留其标识符。)
此方法创建一个本质上是快照的服务器,但由于其二进制日志历史记录与复制流的历史记录收敛(即,当它赶上主服务器或主服务器时),因此能够及时成为主服务器。 该结果与使用剩余供应方法获得的结果类似,我们将在接下来的几段中讨论。
使用gtid_purged排除交易。
master的全局
gtid_purged
变量包含从主服务器的二进制日志中清除的所有事务的集合。
与前面讨论的方法一样(请参阅
注入空事务
),您可以记录
gtid_executed
从中获取快照的服务器上
的值
(而不是将二进制日志复制到新服务器)。
与以前的方法不同,不需要提交空事务(或发布
PURGE
BINARY LOGS
);
相反,您可以
gtid_purged
根据
gtid_executed
从中获取备份或快照的服务器
上的值直接在从站上
进行设置
。
与使用空事务的方法一样,此方法创建一个功能上为快照的服务器,但由于其二进制日志历史记录与复制主服务器或组的历史记录收敛,因此能够及时成为主服务器。
恢复GTID模式从站。 在遇到错误的基于GTID的复制设置中还原从站时,注入空事务可能无法解决问题,因为事件没有GTID。
使用
mysqlbinlog
查找下一个事务,这可能是事件发生后下一个日志文件中的第一个事务。
将所有内容复制到该
COMMIT
事务,确保包含该事务
SET
@@SESSION.gtid_next
。
即使您不使用基于行的复制,仍可以在命令行客户端中运行二进制日志行事件。
停止从属并运行您复制的事务。
该
mysqlbinlog可以
输出设置的分隔符
/*!*/;
,所以将其设置回:
MySQL的> DELIMITER ;
自动从正确的位置重新启动复制:
mysql>SET GTID_NEXT=automatic;
mysql>RESET SLAVE;
mysql>START SLAVE;
由于基于GTID的复制依赖于事务,因此在使用时不支持MySQL中可用的某些功能。 本节提供有关使用GTID进行复制的限制和限制的信息。
涉及非事务存储引擎的更新。
使用GTID时,使用非事务性存储引擎对表进行更新(例如,
MyISAM
无法在与使用事务存储引擎(例如)的表更新相同的语句或事务中)
InnoDB
。
这种限制是由于对使用非事务性存储引擎的表的更新与对同一事务中使用事务存储引擎的表的更新混合的事实可能导致将多个GTID分配给同一事务。
当主设备和从设备使用不同的存储引擎用于同一个表的相应版本时,也会发生这样的问题,其中一个存储引擎是事务性的而另一个不是。 还要注意,定义为在非事务性表上运行的触发器可能是导致这些问题的原因。
在刚刚提到的任何一种情况下,事务和GTID之间的一对一对应关系被破坏,结果是基于GTID的复制无法正常运行。
CREATE TABLE ... SELECT语句。
CREATE
TABLE ... SELECT
使用基于GTID的复制时不允许使用语句。
当
binlog_format
设置为STATEMENT时,
CREATE TABLE ... SELECT
语句在二进制日志中记录为具有一个GTID的一个事务,但如果使用ROW格式,则该语句将记录为具有两个GTID的两个事务。
如果主服务器使用STATEMENT格式而从服务器使用ROW格式,
CREATE
TABLE ... SELECT
则从服务器
将无法正确处理事务,因此
GTID不允许使用
该
语句来阻止此情况。
临时表。
何时
binlog_format
设置为
STATEMENT
,
CREATE
TEMPORARY
TABLE
并且
DROP
TEMPORARY
TABLE
当在服务器上使用GTID时(即,当
enforce_gtid_consistency
系统变量设置为
ON
)
时,不能在事务,过程,函数和触发器内使用语句
。
当GTID正在使用时,它们可以在这些上下文之外使用,前提是
autocommit=1
已设置。
从MySQL 8.0.13开始,何时
binlog_format
设置为
ROW
或
MIXED
,
CREATE
TEMPORARY
TABLE
和
DROP
TEMPORARY
TABLE
在使用GTID时,允许在事务,过程,函数或触发器内部使用语句。
这些语句不会写入二进制日志,因此不会复制到从属语句。
使用基于行的复制意味着从属服务器保持同步,而无需复制临时表。
如果从事务中删除这些语句导致空事务,则事务不会写入二进制日志。
防止执行不受支持的语句。
要防止执行会导致基于GTID的复制失败的语句,必须
--enforce-gtid-consistency
在启用GTID时
使用该
选项
启动所有服务器
。
这会导致本节前面讨论的任何类型的语句失败并显示错误。
请注意,
--enforce-gtid-consistency
仅在对语句进行二进制日志记录时才会生效。
如果在服务器上禁用了二进制日志记录,或者由于过滤器删除了语句而未将语句写入二进制日志,则不会对未记录的语句检查或强制执行GTID一致性。
有关启用GTID时其他所需启动选项的信息,请参见 第17.1.3.4节“使用GTID设置复制” 。
跳过交易。
sql_slave_skip_counter
使用GTID时不支持。
如果您需要跳过事务,请使用master的
gtid_executed
变量
值
;
有关详细信息,
请参阅
注入空事务
。
忽略服务器。
CHANGE
MASTER TO
使用GTID时,不推荐使用
该
语句
的IGNORE_SERVER_IDS选项
,因为已经应用的事务会自动被忽略。
在启动基于GTID的复制之前,请检查并清除之前在相关服务器上设置的所有忽略的服务器ID列表。
SHOW SLAVE STATUS
可以为各个通道发出
的
语句显示已忽略的服务器ID列表(如果有)。
如果没有列表,则该
Replicate_Ignore_Server_Ids
字段为空。
GTID模式和mysqldump。 如果 目标服务器的二进制日志中没有GTID ,则可以将使用 mysqldump 创建的转储导入 到启用了GTID模式的MySQL服务器中。
GTID模式和mysql_upgrade。
在MySQL 8.0.16之前,当服务器运行时使用全局事务标识符(GTID)enabled(
gtid_mode=ON
)时,不要通过
mysql_upgrade
启用二进制日志记录
(该
--write-binlog
选项)。
从MySQL 8.0.16开始,服务器执行整个MySQL升级过程,但在升级过程中禁用二进制日志记录,因此没有问题。
MySQL包含一些内置(本机)函数,用于基于GTID的复制。 这些功能如下:
GTID_SUBSET(set1
,set2
)
由于两套全局事务标识符
set1
和
set2
,如果所有GTIDs返回true
set1
也是
set2
。
否则返回false。
GTID_SUBTRACT(set1
,set2
)
由于两套全局事务标识符
set1
和
set2
,只返回那些GTIDs
set1
不在
set2
。
WAIT_FOR_EXECUTED_GTID_SET(gtid_set
[,
timeout
])
等到服务器应用了包含全局事务标识符的所有事务
gtid_set
。
在指定的秒数过后,可选的超时会使函数停止等待。
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(gtid_set
[,
timeout
][,channel
])
喜欢
WAIT_FOR_EXECUTED_GTID_SET(),
但是对于单个启动的复制通道。
使用
WAIT_FOR_EXECUTED_GTID_SET()
而不是保证所有的通道都涵盖所有状态。
有关这些函数的详细信息,请参见 第12.18节“与全局事务标识符(GTID)一起使用的函数” 。
您可以定义自己的存储函数以使用GTID。
有关定义存储函数的信息,请参见
第24章,
存储对象
。
以下示例显示了可以基于内置
函数
GTID_SUBSET()
和
GTID_SUBTRACT()
函数
创建的一些有用的存储
函数。
请注意,在这些存储函数中,delimiter命令已用于将MySQL语句分隔符更改为垂直条,如下所示:
mysql>分隔符|
所有这些函数都将GTID集的字符串表示作为参数,因此GTID集在与它们一起使用时必须始终引用。
如果两个GTID集是相同的集,则此函数返回非零(true),即使它们没有以相同的方式格式化。
创建函数GTID_IS_EQUAL(gtid_set_1 LONGTEXT,gtid_set_2 LONGTEXT) 退货INT 返回GTID_SUBSET(gtid_set_1,gtid_set_2)和GTID_SUBSET(gtid_set_2,gtid_set_1)|
如果两个GTID集不相交,则此函数返回非零值(true)。
创建函数GTID_IS_DISJOINT(gtid_set_1 LONGTEXT,gtid_set_2 LONGTEXT) 退货INT 返回GTID_SUBSET(gtid_set_1,GTID_SUBTRACT(gtid_set_1,gtid_set_2))|
如果两个GTID集是不相交的,则此函数返回非零(true),并且
sum
是两个集合的并集。
创建函数GTID_IS_DISJOINT_UNION(gtid_set_1 LONGTEXT,gtid_set_2 LONGTEXT,总和LONGTEXT) 退货INT 返回GTID_IS_EQUAL(GTID_SUBTRACT(sum,gtid_set_1),gtid_set_2)AND GTID_IS_EQUAL(GTID_SUBTRACT(sum,gtid_set_2),gtid_set_1)|
此函数以全部大写形式返回GTID集的规范化形式,没有空格且没有重复。 UUID按字母顺序排列,间隔按数字顺序排列。
创建功能GTID_NORMALIZE(g LONGTEXT) 退货长期 返回GTID_SUBTRACT(g,'')|
此函数返回两个GTID集的并集。
创建函数GTID_UNION(gtid_set_1 LONGTEXT,gtid_set_2 LONGTEXT) 退货长期 返回GTID_NORMALIZE(CONCAT(gtid_set_1,',',gtid_set_2))|
此函数返回两个GTID集的交集。
创建函数GTID_INTERSECTION(gtid_set_1 LONGTEXT,gtid_set_2 LONGTEXT) 退货长期 返回GTID_SUBTRACT(gtid_set_1,GTID_SUBTRACT(gtid_set_1,gtid_set_2))|
此函数返回两个GTID集之间的对称差异,即存在
gtid_set_1
但不
存在的GTID
gtid_set_2
,以及存在
gtid_set_2
但不
存在的GTID
gtid_set_1
。
创建函数GTID_SYMMETRIC_DIFFERENCE(gtid_set_1 LONGTEXT,gtid_set_2 LONGTEXT) 退货长期 返回GTID_SUBTRACT(CONCAT(gtid_set_1,',',gtid_set_2),GTID_INTERSECTION(gtid_set_1,gtid_set_2))|
此函数从GTID中删除指定原点的所有GTID,并返回剩余的GTID(如果有)。
UUID是发起事务的服务器使用的标识符,通常是
server_uuid
值。
创建函数GTID_SUBTRACT_UUID(gtid_set LONGTEXT,uuid TEXT) 退货长期 返回GTID_SUBTRACT(gtid_set,CONCAT(UUID,':1-',(1 << 63) - 2))|
此函数反转先前列出的函数,以仅返回来自具有指定标识符(UUID)的服务器的GTID集中的那些GTID。
创建函数GTID_INTERSECTION_WITH_UUID(gtid_set LONGTEXT,uuid TEXT) 退货长期 返回GTID_SUBTRACT(gtid_set,GTID_SUBTRACT_UUID(gtid_set,uuid))|
示例17.1验证复制从站是否是最新的
内置的功能
GTID_SUBSET
和
GTID_SUBTRACT
可用于检查复制从具有至少一个主已申请的每个事务应用。
要执行此检查
GTID_SUBSET
,请在从属服务器上执行以下语句:
SELECT GTID_SUBSET(master_gtid_executed
,slave_gtid_executed
)
如果返回0(false),则某些GTID
master_gtid_executed
不存在
slave_gtid_executed
,因此主机已应用了从站未应用的某些事务,因此从站不是最新的。
要执行检查
GTID_SUBTRACT
,请在从站上执行以下语句:
SELECT GTID_SUBTRACT(master_gtid_executed
,slave_gtid_executed
)
此语句返回任何
master_gtid_executed
但不在其中的
GTID
slave_gtid_executed
。
如果返回任何GTID,则主站已应用了从站未应用的一些事务,因此从站不是最新的。
示例17.2备份和还原方案
存储的功能
GTID_IS_EQUAL
,
GTID_IS_DISJOINT
以及
GTID_IS_DISJOINT_UNION
可用于验证备份和恢复涉及多个数据库和服务器操作。
在此示例场景中,
server1
包含数据库
db1
,并
server2
包含数据库
db2
。
目标是将数据库复制
db2
到
server1
,并且结果
server1
应该是两个数据库的并集。
使用的过程是
server2
使用
mysqlpump
或
mysqldump
备份,然后恢复此备份
server1
。
如果备份程序的选项
--set-gtid-purged
设置为
ON
或默认值
AUTO
,则程序的输出包含一个
SET
@@GLOBAL.gtid_purged
语句,
该
语句将该
gtid_executed
组
添加
server2
到
gtid_purged
设置中
server1
。
该
gtid_purged
集包含已在服务器上提交但在服务器上的任何二进制日志文件中不存在的所有事务的GTID。
当数据库
db2
被复制到
server1
,犯下交易的GTIDs
server2
,这是不是在二进制日志文件上
server1
,必须添加
server1
的
gtid_purged
设置,使一套完整。
存储的函数可用于协助此方案中的以下步骤:
使用
GTID_IS_EQUAL
来验证备份操作计算的正确GTID一套
SET @@GLOBAL.gtid_purged
说法。
在
server2
,从
mysqlpump
或
mysqldump
输出中
提取该语句
,并将GTID集存储到本地变量中,例如
$gtid_purged_set
。
然后执行以下语句:
server2> SELECT GTID_IS_EQUAL($ gtid_purged_set,@@ GLOBAL.gtid_executed);
如果结果为1,则两个GTID集相等,并且已正确计算该集。
使用
GTID_IS_DISJOINT
验证,在设定的GTID
mysqlpump
或
mysqldump的
输出不与重叠
gtid_executed
设置
server1
。
如果存在任何重叠,由于某种原因在两台服务器上都存在相同的GTID,则在将数据库复制
db2
到
时会出现错误
server1
。
要检查,打开
server1
,提取
gtid_purged
输出并将输出
存储
到上面的局部变量中,然后执行以下语句:
server1> SELECT GTID_IS_DISJOINT($ gtid_purged_set,@@ GLOBAL.gtid_executed);
如果结果为1,则两个GTID集之间没有重叠,因此不存在重复的GTID。
使用
GTID_IS_DISJOINT_UNION
来验证还原操作导致的正确GTID状态
server1
。
在恢复备份之前,
通过执行以下语句
server1
获取现有
gtid_executed
集:
server1> SELECT @@ GLOBAL.gtid_executed;
将结果存储在局部变量中
$original_gtid_executed
。
还将
gtid_purged
集合
存储在
如上所述的局部变量中。
备份来自
server2
还原后
server1
,执行以下语句以验证GTID状态:
server1> SELECT GTID_IS_DISJOINT_UNION($ original_gtid_executed, $ gtid_purged_set, @@ GLOBAL.gtid_executed);
如果结果是1,存储功能已证实,原来
gtid_executed
设定的从
server1
(
$original_gtid_executed
)和
gtid_purged
一个从添加组
server2
(
$gtid_purged_set
)没有重叠,也更新后的
gtid_executed
设置上
server1
,现在由以前的
gtid_executed
一组来自
server1
加上
gtid_purged
从集
server2
,这是理想的结果。
确保在进行任何进一步的事务之前执行此检查
server1
,否则
gtid_executed
集合中
的新事务
将导致其失败。
例17.3选择最新的从站进行手动故障转移
存储的函数
GTID_UNION
可用于从一组从属中识别最新的复制从属,以便在复制主机意外停止后执行手动故障转移操作。
如果某些从站遇到复制延迟,则此存储的函数可用于计算最新的从站,而无需等待所有从站应用其现有的中继日志,从而最大限度地缩短故障转移时间。
该函数可以返回
gtid_executed
每个从站上的集合与从站接收的事务集合的并集,该集合记录在性能架构表中
replication_connection_status
。
您可以比较这些结果,以查找哪个奴隶的交易记录是最新的,即使并非所有交易都已提交。
在每个复制从属服务器上,通过发出以下语句来计算完整的事务记录:
SELECT GTID_UNION(RECEIVED_TRANSACTION_SET,@@ GLOBAL.gtid_executed) 来自performance_schema.replication_connection_status WHERE channel_name ='name';
然后,您可以比较每个从站的结果,以查看哪个具有最新的事务记录,并将此从站用作新的复制主站。
示例17.4检查复制从站上的无关事务
存储的函数
GTID_SUBTRACT_UUID
可用于检查复制从站是否已收到不是源自其指定主站或主站的事务。
如果有,则可能是您的复制设置或代理,路由器或负载均衡器存在问题。
此功能的工作原理是从GTID中删除指定始发服务器中的所有GTID,并返回剩余的GTID(如果有)。
对于具有单个主服务器的复制从服务器,请发出以下语句,并提供原始复制主服务器的标识符,该标识符通常为以下
server_uuid
值:
SELECT GTID_SUBTRACT_UUID(@@ GLOBAL.gtid_executed,server_uuid_of_master);
如果结果不为空,则返回的事务是不是源自指定主服务器的额外事务。
对于多主复制拓扑中的从站,请重复该功能,例如:
SELECT GTID_SUBTRACT_UUID(GTID_SUBTRACT_UUID(@@ GLOBAL.gtid_executed, server_uuid_of_master_1) server_uuid_of_master_2);
如果结果不为空,则返回的事务是不是来自任何指定主服务器的额外事务。
示例17.5验证复制拓扑中的服务器是否为只读
存储的函数
GTID_INTERSECTION_WITH_UUID
可用于验证服务器是否未发起任何GTID并且处于只读状态。
该函数仅返回来自GTID集的GTID,这些GTID源自具有指定标识符的服务器。
如果服务器
gtid_executed
集中的
任何事务
具有服务器自己的标识符,则服务器本身会发起这些事务。
您可以在服务器上发出以下语句来检查:
SELECT GTID_INTERSECTION_WITH_UUID(@@ GLOBAL.gtid_executed,my_server_uuid);
例17.6在多主复制设置中验证附加从站
存储的函数
GTID_INTERSECTION_WITH_UUID
可用于查明连接到多主复制设置的从属是否已应用源自一个特定主服务器的所有事务。
在这种情况下,
master1
并且
master2
都是主人和奴隶,并复制到对方。
master2
也有自己的复制奴隶。
master1
如果
master2
配置了
复制从属设备,它也将接收和应用
事务
log_slave_updates=ON
,但如果
master2
使用
则不会这样做
log_slave_updates=OFF
。
无论如何,我们目前只想知道复制从站是否是最新的
master2
。
在这种情况下,存储功能
GTID_INTERSECTION_WITH_UUID
可用于标识
master2
发起的事务,丢弃
master2
已复制
的事务
master1
。
GTID_SUBSET
然后可以使用
内置函数
将结果
gtid_executed
与从站上的设置
进行比较
。
如果从站是最新的
master2
,
gtid_executed
则从站上
的
设置包含交集中的所有事务(源自的事务
master2
)。
要执行此检查,将商店
master2
的
gtid_executed
set,
master2
服务器UUID和slave的
gtid_executed
集合存储到客户端变量中,如下所示:
$ master2_gtid_executed:= master2> SELECT @@ GLOBAL.gtid_executed; $ master2_server_uuid:= master2> SELECT @@ GLOBAL.server_uuid; $ slave_gtid_executed:= 奴隶> SELECT @@ GLOBAL.gtid_executed;
然后使用
GTID_INTERSECTION_WITH_UUID
和
GTID_SUBSET
将这些变量作为输入,如下所示:
SELECT GTID_SUBSET(GTID_INTERSECTION_WITH_UUID($ master2_gtid_executed, $ master2_server_uuid) $ slave_gtid_executed);
来自
master2
(
$master2_server_uuid
)
的服务器标识符
用于
GTID_INTERSECTION_WITH_UUID
识别和返回
源自
master2
的
gtid_executed
集合中的
那些GTID
master2
,省略那些源自
的
集合
master1
。
然后使用得到的GTID集与从站上所有已执行GTID的集合进行比较
GTID_SUBSET
。
如果此语句返回非零(true),则来自
master2
(第一组输入)的
所有标识的GTID
也在从属
gtid_executed
集(第二组输入)中,这意味着从属已复制源自的所有事务
master2
。
本节介绍MySQL多源复制,它允许您并行地从多个直接主站复制。 本节介绍多源复制,以及如何配置,监视和排除故障。
MySQL多源复制使复制从站可以同时从多个源接收事务。 多源复制可用于将多个服务器备份到单个服务器,合并表分片,以及将来自多个服务器的数据合并到单个服务器。 应用事务时,多源复制不会实现任何冲突检测或解决,如果需要,这些任务将留给应用程序。 在多源复制拓扑中,从属服务器为每个应从其接收事务的主服务器创建复制通道。 请参见 第17.2.3节“复制通道” 。 以下部分介绍如何设置多源复制。
本节提供有关如何为多源复制配置主站和从站以及如何启动,停止和重置多源从站的教程。
本节介绍如何配置多源复制拓扑,并提供有关配置主站和从站的详细信息。 这种拓扑需要至少两个主设备和一个从设备配置。
可以将多源复制拓扑中的主服务器配置为使用基于全局事务标识符(GTID)的复制或基于二进制日志位置的复制。 有关 如何使用基于GTID的复制配置主 服务器, 请参见 第17.1.3.4节“ 使用GTID设置复制”。 有关 如何使用基于文件位置的复制配置主 服务器, 请参见 第17.1.2.1节“设置复制主服务器配置” 。
多源复制拓扑中的从站需要
TABLE
主信息日志和中继日志信息日志的存储库,这是MySQL 8.0中的默认日志。
多源复制与
FILE
基于存储库
不兼容,
现在不推荐使用
--master-info-repository
和
--relay-log-info-repository
选项
的FILE设置
。
要修改使用
FILE
存储库以使用从属状态日志来使用
TABLE
存储库
的现有复制从属,请
通过运行以下命令动态转换现有复制存储库:
STOP SLAVE;
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';
本节假定您已在主服务器上启用了基于GTID的事务
gtid_mode=ON
,启用了复制用户,并确保从服务器正在使用
TABLE
基于复制的存储库。
使用该
CHANGE
MASTER TO
语句通过使用
子句
将新主服务器添加到通道
。
有关复制通道的更多信息,请参见
第17.2.3节“复制通道”
FOR CHANNEL
channel
例如,要
master1
使用端口
3451
将具有
主机名的新主服务器添加
到名为的通道
master-1
:
CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='rpl', MASTER_PORT=3451, MASTER_PASSWORD='', \
MASTER_AUTO_POSITION = 1 FOR CHANNEL 'master-1';
多源复制与自动定位兼容。 有关 更多信息 , 请参见 第13.4.2.1节“将语法更改 为 语法” 。
对要添加到通道的每个额外主站重复此过程,根据需要更改主机名,端口和通道。
本节假设在主服务器上启用了二进制日志记录(这是默认设置),从服务器正在使用
TABLE
基于复制的存储库(这是MySQL 8.0中的默认存储库),并且您已启用复制用户并注意到当前的二进制日志位置。
你需要知道当前
MASTER_LOG_FILE
和
MASTER_LOG_POSITION
。
使用该
CHANGE
MASTER TO
语句通过指定
子句
将新主服务器添加到通道
。
例如,要
使用端口
将具有
主机名的新主服务器添加
到名为的通道
:
FOR CHANNEL
channel
master1
3451
master-1
CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='rpl', MASTER_PORT=3451, MASTER_PASSWORD='' \
MASTER_LOG_FILE='master1-bin.000006', MASTER_LOG_POS=628 FOR CHANNEL 'master-1';
对要添加到通道的每个额外主站重复此过程,根据需要更改主机名,端口和通道。
添加了要用作复制主服务器的所有通道后,请使用
语句启动复制。
在从站上启用多个通道后,您可以选择启动所有通道,也可以选择要启动的特定通道。
START SLAVE
thread_types
要启动所有当前配置的复制通道:
START SLAVE thread_types
;
要仅启动命名通道,请使用以下
子句:
FOR CHANNEL
channel
START SLAVE thread_types
FOR CHANNEL channel
;
使用该
thread_types
选项选择您希望上述语句在从站上启动的特定线程。
有关
更多信息
,
请参见
第13.4.2.6节“START SLAVE语法”
。
该
STOP SLAVE
语句可用于停止多源复制从属。
默认情况下,如果
STOP SLAVE
在多源复制从站上
使用该
语句
,则
所有通道都将停止。
(可选)使用该
子句仅停止特定通道。
FOR CHANNEL
channel
要停止所有当前配置的复制通道:
STOP SLAVE thread_types
;
要仅停止命名通道,请使用以下
子句:
FOR CHANNEL
channel
STOP SLAVE thread_types
FOR CHANNEL channel
;
使用该
thread_types
选项选择您希望上述语句在从站上停止的特定线程。
有关
更多信息
,
请参见
第13.4.2.7节“STOP SLAVE语法”
。
该
RESET SLAVE
语句可用于重置多源复制从站。
默认情况下,如果
RESET SLAVE
在多源复制从站上
使用该
语句,则会重置所有通道。
(可选)使用该
子句仅重置特定通道。
FOR CHANNEL
channel
要重置所有当前配置的复制通道:
RESET SLAVE;
要仅重置命名通道,请使用以下
子句:
FOR CHANNEL
channel
RESET SLAVE FOR CHANNEL channel
;
有关 更多信息 , 请参见 第13.4.2.4节“重置从动语法” 。
要监视复制通道的状态,需要以下选项:
使用复制性能架构表。
这些表的第一列是
Channel_Name
。
这使您可以基于
Channel_Name
键
来编写复杂查询
。
请参见
第26.12.11节“性能模式复制表”
。
用
。
默认情况下,如果
未使用
该
子句,则此语句显示所有通道的从属状态,每个通道一行。
标识符
将作为列添加到结果集中。
如果
提供
了
子句,则结果仅显示指定复制通道的状态。
SHOW SLAVE STATUS FOR CHANNEL
channel
FOR CHANNEL
channel
Channel_name
FOR CHANNEL
channel
该
SHOW
VARIABLES
语句不适用于多个复制通道。
通过这些变量可用的信息已迁移到复制性能表。
SHOW
VARIABLES
在具有多个通道的拓扑中
使用
语句仅显示默认通道的状态。
本节介绍如何使用复制性能架构表来监视通道。 您可以选择监控所有频道或现有频道的子集。
要监控所有通道的连接状态:
MySQL的> SELECT * FROM replication_connection_status\G;
*************************** 1。排******************** *******
CHANNEL_NAME:master1
团队名字:
SOURCE_UUID:046e41f8-a223-11e4-a975-0811960cc264
THREAD_ID:24
SERVICE_STATE:开
COUNT_RECEIVED_HEARTBEATS:0
LAST_HEARTBEAT_TIMESTAMP:0000-00-00 00:00:00
RECEIVED_TRANSACTION_SET:046e41f8-a223-11e4-a975-0811960cc264:4-37
LAST_ERROR_NUMBER:0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP:0000-00-00 00:00:00
*************************** 2.排******************** *******
CHANNEL_NAME:master2
团队名字:
SOURCE_UUID:7475e474-a223-11e4-a978-0811960cc264
THREAD_ID:26
SERVICE_STATE:开
COUNT_RECEIVED_HEARTBEATS:0
LAST_HEARTBEAT_TIMESTAMP:0000-00-00 00:00:00
RECEIVED_TRANSACTION_SET:7475e474-a223-11e4-a978-0811960cc264:4-6
LAST_ERROR_NUMBER:0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP:0000-00-00 00:00:00
2行(0.00秒)
在上面的输出中,有两个通道被启用,并且如
CHANNEL_NAME
字段
所示,
它们被称为
master1
和
master2
。
通过添加
CHANNEL_NAME
字段,您可以查询特定通道的性能架构表。
要监视命名通道的连接状态,请使用以下
子句:
WHERE
CHANNEL_NAME=
channel
MySQL的> SELECT * FROM replication_connection_status WHERE CHANNEL_NAME='master1'\G
*************************** 1。排******************** *******
CHANNEL_NAME:master1
团队名字:
SOURCE_UUID:046e41f8-a223-11e4-a975-0811960cc264
THREAD_ID:24
SERVICE_STATE:开
COUNT_RECEIVED_HEARTBEATS:0
LAST_HEARTBEAT_TIMESTAMP:0000-00-00 00:00:00
RECEIVED_TRANSACTION_SET:046e41f8-a223-11e4-a975-0811960cc264:4-37
LAST_ERROR_NUMBER:0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP:0000-00-00 00:00:00
1排(0.00秒)
同样,该
子句可用于监视特定通道的其他复制性能架构表。
有关更多信息,请参见
第26.12.11节“性能模式复制表”
。
WHERE
CHANNEL_NAME=
channel
本节介绍如何更改正在使用的复制模式,而无需使服务器脱机。
为了能够安全地配置在线服务器的复制模式,了解一些关键的复制概念非常重要。 本节介绍了这些概念,在尝试修改在线服务器的复制模式之前,它是必不可少的读物。
MySQL中可用的复制模式依赖于识别记录的事务的不同技术。 复制使用的事务类型如下:
GTID事务由表单中的全局事务标识符(GTID)标识
UUID:NUMBER
。
日志中的每个GTID事务总是以a开头
Gtid_log_event
。
可以使用GTID或使用文件名和位置来处理GTID事务。
匿名事务没有分配GTID,并且MySQL确保日志中的每个匿名事务都以a开头
Anonymous_gtid_log_event
。
在以前的版本中,匿名事务之前没有任何特定事件。
匿名事务只能使用文件名和位置来处理。
当使用GTIDs您可以利用自动定位和自动故障转移的,以及使用
WAIT_FOR_EXECUTED_GTID_SET()
,
session_track_gtids
和监控使用Performance模式表复制的事务。
启用GTID后,您无法使用
sql_slave_skip_counter
,而是使用空事务。
从运行MySQL先前版本的主服务器接收的中继日志中的事务可能根本不会出现任何特定事件,但在重放并记录在从属二进制日志中之后,它们前面会有一个
Anonymous_gtid_log_event
。
在线配置复制模式的能力意味着
gtid_mode
和
enforce_gtid_consistency
变量现在都是动态的,并且可以通过具有足以设置全局系统变量的特权的帐户从顶级语句设置。
请参见
第5.1.9.1节“系统变量权限”
。
在MySQL 5.6及更早版本中,这两个变量都只能在服务器启动时使用适当的选项进行配置,这意味着对复制模式的更改需要重新启动服务器。
在所有版本中
gtid_mode
都可以设置为
ON
或
OFF
,这与GTID是否用于识别交易相对应。
什么时候
gtid_mode=ON
无法复制匿名事务,并且
gtid_mode=OFF
只能
复制匿名事务
。
gtid_mode=OFF_PERMISSIVE
然后,
当允许复制的事务为GTID或匿名事务
时,
新
事务是匿名的。
当
gtid_mode=ON_PERMISSIVE
再
新
,同时允许复制的事务事务使用GTIDs是要么GTID或匿名交易。
这意味着可以拥有一个复制拓扑,其中包含使用匿名和GTID事务的服务器。
例如,一个主人
gtid_mode=ON
可以复制到一个奴隶
gtid_mode=ON_PERMISSIVE
。
有效值
gtid_mode
如下并按此顺序:
OFF
OFF_PERMISSIVE
ON_PERMISSIVE
ON
重要的是要注意,状态
gtid_mode
只能根据上述顺序一次改变一步。
例如,如果
gtid_mode
当前设置为
OFF_PERMISSIVE
,则可以更改为
OFF
或
ON_PERMISSIVE
不更改
ON
。
这是为了确保服务器正确处理从在线匿名事务更改为GTID事务的过程。
当您在
gtid_mode=ON
和
之间切换时
gtid_mode=OFF
,GTID状态(换句话说,值
gtid_executed
)是持久的。
这可确保始终保留服务器应用的GTID集,而不管类型之间的更改如何
gtid_mode
。
无论当前选择哪个,与GTID相关的字段都会显示正确的信息
gtid_mode
。
这意味着,显示GTID组领域,如
gtid_executed
,
gtid_purged
,
RECEIVED_TRANSACTION_SET
在
replication_connection_status
性能架构表,的GTID相关的结果
SHOW SLAVE STATUS
,现在返回空字符串时,有没有存在GTIDs。
现在,
在未使用GTID事务时
,将显示显示单个GTID的字段,例如
CURRENT_TRANSACTION
性能模式
replication_applier_status_by_worker
表
中的
字段
ANONYMOUS
。
从主服务器进行的复制
gtid_mode=ON
提供了使用自动定位的功能,使用该
CHANGE
MASTER TO MASTER_AUTO_POSITION = 1;
语句进行
配置
。
正在使用的复制拓扑影响是否可以启用自动定位,因为此功能依赖于GTID并且与匿名事务不兼容。
如果启用了自动定位并且遇到匿名事务,则会生成错误。
强烈建议在启用自动定位之前确保拓扑中没有剩余匿名事务,请参见
第17.1.5.2节“在线启用GTID事务”
。
gtid_mode
主站和从站
的有效组合
和自动定位如下表所示,其中主站
gtid_mode
显示在水平上,而从
gtid_mode
站在垂直方向上。
每个条目的含义如下:
表17.1主服务器和从服务器gtid_mode的有效组合
主
|
主
|
主
|
主
|
|
---|---|---|---|---|
奴隶
|
ÿ |
ÿ |
ñ |
ñ |
奴隶
|
ÿ |
ÿ |
ÿ |
Y * |
奴隶
|
ÿ |
ÿ |
ÿ |
Y * |
奴隶
|
ñ |
ñ |
ÿ |
Y * |
当前选择的
gtid_mode
也会影响
gtid_next
变量。
下表显示了服务器的不同价值观的行为
gtid_mode
和
gtid_next
。
每个条目的含义如下:
ANONYMOUS
:生成匿名事务。
Error
:生成错误并且无法执行
SET GTID_NEXT
。
UUID:NUMBER
:使用指定的UUID:NUMBER生成GTID。
New GTID
:使用自动生成的数字生成GTID。
当二进制日志关闭并
gtid_next
设置
AUTOMATIC
为时,则不会生成GTID。
这与先前版本的行为一致。
本节介绍如何在已联机且使用匿名事务的服务器上启用GTID事务以及(可选)自动定位。 此过程不需要使服务器脱机并且适合在生产中使用。 但是,如果您在启用GTID事务时可以使服务器脱机,则该过程更容易。
在开始之前,请确保服务器满足以下前提条件:
拓扑中的 所有 服务器都必须使用MySQL 5.7.6或更高版本。 除非 拓扑中的 所有 服务器都使用此版本, 否则无法在任何单个服务器上联机启用GTID事务 。
所有服务器都已
gtid_mode
设置为默认值
OFF
。
以下程序可以随时暂停,之后可以恢复 原状, 或者通过跳转到 第17.1.5.3节“禁用GTID在线交易” 的相应步骤进行 撤销,这是禁用GTID 的在线程序。 这使得该过程具有容错能力,因为可以像往常一样处理可能出现在过程中间的任何不相关的问题,然后该过程在其停止的地方继续。
在继续下一步之前,完成每个步骤至关重要。
要启用GTID交易:
在每台服务器上,执行:
SET @@ GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;
让服务器在正常工作负载下运行一段时间并监控日志。 如果此步骤导致日志中出现任何警告,请调整应用程序,使其仅使用与GTID兼容的功能,并且不会生成任何警告。
这是第一个重要的步骤。 在进行下一步之前,必须确保错误日志中未生成警告。
在每台服务器上,执行:
SET @@ GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
在每台服务器上,执行:
SET @@ GLOBAL.GTID_MODE = OFF_PERMISSIVE;
哪个服务器首先执行此语句无关紧要,但重要的是所有服务器在任何服务器开始下一步之前完成此步骤。
在每台服务器上,执行:
SET @@ GLOBAL.GTID_MODE = ON_PERMISSIVE;
哪个服务器首先执行此语句无关紧要。
在每台服务器上,等待状态变量
ONGOING_ANONYMOUS_TRANSACTION_COUNT
为零。
可以使用以下方法检查:
显示状态如'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
在复制从站上,理论上可能会再次显示零然后非零。 这不是问题,它足以显示零一次。
等待直到步骤5生成的所有事务都复制到所有服务器。 您可以在不停止更新的情况下执行此操作:唯一重要的是所有匿名事务都会被复制。
有关 检查所有匿名事务是否已复制到所有服务器的一种方法, 请参见 第17.1.5.4节“验证 匿名事务的复制”。
如果您将二进制日志用于复制以外的任何其他日志,例如时间点备份和还原,请等到您不需要具有没有GTID的事务的旧二进制日志。
例如,在步骤6完成后,您可以
FLUSH LOGS
在要进行备份的服务器上
执行
。
然后显式地进行备份或等待您可能已设置的任何定期备份例程的下一次迭代。
理想情况下,等待服务器清除步骤6完成时存在的所有二进制日志。 还要等待在步骤6到期之前进行的任何备份。
这是第二个重点。 至关重要的是要了解包含匿名事务的二进制日志,在没有GTID的情况下,在下一步之后无法使用。 完成此步骤后,您必须确保拓扑中的任何位置都不存在没有GTID的事务。
在每台服务器上,执行:
SET @@ GLOBAL.GTID_MODE = ON;
在每台服务器上,添加
gtid-mode=ON
到
my.cnf
。
现在可以保证所有事务都具有GTID(在步骤5或更早版本中生成的事务已经过处理)。
要开始使用GTID协议以便以后执行自动故障转移,请在每个从站上执行以下操作。
(可选)如果使用多源复制,请对每个通道执行此操作并包含以下
子句:
FOR CHANNEL
channel
STOP SLAVE [FOR CHANNEL'channel']; 更改MASTER_AUTO_POSITION = 1 [FOR CHANNEL'channel']; START SLAVE [FOR CHANNEL'channel'];
本节介绍如何在已联机的服务器上禁用GTID事务。 此过程不需要使服务器脱机并且适合在生产中使用。 但是,如果您在禁用GTID模式时可以使服务器脱机,则该过程更容易。
该过程类似于在服务器联机时启用GTID事务,但是反转步骤。 唯一不同的是等待记录的事务复制的点。
在开始之前,请确保服务器满足以下前提条件:
拓扑中的 所有 服务器都必须使用MySQL 5.7.6或更高版本。 除非 拓扑中的 所有 服务器都使用此版本, 否则无法在任何单个服务器上联机禁用GTID事务 。
所有服务器都
gtid_mode
设置为
ON
。
该
--replicate-same-server-id
选项未在任何服务器上设置。
如果此选项与
--log-slave-updates
选项(默认值)
一起设置
并且启用了二进制日志记录(这也是默认值),则
无法禁用GTID事务
。
如果没有GTID,这种选项组合会在循环复制中导致无限循环。
在每个从站上执行以下操作,如果使用多源复制,请为每个通道执行此操作并包含
FOR CHANNEL
channel子句:
STOP SLAVE [FOR CHANNEL'channel']; CHANGE MASTER TO MASTER_AUTO_POSITION = 0,MASTER_LOG_FILE = file,\ MASTER_LOG_POS = position [FOR CHANNEL'channel']; START SLAVE [FOR CHANNEL'channel'];
在每台服务器上,执行:
SET @@ GLOBAL.GTID_MODE = ON_PERMISSIVE;
在每台服务器上,执行:
SET @@ GLOBAL.GTID_MODE = OFF_PERMISSIVE;
在每台服务器上,等待变量@@ GLOBAL.GTID_OWNED等于空字符串。 可以使用以下方法检查:
SELECT @@ GLOBAL.GTID_OWNED;
在复制从属设备上,理论上可能是空的,然后再次非空。 这不是问题,只要它是空的一次就足够了。
等待任何二进制日志中当前存在的所有事务都复制到所有从属服务器。 有关 检查所有匿名事务是否已复制到所有服务器的一种方法, 请参见 第17.1.5.4节“验证 匿名事务的复制”。
如果您将二进制日志用于复制以外的任何其他日志,例如进行时间点备份或还原:请等待,直到您不需要具有GTID事务的旧二进制日志。
例如,在步骤5完成后,您可以
FLUSH LOGS
在要进行备份的服务器上
执行
。
然后显式地进行备份或等待您可能已设置的任何定期备份例程的下一次迭代。
理想情况下,等待服务器清除步骤5完成时存在的所有二进制日志。 还要等待在步骤5之前进行的任何备份到期。
这是此过程中的一个重点。 重要的是要了解包含GTID事务的日志在下一步之后无法使用。 在继续之前,您必须确保拓扑中的任何位置都不存在GTID事务。
在每台服务器上,执行:
SET @@ GLOBAL.GTID_MODE = OFF;
在每个服务器上,设置
gtid-mode=OFF
在
my.cnf
。
如果你想设置
enforce_gtid_consistency=OFF
,你现在可以这样做。
设置后,您应该添加
enforce_gtid_consistency=OFF
到配置文件中。
如果要降级到早期版本的MySQL,可以使用正常的降级程序立即降级。
本节介绍如何监视复制拓扑并验证是否已复制所有匿名事务。 这在联机更改复制模式时很有用,因为您可以验证更改为GTID事务是否安全。
有几种方法可以等待事务复制:
最简单的方法,无论您的拓扑结构如何工作,但依赖于时序如下:如果您确定从站永远不会滞后超过N秒,则只需等待超过N秒。 或者等待一天,或者您认为安全部署的任何时间段。
一种更安全的方法,它不依赖于时间:如果您只有一个或多个从站的主站,请执行以下操作:
在主服务器上,执行:
显示主要状态;
记下
File
和
Position
列中
的值
。
在每个从站上,使用主站的文件和位置信息执行:
SELECT MASTER_POS_WAIT(文件,位置);
如果您有一个主站和多个级别的从站,或者换句话说您有从站的从站,请在每个级别上重复步骤2,从主站开始,然后是所有直接从站,然后是从站的所有从站,依此类推。
如果使用循环复制拓扑,其中多个服务器可能具有写入客户端,请对每个主从连接执行步骤2,直到完成整个循环。 重复整个过程,以便完成 两次 完整的循环 。
例如,假设您有三个服务器A,B和C,以圆形复制,以便A - > B - > C - > A.过程如下:
在A上执行步骤1,在B上执行步骤2。
在B上执行步骤1,在C上执行步骤2。
在C上执行步骤1,在A上执行步骤2。
在A上执行步骤1,在B上执行步骤2。
在B上执行步骤1,在C上执行步骤2。
在C上执行步骤1,在A上执行步骤2。
以下部分包含有关 在复制和控制二进制日志中使用的 mysqld 选项和服务器变量的 信息 。 复制主服务器和复制从服务器上使用的选项和变量分别包含在内,与二进制日志记录和全局事务标识符(GTID)相关的选项和变量也是如此。 还包括一组快速参考表,提供有关这些选项和变量的基本信息。
特别重要的是
--server-id
选择权。
属性 | 值 |
---|---|
命令行格式 | --server-id=# |
系统变量 | server_id |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 (> = 8.0.3) | 1 |
默认值 (<= 8.0.2) | 0 |
最低价值 | 0 |
最大价值 | 4294967295 |
指定服务器ID。
的
server_id
系统变量被默认设置为1。
可以使用此缺省ID启动服务器,但是启用二进制日志记录时,如果未使用该
--server-id
选项
明确指定服务器标识,则会发出信息性消息
。
对于复制拓扑中使用的服务器,必须为每个复制服务器指定唯一的服务器ID,范围为1到2 32 - 1. “ 唯一 ” 表示每个ID必须与正在使用的每个其他ID不同任何其他复制主机或从机。 有关其他信息,请参见 第17.1.6.2节“复制主选项和变量” 和 第17.1.6.3节“复制从选项和变量” 。
如果服务器ID设置为0,则进行二进制日志记录,但服务器ID为0的主服务器拒绝来自从服务器的任何连接,服务器ID为0的从服务器拒绝连接到主服务器。 请注意,虽然您可以将服务器ID动态更改为非零值,但这样做不会立即启动复制。 您必须更改服务器ID,然后重新启动服务器以初始化复制从站。
有关更多信息,请参见 第17.1.2.2节“设置复制从站配置” 。
除了在
server_id
系统变量中
设置的默认或用户提供的服务器ID之外,MySQL服务器还会生成真正的UUID
。
这可用作全局只读变量
server_uuid
。
所述的存在
server_uuid
系统变量不用于设置一个唯一的改变的要求
--server-id
为每个MySQL服务器作为制备和运行MySQL复制,如前面在本节中描述的组成部分。
属性 | 值 |
---|---|
系统变量 | server_uuid |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
启动时,MySQL服务器自动获取UUID,如下所示:
该
auto.cnf
文件的格式类似于用于
my.cnf
或
my.ini
文件的格式。
auto.cnf
只有一个
[auto]
部分包含一个
server_uuid
设置和值;
文件的内容与此处显示的内容类似:
[汽车] server_uuid = 8a94f357-aab4-11df-86ab-c80aa9429562
该
auto.cnf
文件是自动生成的;
不要尝试编写或修改此文件。
使用MySQL复制时,主服务器和从服务器知道彼此的UUID。
从属的UUID的值可以在输出中看到
SHOW
SLAVE HOSTS
。
一旦
START
SLAVE
执行,主机的UUID的值在输出中的从机上可用
SHOW
SLAVE STATUS
。
发出
STOP
SLAVE
或
RESET
SLAVE
语句也
不会
重置主人的UUID在从属的使用。
服务器
server_uuid
也在GTID中用于源自该服务器的事务。
有关更多信息,请参见
第17.1.3节“使用全局事务标识符进行复制”
。
启动时,从属I / O线程会生成错误并在其主控器的UUID等于其自身的情况下中止,除非
--replicate-same-server-id
已设置
该
选项。
此外,如果满足以下任一条件,则从属I / O线程会生成警告:
没有预期
server_uuid
存在的
主人
。
server_uuid
虽然没有任何
CHANGE
MASTER
TO
声明被执行
,但
主人
已经改变
了。
以下两个列表提供了有关适用于复制的MySQL命令行选项和系统变量以及二进制日志的基本信息。
以下列表中的命令行选项和系统变量与复制主服务器和复制从服务器相关。 第17.1.6.2节“复制主选项和变量” 提供了有关复制主服务器的选项和变量的更多详细信息。 有关与复制从站相关的选项和变量的更多信息,请参见 第17.1.6.3节“复制从站选项和变量” 。
abort-slave-event-count
:mysql-test用于调试和复制测试的选项
binlog_expire_logs_seconds
:在这么多秒后清除二进制日志
binlog_gtid_simple_recovery
:控制在GTID恢复期间迭代二进制日志的方式
Com_change_master
:CHANGE MASTER TO语句的计数
Com_show_master_status
:SHOW MASTER STATUS语句的计数
Com_show_slave_hosts
:SHOW SLAVE HOSTS语句的计数
Com_show_slave_status
:SHOW SLAVE STATUS语句的计数
Com_slave_start
:START SLAVE语句的计数
Com_slave_stop
:STOP SLAVE语句的计数
disconnect-slave-event-count
:mysql-test用于调试和复制测试的选项
enforce-gtid-consistency
:防止执行无法以事务安全方式记录的语句
enforce_gtid_consistency
:防止执行无法以事务安全方式记录的语句
expire_logs_days
:在这么多天之后清除二进制日志
gtid-executed-compression-period
:每次发生这么多事务时压缩gtid_executed表。
0表示从不压缩此表。
仅在禁用二进制日志记录时适用。
gtid-mode
:控制是否启用基于GTID的日志记录以及日志可以包含的事务类型
gtid_executed
:Global:二进制日志(全局)或当前事务(会话)中的所有GTID。
只读。
gtid_executed_compression_period
:每次发生这么多事务时压缩gtid_executed表。
0表示从不压缩此表。
仅在禁用二进制日志记录时适用。
gtid_mode
:控制是否启用基于GTID的日志记录以及日志可以包含的事务类型
gtid_next
:指定要执行的下一个语句的GTID;
请参阅文档了解详情
gtid_owned
:此客户端(会话)或所有客户端拥有的GTID集以及所有者的线程ID(全局)。
只读。
gtid_purged
:已从二进制日志中清除的所有GTID的集合
init_slave
:从站连接到主站时执行的语句
log-bin-trust-function-creators
:如果等于0(默认值),则使用--log-bin时,仅允许具有SUPER权限的用户创建存储函数,并且仅当创建的函数不破坏二进制日志记录时才
log-slave-updates
:告诉slave将其SQL线程执行的更新记录到自己的二进制日志中
log_builtin_as_identified_by_password
:是否以向后兼容的方式记录CREATE / ALTER USER,GRANT
log_slave_updates
:从属服务器是否应将其SQL线程执行的更新记录到其自己的二进制日志中。
只读;
使用--log-slave-updates服务器选项设置。
log_statements_unsafe_for_binlog
:禁用错误1592警告写入错误日志
master-info-file
:记住主服务器的文件的位置和名称以及I / O复制线程在主服务器的二进制日志中的位置
master-info-repository
:是否将主服务器的二进制日志中的主状态信息和复制I / O线程位置写入文件或表
master-retry-count
:从站在放弃之前连接到主站的尝试次数
master_info_repository
:是否将主服务器的二进制日志中的主状态信息和复制I / O线程位置写入文件或表
max_relay_log_size
:如果非零,则当其大小超过此值时,会自动轮换中继日志。
如果为零,则发生旋转的大小由max_binlog_size的值确定。
original_commit_timestamp
:在原始主服务器上提交事务的时间
immediate_server_version
:作为复制拓扑中的直接主服务器的服务器的MySQL服务器版本号
original_server_version
:最初提交事务的服务器的MySQL Server版本号
relay-log
:用于中继日志的位置和基本名称
relay-log-index
:用于保存最后一个中继日志列表的文件的位置和名称
relay-log-info-file
:记住SQL复制线程在中继日志中的位置的文件的位置和名称
relay-log-info-repository
:是否将复制SQL线程在中继日志中的位置写入文件或表
relay-log-recovery
:启用时从主服务器启用自动恢复中继日志文件
relay_log_basename
:中继日志的完整路径,包括文件名
relay_log_index
:中继日志索引文件的名称
relay_log_info_file
:从站记录有关中继日志的信息的文件的名称
relay_log_info_repository
:是否将复制SQL线程在中继日志中的位置写入文件或表
relay_log_purge
:确定是否清除中继日志
relay_log_recovery
:是否启用了在启动时从主服务器自动恢复中继日志文件;
必须启用崩溃安全从站
relay_log_space_limit
:所有中继日志使用的最大空间
replicate-do-db
:告诉从属SQL线程限制复制到指定的数据库
replicate-do-table
:告诉从属SQL线程将复制限制到指定的表
replicate-ignore-db
:告诉从属SQL线程不要复制到指定的数据库
replicate-ignore-table
:告诉从属SQL线程不要复制到指定的表
replicate-rewrite-db
:使用与原始名称不同的名称更新数据库
replicate-same-server-id
:在复制中,如果启用,请不要跳过具有我们服务器ID的事件
replicate-wild-do-table
:告诉从属线程将复制限制为与指定通配符模式匹配的表
replicate-wild-ignore-table
:告诉从属线程不要复制到与给定通配符模式匹配的表
report-host
:从站注册期间向主站报告的从站的主机名或IP
report-password
:从服务器应向主服务器报告的任意密码。
与MySQL复制用户帐户的密码不同。
report-port
:从站注册期间连接到从站报告给主站的端口
report-user
:从服务器应向主服务器报告的任意用户名。
与MySQL复制用户帐户使用的名称不同。
Rpl_semi_sync_master_clients
:半同步从站的数量
rpl_semi_sync_master_enabled
:是否在主服务器上启用了半同步复制
Rpl_semi_sync_master_net_avg_wait_time
:主设备等待从设备回复的平均时间
Rpl_semi_sync_master_net_wait_time
:主人等待奴隶回复的总时间
Rpl_semi_sync_master_net_waits
:主服务器等待从服务器回复的总次数
Rpl_semi_sync_master_no_times
:主服务器关闭半同步复制的次数
Rpl_semi_sync_master_no_tx
:未成功确认的提交数
Rpl_semi_sync_master_status
:是否可以在主服务器上运行半同步复制
Rpl_semi_sync_master_timefunc_failures
:调用时间函数时主服务器失败的次数
rpl_semi_sync_master_timeout
:等待从机确认的毫秒数
rpl_semi_sync_master_trace_level
:主服务器上的半同步复制调试跟踪级别
Rpl_semi_sync_master_tx_avg_wait_time
:主人等待每笔交易的平均时间
Rpl_semi_sync_master_tx_wait_time
:主服务器等待事务的总时间
Rpl_semi_sync_master_tx_waits
:主服务器等待事务的总次数
rpl_semi_sync_master_wait_for_slave_count
:在继续之前,主服务器必须接收多少个从属确认
rpl_semi_sync_master_wait_no_slave
:即使没有奴隶,主人是否等待超时
rpl_semi_sync_master_wait_point
:从事交易收据确认的等待点
Rpl_semi_sync_master_wait_pos_backtraverse
:主服务器等待二进制坐标低于先前等待事件的事件的总次数
Rpl_semi_sync_master_wait_sessions
:当前正在等待从属回复的会话数
Rpl_semi_sync_master_yes_tx
:成功确认的提交数
rpl_semi_sync_slave_enabled
:是否在从属上启用了半同步复制
Rpl_semi_sync_slave_status
:半同步复制是否可在从站上运行
rpl_semi_sync_slave_trace_level
:从属服务器上的半同步复制调试跟踪级别
rpl_read_size
:设置从二进制日志文件和中继日志文件中读取的最小数据量(以字节为单位)
rpl_stop_slave_timeout
:设置STOP SLAVE在超时之前等待的秒数
server_uuid
:服务器启动时自动(重新)生成的服务器全局唯一ID
show-slave-auth-info
:在此主站的SHOW SLAVE HOSTS中显示用户名和密码
skip-slave-start
:如果设置,slave不会自动启动
slave-checkpoint-group
:在调用检查点操作以更新进度状态之前,多线程从属服务器处理的最大事务数。
NDB群集不支持。
slave-checkpoint-period
:在此毫秒数后更新多线程从站的进度状态并将中继日志信息刷新到磁盘。
NDB群集不支持。
slave-load-tmpdir
:复制LOAD DATA语句时从属服务器应放置其临时文件的位置
slave-max-allowed-packet
:可以从复制主服务器发送到从服务器的数据包的最大大小(以字节为单位);
覆盖max_allowed_packet
slave_net_timeout
:在中止读取之前等待来自主/从连接的更多数据的秒数
slave-parallel-type
:告诉从属服务器使用时间戳信息(LOGICAL_CLOCK)或数据库分区(DATABASE)来并行化事务。
默认值为LOGICAL_CLOCK。
slave-parallel-workers
:并行执行复制事务的应用程序线程数。
默认值为4个应用程序线程。
设置为0以禁用从属多线程。
MySQL Cluster不支持。
slave-pending-jobs-size-max
:包含尚未应用的事件的从属工作队列的最大大小
slave-rows-search-algorithms
:确定用于从站更新批处理的搜索算法。
列表INDEX_SEARCH,TABLE_SCAN,HASH_SCAN中的任何2或3
slave-skip-errors
:当查询从提供的列表中返回错误时,告诉从属线程继续复制
slave_checkpoint_group
:在调用检查点操作以更新进度状态之前,多线程从属服务器处理的最大事务数。
NDB群集不支持。
slave_checkpoint_period
:在此毫秒数后更新多线程从站的进度状态并将中继日志信息刷新到磁盘。
NDB群集不支持。
slave_compressed_protocol
:在主/从协议上使用压缩
slave_exec_mode
:允许在IDEMPOTENT模式(键和其他一些被抑制的错误)和STRICT模式之间切换从属线程;
STRICT模式是默认设置,但NDB Cluster除外,其中始终使用IDEMPOTENT
Slave_heartbeat_period
:从属的复制心跳间隔,以秒为单位
Slave_last_heartbeat
:以TIMESTAMP格式显示收到最新心跳信号的时间
slave_max_allowed_packet
:可以从复制主服务器发送到从服务器的数据包的最大大小(以字节为单位);
覆盖max_allowed_packet
Slave_open_temp_tables
:从属SQL线程当前打开的临时表的数量
slave_parallel_type
:告诉从属服务器使用时间戳信息(LOGICAL_CLOCK)或数据库分区(DATABASE)来并行化事务。
slave_parallel_workers
:并行执行复制事务的应用程序线程数。
值为0将禁用从属多线程。
MySQL Cluster不支持。
slave_pending_jobs_size_max
:包含尚未应用的事件的从属工作队列的最大大小
slave_preserve_commit_order
:确保从属工作程序的所有提交都与主服务器上的顺序相同,以便在使用并行应用程序线程时保持一致性。
Slave_received_heartbeats
:自上次重置以来复制从站接收的心跳数
Slave_retried_transactions
:自启动以来复制从属SQL线程已重试事务的总次数
slave_rows_search_algorithms
:确定用于从站更新批处理的搜索算法。
列表INDEX_SEARCH,TABLE_SCAN,HASH_SCAN中的任何2或3。
Slave_rows_last_search_algorithm_used
:此从属服务器最近使用的搜索算法,用于查找基于行的复制(索引,表或散列扫描)的行
Slave_running
:此服务器的状态作为复制从属(从属I / O线程状态)
slave_transaction_retries
:从属SQL线程重试事务的次数,以防止在发生和停止之前发生死锁或锁定等待超时失败
slave_type_conversions
:控制复制从属上的类型转换模式。
值是列表中零个或多个元素的列表:ALL_LOSSY,ALL_NON_LOSSY。
设置为空字符串以禁止主服务器和从服务器之间的类型转换。
sql_log_bin
:控制当前会话的二进制日志记录
sql_slave_skip_counter
:从服务器应跳过的主服务器的事件数。
与GTID复制不兼容。
sync_binlog
:每次#th事件后,将二进制日志同步刷新到磁盘
sync_master_info
:在每个#th事件后将master.info同步到磁盘
sync_relay_log
:每次#th事件后将中继日志同步到磁盘
sync_relay_log_info
:在每个#th事件后将relay.info文件同步到磁盘
transaction_write_set_extraction
:定义用于散列在事务期间提取的写入的算法
以下列表中的命令行选项和系统变量与二进制日志有关。 第17.1.6.4节“二进制日志选项和变量” 提供了有关 二进制日志记录的选项和变量的 更多详细信息。 有关二进制日志的其他一般信息,请参见 第5.4.4节“二进制日志” 。
binlog-checksum
:启用/禁用二进制日志校验和
binlog-do-db
:限制二进制日志记录到特定数据库
binlog_format
:指定二进制日志的格式
binlog-ignore-db
:告诉主服务器不应将对给定数据库的更新记录到二进制日志中
binlog-row-event-max-size
:二进制日志最大事件大小
binlog_encryption
:为此服务器上的二进制日志文件和中继日志文件启用加密
binlog_rotate_encryption_master_key_at_startup
:在服务器启动时旋转二进制日志主密钥
Binlog_cache_disk_use
:使用临时文件而不是二进制日志缓存的事务数
binlog_cache_size
:用于在事务期间保存二进制日志的SQL语句的高速缓存大小
Binlog_cache_use
:使用临时二进制日志缓存的事务数
binlog_checksum
:启用/禁用二进制日志校验和
binlog_direct_non_transactional_updates
:使用语句格式更新非事务引擎直接写入二进制日志。
使用前请参阅文档。
binlog_error_action
:控制服务器无法写入二进制日志时发生的情况
binlog_group_commit_sync_delay
:设置在将事务同步到磁盘之前等待的微秒数
binlog_group_commit_sync_no_delay_count
:设置在中止binlog_group_commit_sync_delay指定的当前延迟之前要等待的最大事务数
binlog_max_flush_queue_time
:在刷新到二进制日志之前读取事务的时间
binlog_order_commits
:是否以与写入二进制日志相同的顺序提交
binlog_row_image
:记录行更改时使用完整或最小图像
binlog_row_metadata
:配置使用基于行的日志记录时记录的表相关元数据二进制文件的数量。
binlog_row_value_options
:为基于行的复制启用部分JSON更新的二进制日志记录。
binlog_rows_query_log_events
:启用时,在使用基于行的日志记录时启用行查询日志事件。
默认情况下禁用。
为5.6之前的从站/阅读器生成日志时不要启用。
Binlog_stmt_cache_disk_use
:使用临时文件而不是二进制日志语句缓存的非事务性语句的数量
binlog_stmt_cache_size
:用于在事务期间保存二进制日志的非事务性语句的高速缓存大小
Binlog_stmt_cache_use
:使用临时二进制日志语句缓存的语句数
binlog_transaction_dependency_tracking
:依赖关系信息的来源(提交时间戳或事务写入集),从中可以评估slave的多线程应用程序可以并行执行哪些事务。
binlog_transaction_dependency_history_size
:为查找上次更新某行的事务而保留的行哈希数。
Com_show_binlog_events
:SHOW BINLOG EVENTS陈述的计数
Com_show_binlogs
:SHOW BINLOGS语句的计数
log-bin-use-v1-row-events
:使用版本1二进制日志行事件
log_bin_basename
:二进制日志文件的路径和基本名称
log_bin_use_v1_row_events
:显示服务器是否正在使用版本1二进制日志行事件
master-verify-checksum
:导致master从二进制日志中读取时检查校验和
master_verify_checksum
:导致master从二进制日志中读取校验和
max-binlog-dump-events
:mysql-test用于调试和复制测试的选项
max_binlog_cache_size
:可用于限制用于缓存多语句事务的总大小
max_binlog_size
:当大小超过此值时,二进制日志将自动旋转
max_binlog_stmt_cache_size
:可用于限制用于在事务期间缓存所有非事务性语句的总大小
slave-sql-verify-checksum
:导致slave从中继日志中读取时检查校验和
slave_sql_verify_checksum
:导致slave从中继日志中读取时检查校验和
sporadic-binlog-dump-fail
:mysql-test用于调试和复制测试的选项
有关 mysqld 使用 的 所有 命令行选项,系统和状态变量 的列表 ,请参见 第5.1.4节“服务器选项,系统变量和状态变量参考” 。
本节介绍可在复制主服务器上使用的服务器选项和系统变量。
您可以在
命令行
或
选项文件
中指定
选项
。
您可以使用指定系统变量值
SET
。
在主服务器和每个从服务器上,必须使用该
server-id
选项来建立唯一的复制ID。
对于每个服务器,您应该选择1到2
32
- 1
范围内的唯一正整数
,并且每个ID必须与任何其他复制主服务器或从服务器使用的每个其他ID不同。
示例:
server-id=3
。
有关主站用于控制二进制日志 记录的选项 ,请参见 第17.1.6.4节“二进制日志记录选项和变量” 。
以下列表描述了用于控制复制主服务器的启动选项。 与复制相关的系统变量将在本节后面讨论。
属性 | 值 |
---|---|
命令行格式 | --show-slave-auth-info[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
SHOW SLAVE HOSTS
在主服务器
的输出中显示从属用户名和密码,
用于以
--report-user
和和
--report-password
选项
启动的从属服务器
。
以下系统变量用于复制主机或由复制主机使用:
属性 | 值 |
---|---|
命令行格式 | --auto-increment-increment=# |
系统变量 | auto_increment_increment |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 1 |
最低价值 | 1 |
最大价值 | 65535 |
auto_increment_increment
并且
auto_increment_offset
旨在用于主 - 主复制,并可用于控制
AUTO_INCREMENT
列
的操作
。
两个变量都具有全局值和会话值,并且每个变量都可以采用介于1和65,535之间的整数值。
将这两个变量中的任何一个的值设置为0会导致其值设置为1。
尝试将这两个变量中的任何一个的值设置为大于65,535或小于0的整数会导致其值设置为65,535。
试图设置
auto_increment_increment
或
的值
auto_increment_offset
到非整数值会产生错误,并且变量的实际值保持不变。
从MySQL 8.0.14开始,设置此系统变量的会话值是一种受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
auto_increment_increment
也支持与
NDB
表
一起使用
。
在服务器上启动组复制时,值
auto_increment_increment
将更改为值
group_replication_auto_increment_increment
,默认值为7,值
auto_increment_offset
更改为服务器ID。
停止组复制时,将还原更改。
这些变化只发和恢复,如果
auto_increment_increment
和
auto_increment_offset
各有如果他们的价值已经从默认修改1.缺省值,组复制不会改变它们。
从MySQL 8.0开始,当组复制处于单主模式时,系统变量也不会被修改,其中只有一个服务器写入。
auto_increment_increment
并
auto_increment_offset
影响
AUTO_INCREMENT
列行为,如下所示:
auto_increment_increment
控制连续列值之间的间隔。
例如:
MySQL的>SHOW VARIABLES LIKE 'auto_inc%';
+ -------------------------- + ------- + | Variable_name | 价值| + -------------------------- + ------- + | auto_increment_increment | 1 | | auto_increment_offset | 1 | + -------------------------- + ------- + 2行(0.00秒) mysql>CREATE TABLE autoinc1
- >(col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
查询正常,0行受影响(0.04秒) MySQL的>SET @@auto_increment_increment=10;
查询正常,0行受影响(0.00秒) MySQL的>SHOW VARIABLES LIKE 'auto_inc%';
+ -------------------------- + ------- + | Variable_name | 价值| + -------------------------- + ------- + | auto_increment_increment | 10 | | auto_increment_offset | 1 | + -------------------------- + ------- + 2行(0.01秒) MySQL的>INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);
查询OK,4行受影响(0.00秒) 记录:4个重复:0警告:0 MySQL的>SELECT col FROM autoinc1;
+ ----- + | col | + ----- + | 1 | | 11 | | 21 | | 31 | + ----- + 4行(0.00秒)
auto_increment_offset
确定
AUTO_INCREMENT
列值
的起点
。
请考虑以下情况,假设这些语句在与以下描述中给出的示例相同的会话期间执行
auto_increment_increment
:
MySQL的>SET @@auto_increment_offset=5;
查询正常,0行受影响(0.00秒) MySQL的>SHOW VARIABLES LIKE 'auto_inc%';
+ -------------------------- + ------- + | Variable_name | 价值| + -------------------------- + ------- + | auto_increment_increment | 10 | | auto_increment_offset | 5 | + -------------------------- + ------- + 2行(0.00秒) mysql>CREATE TABLE autoinc2
- >(col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
查询正常,0行受影响(0.06秒) MySQL的>INSERT INTO autoinc2 VALUES (NULL), (NULL), (NULL), (NULL);
查询OK,4行受影响(0.00秒) 记录:4个重复:0警告:0 MySQL的>SELECT col FROM autoinc2;
+ ----- + | col | + ----- + | 5 | | 15 | | 25 | | 35 | + ----- + 4行(0.02秒)
当值
auto_increment_offset
大于
auto_increment_increment
的值时,
auto_increment_offset
忽略
值
。
如果更改了这些变量中的任何一个,然后将新行插入到包含
AUTO_INCREMENT
列
的表中
,则结果可能看似违反直觉,因为
AUTO_INCREMENT
计算
一系列
值时不考虑列中已存在的任何值,并且插入的下一个值是系列中的最小值大于
AUTO_INCREMENT
列中
的最大现有值
。
该系列计算如下:
auto_increment_offset
+
N
×
auto_increment_increment
where
N
是系列[1,2,3,...]中的正整数值。
例如:
MySQL的>SHOW VARIABLES LIKE 'auto_inc%';
+ -------------------------- + ------- + | Variable_name | 价值| + -------------------------- + ------- + | auto_increment_increment | 10 | | auto_increment_offset | 5 | + -------------------------- + ------- + 2行(0.00秒) MySQL的>SELECT col FROM autoinc1;
+ ----- + | col | + ----- + | 1 | | 11 | | 21 | | 31 | + ----- + 4行(0.00秒) MySQL的>INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);
查询OK,4行受影响(0.00秒) 记录:4个重复:0警告:0 MySQL的>SELECT col FROM autoinc1;
+ ----- + | col | + ----- + | 1 | | 11 | | 21 | | 31 | | 35 | | 45 | | 55 | | 65 | + ----- + 8行(0.00秒)
显示的值
auto_increment_increment
和
auto_increment_offset
生成系列5 +
N
×10,即[5,15,25,35,45,...]。
在
col
列之前
的
列中
出现的最高值为
INSERT
31,并且该
AUTO_INCREMENT
系列中
的下一个可用值为
35,因此插入的值
col
在该点开始,结果如
SELECT
查询
所示
。
不可能将这两个变量的影响限制在一个表中;
这些变量控制
MySQL服务器上
所有
表
中所有
AUTO_INCREMENT
列
的行为
。
如果设置了任一变量的全局值,则通过设置会话值或直到
重新启动
mysqld
,其效果将持续到全局值更改或覆盖为止
。
如果设置了本地值,则新值将影响
当前用户在会话期间向其插入新行的所有表的列,除非在该会话期间更改了值。
AUTO_INCREMENT
默认值为
auto_increment_increment
1.请参见
第17.4.1.1节“复制和AUTO_INCREMENT”
。
属性 | 值 |
---|---|
命令行格式 | --auto-increment-offset=# |
系统变量 | auto_increment_offset |
范围 | 全球,会议 |
动态 | 是 |
SET_VAR
提示适用
|
是 |
类型 | 整数 |
默认值 | 1 |
最低价值 | 1 |
最大价值 | 65535 |
此变量的默认值为1.如果保留其默认值,并且在多主模式下在服务器上启动组复制,则会将其更改为服务器ID。
有关更多信息,请参阅说明
auto_increment_increment
。
从MySQL 8.0.14开始,设置此系统变量的会话值是一种受限制的操作。 会话用户必须具有足以设置受限会话变量的权限。 请参见 第5.1.9.1节“系统变量权限” 。
auto_increment_offset
也支持与
NDB
表
一起使用
。
属性 | 值 |
---|---|
介绍 | 8.0.14 |
系统变量 | immediate_server_version |
范围 | 会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
供复制内部使用。
此会话系统变量保存服务器的MySQL服务器版本号,该服务器是复制拓扑中的直接主服务器(例如,
80014
对于MySQL 8.0.14服务器实例)。
如果此即时服务器处于不支持会话系统变量的发行版中,则该变量的值将设置为0(
UNKNOWN_SERVER_VERSION
)。
变量的值从主服务器复制到从服务器。
利用此信息,从属设备可以通过识别所涉及的版本之间发生语法更改或语义更改的位置并适当地处理这些数据,来正确处理源自旧版本的主数据的数据。
此信息还可以在组复制环境中使用,其中复制组的一个或多个成员处于比其他成员更新的版本。
可以在二进制日志中查看每个事务的变量值(作为
Gtid_log_event
,或的
一部分)
Anonymous_gtid_log_event
如果GTID没有在服务器上使用),并且可能有助于调试跨版本复制问题。
设置此系统变量的会话值是受限制的操作。 请参见 第5.1.9.1节“系统变量权限” 。 但是,请注意该变量不是供用户设置的; 它由复制基础结构自动设置。
属性 | 值 |
---|---|
介绍 | 8.0.14 |
系统变量 | original_server_version |
范围 | 会议 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
供复制内部使用。
此会话系统变量保存最初提交事务的服务器的MySQL Server版本号(例如,
80014
对于MySQL 8.0.14服务器实例)。
如果此原始服务器处于不支持会话系统变量的发行版中,则该变量的值将设置为0(
UNKNOWN_SERVER_VERSION
)。
请注意,当原始服务器设置版本号时,如果复制拓扑中的直接服务器或任何其他中间服务器不支持会话系统变量,则变量的值将重置为0,因此不会复制其值。
以与
immediate_server_version
系统变量
相同的方式设置和使用
变量的值。
如果变量的值与
immediate_server_version
系统变量
的值相同
,则只有后者记录在二进制日志中,并指示原始服务器版本相同。
在组复制环境中,视图更改日志事件(即新成员加入组时由每个组成员排队的特殊事务)使用排队事务的组成员的服务器版本进行标记。 这确保了加入成员已知原始捐赠者的服务器版本。 由于排队等待特定视图更改的视图更改日志事件在所有成员上具有相同的GTID,因此仅对于此情况,同一GTID的实例可能具有不同的原始服务器版本。
设置此系统变量的会话值是受限制的操作。 请参见 第5.1.9.1节“系统变量权限” 。 但是,请注意该变量不是供用户设置的; 它由复制基础结构自动设置。
属性 | 值 |
---|---|
命令行格式 | --rpl-semi-sync-master-enabled[={OFF|ON}] |
系统变量 | rpl_semi_sync_master_enabled |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | OFF |
控制是否在主服务器上启用半同步复制。
要启用或禁用插件,请将此变量
分别
设置为
ON
或
OFF
(或1或0)。
默认是
OFF
。
仅当安装了主端半同步复制插件时,此变量才可用。
属性 | 值 |
---|---|
命令行格式 | --rpl-semi-sync-master-timeout=# |
系统变量 | rpl_semi_sync_master_timeout |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 10000 |
一个以毫秒为单位的值,用于控制主机在超时并恢复到异步复制之前等待提交来自从机的确认的时间。 默认值为10000(10秒)。
仅当安装了主端半同步复制插件时,此变量才可用。
rpl_semi_sync_master_trace_level
属性 | 值 |
---|---|
命令行格式 | --rpl-semi-sync-master-trace-level=# |
系统变量 | rpl_semi_sync_master_trace_level |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 32 |
主服务器上的半同步复制调试跟踪级别。 定义了四个级别:
1 =一般级别(例如,时间函数失败)
16 =详细程度(更详细的信息)
32 =净等待级别(有关网络等待的更多信息)
64 =功能级别(有关功能进入和退出的信息)
仅当安装了主端半同步复制插件时,此变量才可用。
rpl_semi_sync_master_wait_for_slave_count
属性 | 值 |
---|---|
命令行格式 | --rpl-semi-sync-master-wait-for-slave-count=# |
系统变量 | rpl_semi_sync_master_wait_for_slave_count |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 1 |
最低价值 | 1 |
最大价值 | 65535 |
主服务器必须在继续之前必须接收的从服务确认数。
缺省情况下
rpl_semi_sync_master_wait_for_slave_count
是
1
,这意味着接收一个从机确认之后半同步复制进行。
性能最适合此变量的小值。
例如,如果
rpl_semi_sync_master_wait_for_slave_count
是
2
,那么2个从属服务器必须在
rpl_semi_sync_master_timeout
为半同步复制
配置的超时时间段之前确认收到事务
。
如果较少的从站在超时期间确认收到了该事务,则主站将恢复正常复制。
这种行为也取决于
rpl_semi_sync_master_wait_no_slave
仅当安装了主端半同步复制插件时,此变量才可用。
rpl_semi_sync_master_wait_no_slave
属性 | 值 |
---|---|
命令行格式 | --rpl-semi-sync-master-wait-no-slave[={OFF|ON}] |
系统变量 | rpl_semi_sync_master_wait_no_slave |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
控制主服务器是否等待配置的超时时间
rpl_semi_sync_master_timeout
到期,即使从属计数降至小于
超时期间配置
的从属数量
rpl_semi_sync_master_wait_for_slave_count
。
当的值
rpl_semi_sync_master_wait_no_slave
是
ON
(缺省值),用于从属计数下降到小于它是允许
rpl_semi_sync_master_wait_for_slave_count
在超时期限内。
只要有足够的从服务器在超时期限到期之前确认事务,就会继续进行半同步复制。
当的值
rpl_semi_sync_master_wait_no_slave
是
OFF
,如果从计数下降到小于配置在数
rpl_semi_sync_master_wait_for_slave_count
期间由配置的超时时间段在任何时候
rpl_semi_sync_master_timeout
,主恢复到正常的复制。
仅当安装了主端半同步复制插件时,此变量才可用。
rpl_semi_sync_master_wait_point
属性 | 值 |
---|---|
命令行格式 | --rpl-semi-sync-master-wait-point=value |
系统变量 | rpl_semi_sync_master_wait_point |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 列举 |
默认值 | AFTER_SYNC |
有效值 |
|
此变量控制半同步复制主机在将状态返回到提交事务的客户机之前等待事务接收的从机确认的点。 允许这些值:
AFTER_SYNC
(默认值):主服务器将每个事务写入其二进制日志和从服务器,并将二进制日志同步到磁盘。
主机在同步后等待从机确认事务接收。
收到确认后,主服务器将事务提交给存储引擎并将结果返回给客户端,然后客户端可以继续。
AFTER_COMMIT
:主服务器将每个事务写入其二进制日志和从服务器,同步二进制日志,并将事务提交到存储引擎。
提交后,主设备等待事务接收的从设备确认。
收到确认后,主服务器将结果返回给客户端,然后客户端可以继续。
这些设置的复制特征如下:
使用时
AFTER_SYNC
,所有客户端同时看到已提交的事务:从服务器确认并提交到主服务器上的存储引擎之后。
因此,所有客户端都在主服务器上看到相同的数据。
如果主站发生故障,则在主站上提交的所有事务都已复制到从站(保存到其中继日志)。 主服务器和故障转移到从服务器的崩溃是无损的,因为从服务器是最新的。 但请注意,在此方案中无法重新启动主服务器并且必须将其丢弃,因为其二进制日志可能包含未提交的事务,这些事务会在二进制日志恢复后外部化时导致与从服务器冲突。
使用
AFTER_COMMIT
,发出事务的客户端仅在服务器提交到存储引擎并接收从属确认后才获得返回状态。
在提交之后和从属确认之前,其他客户端可以在提交客户端之前查看已提交的事务。
如果出现问题导致从设备不处理事务,那么在主设备崩溃和故障转移到从设备的情况下,这些客户端可能会看到相对于他们在主设备上看到的数据丢失。
仅当安装了主端半同步复制插件时,此变量才可用。
随着
rpl_semi_sync_master_wait_point
MySQL 5.7的增加,创建了版本兼容性约束,因为它增加了半同步接口版本:MySQL 5.7及更高版本的服务器不能与旧版本的半同步复制插件一起使用,旧版本的服务器也不能与半同步复制插件一起使用适用于MySQL
5.7及更高版本。
本节介绍适用于从属复制服务器的服务器选项和系统变量,并包含以下内容:
在
命令行
或
选项文件
中指定
选项
。
使用该
CHANGE
MASTER TO
语句
可以在服务器运行时设置许多选项
。
使用指定系统变量值
SET
。
服务器ID。
在主服务器和每个从服务器上,必须使用该
server-id
选项来建立1到2
32
到1之间的唯一复制ID
。
“
唯一
”
表示每个ID必须与任何其他复制主服务器使用的每个其他ID不同或奴隶。
示例
my.cnf
文件:
的[mysqld] 服务器ID = 3
本节介绍用于控制复制从属服务器的启动选项。
通过使用该
CHANGE
MASTER TO
语句,
可以在服务器运行时设置其中许多选项
。
其他
--replicate-*
选项
(例如
选项)只能在从属服务器启动时设置。
与复制相关的系统变量将在本节后面讨论。
属性 | 值 |
---|---|
命令行格式 | --log-slave-updates[={OFF|ON}] |
系统变量 | log_slave_updates |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 (> = 8.0.3) | ON |
默认值 (<= 8.0.2) | OFF |
此选项使从服务器写入更新,这些更新是从主服务器接收的,并由从服务器的SQL线程执行到从属的自己的二进制日志。
--log-bin
必须在从站上启用由选项
控制
并且默认启用的
二进制日志记录,以便记录
更新。
--log-slave-updates
默认情况下启用,除非您指定
--skip-log-bin
禁用二进制日志记录,在这种情况下,MySQL还会默认禁用从站更新日志记录。
如果在启用二进制日志记录时需要禁用从站更新日志记录,请指定
--skip-log-slave-updates
。
--log-slave-updates
使复制服务器可以链接。
例如,您可能希望使用以下安排设置复制服务器:
A - > B - > C.
在这里,
A
作为奴隶的主人
B
,并
B
作为奴隶的主人
C
。
为此,
B
必须是主人
和
奴隶。
通过二进制日志记录和
--log-slave-updates
启用选项(默认设置),接收到的更新
A
将记录
B
到其二进制日志中,因此可以传递给
C
。
属性 | 值 |
---|---|
命令行格式 | --master-info-file=file_name |
类型 | 文件名 |
默认值 | master.info |
主信息日志的名称,如果
--master-info-repository=FILE
已设置。
默认名称
master.info
位于数据目录中。
--master-info-repository=FILE
现已弃用。
有关主信息日志的信息,请参见
第17.2.4.2节“从属状态日志”
。
属性 | 值 |
---|---|
命令行格式 | --master-retry-count=# |
弃用 | 是 |
类型 | 整数 |
默认值 | 86400 |
最低价值 | 0 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
在放弃之前,从设备尝试重新连接到主设备的次数。
默认值为86400次。
值0表示
“
无限
”
,从站尝试永久连接。
当从站达到其连接超时(由
--slave-net-timeout
选项
指定
)而不接收来自主站的数据或心跳信号
时,将触发重新连接尝试
。
MASTER_CONNECT_RETRY
按照
CHANGE
MASTER TO
语句
选项
设置的间隔尝试重新连接
(默认为每60秒)。
此选项已弃用,将在以后的MySQL版本中删除。
请改用
语句
MASTER_RETRY_COUNT
选项
CHANGE
MASTER
TO
。
属性 | 值 |
---|---|
命令行格式 | --max-relay-log-size=# |
系统变量 | max_relay_log_size |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大价值 | 1073741824 |
服务器自动轮换中继日志文件的大小。
如果此值非零,则当其大小超过此值时,将自动轮换中继日志。
如果此值为零(默认值),则中继日志轮换发生的大小由值决定
max_binlog_size
。
有关更多信息,请参见
第17.2.4.1节“从站中继日志”
。
属性 | 值 |
---|---|
命令行格式 | --relay-log=file_name |
系统变量 | relay_log |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
中继日志的基本名称。 服务器通过向基本名称添加数字后缀来按顺序创建中继日志文件。
对于默认复制通道,中继日志的默认基本名称是
使用主机名称。
对于非默认复制通道,中继日志的默认基本名称是
,
此中继日志中记录的复制通道的名称。
host_name
-relay-binhost_name
-relay-bin-channel
channel
中继日志文件的默认位置是数据目录。
您可以使用该
--relay-log
选项指定备用位置,方法是在基本名称中添加前导绝对路径名以指定其他目录。
复制服务器上的中继日志和中继日志索引的名称不能与二进制日志和二进制日志索引相同,其名称由
--log-bin
和
--log-bin-index
选项
指定
。
服务器发出错误消息,如果二进制日志和中继日志文件基本名称相同,则不会启动。
由于MySQL解析服务器选项的方式,如果指定此选项,则必须提供值;
仅当未实际指定选项时才使用默认基本名称
。
如果在
--relay-log
未指定值的情况下
使用该
选项,则可能会导致意外行为;
此行为取决于使用的其他选项,指定它们的顺序,以及它们是在命令行还是在选项文件中指定的。
有关MySQL如何处理服务器选项的更多信息,请参见
第4.2.2节“指定程序选项”
。
如果指定此选项,则指定的值也将用作中继日志索引文件的基本名称。
您可以通过使用该
--relay-log-index
选项
指定其他中继日志索引文件基本名称来覆盖此行为
。
当服务器从索引文件中读取条目时,它会检查条目是否包含相对路径。
如果是,则使用该
--relay-log
选项
将路径的相对部分替换为设置的绝对路径
。
绝对路径保持不变;
在这种情况下,必须手动编辑索引以启用新路径。
以前,每次重定位二进制日志或中继日志文件时都需要手动干预。
(Bug#11745230,Bug#12133)
您可能会发现该
--relay-log
选项对执行以下任务很有用:
创建名称独立于主机名的中继日志。
如果您需要将中继日志放在数据目录以外的某个区域,因为您的中继日志往往非常大并且您不想减少
max_relay_log_size
。
通过在磁盘之间使用负载平衡来提高速度。
您可以从
relay_log_basename
系统变量中
获取中继日志文件名(和路径)
。
属性 | 值 |
---|---|
命令行格式 | --relay-log-index=file_name |
系统变量 | relay_log_index |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 文件名 |
中继日志索引文件的名称。
如果未指定该
--relay-log-index
选项,但
指定了该
选项,
--relay-log
则其值将用作中继日志索引文件的缺省基本名称。
如果
--relay-log
未指定
该
选项,则对于默认复制通道,默认名称为
,使用主机名称。
对于非默认复制通道,默认名称为
,其中
是此中继日志索引中记录的复制通道的名称。
host_name
-relay-bin.indexhost_name
-relay-bin-channel
.indexchannel
中继日志文件的缺省位置是数据目录,或使用该
--relay-log
选项
指定的任何其他位置
。
您可以使用该
--relay-log-index
选项指定备用位置,方法是在基本名称中添加前导绝对路径名以指定其他目录。
复制服务器上的中继日志和中继日志索引的名称不能与二进制日志和二进制日志索引相同,其名称由
--log-bin
和
--log-bin-index
选项
指定
。
服务器发出错误消息,如果二进制日志和中继日志文件基本名称相同,则不会启动。
由于MySQL解析服务器选项的方式,如果指定此选项,则必须提供值;
仅当未实际指定选项时才使用默认基本名称
。
如果在
--relay-log-index
未指定值的情况下
使用该
选项,则可能会导致意外行为;
此行为取决于使用的其他选项,指定它们的顺序,以及它们是在命令行还是在选项文件中指定的。
有关MySQL如何处理服务器选项的更多信息,请参见
第4.2.2节“指定程序选项”
。
--relay-log-info-file=
file_name
属性 | 值 |
---|---|
命令行格式 | --relay-log-info-file=file_name |
类型 | 文件名 |
默认值 | relay-log.info |
中继日志信息文件的名称,如果
--relay-log-info-repository
设置为FILE。
默认名称
relay-log.info
位于数据目录中。
--relay-log-info-repository=FILE
现已弃用。
有关中继日志信息日志的信息,请参见
第17.2.4.2节“从属状态日志”
。
属性 | 值 |
---|---|
命令行格式 | --relay-log-purge[={OFF|ON}] |
系统变量 | relay_log_purge |
范围 | 全球 |
动态 | 是 |
SET_VAR
提示适用
|
没有 |
类型 | 布尔 |
默认值 | ON |
一旦不再需要,就禁用或启用自动清除中继日志。
默认值为1(启用)。
这是一个可以动态更改的全局变量
。
使用该
选项
时禁用中继日志清除
可能会导致数据一致性,因此不会出现崩溃安全问题。
SET GLOBAL relay_log_purge =
N
--relay-log-recovery
属性 | 值 |
---|---|
命令行格式 | --relay-log-recovery[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
在服务器启动后立即启用自动中继日志恢复。 恢复过程会创建一个新的中继日志文件,将SQL线程位置初始化为此新的中继日志,并将I / O线程初始化为SQL线程位置。 然后继续从主站读取中继日志。 这应该在复制从站崩溃后使用,以确保不会处理可能损坏的中继日志。 默认值为0(禁用)。
要提供防碰撞从站,必须启用此选项(设置为1),
--relay-log-info-repository
必须将其设置为
TABLE
,并且
relay-log-purge
必须启用
此选项
。
启用
--relay-log-recovery
选项时,
relay-log-purge
被禁用的风险从没有清除文件中读取中继日志,从而导致数据不一致,因此是不会崩溃安全。
有关
详细信息,
请参阅
使复制适应意外暂停
。
使用多线程从站(换句话说
slave_parallel_workers
,大于0)时,从中继日志执行的事务序列中可能会出现间隙等不一致。
--relay-log-recovery
当存在不一致时
启用该
选项会导致错误,该选项无效。
这种情况下的解决方案是发布
START
SLAVE UNTIL SQL_AFTER_MTS_GAPS
,它使服务器处于更一致的状态,然后发出
RESET SLAVE
删除中继日志的问题。
有关
更多信息
,
请参见
第17.4.1.33节“复制和事务不一致”
。
属性 | 值 |
---|---|
命令行格式 | --relay-log-space-limit=# |
系统变量 | relay_log_space_limit |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大值 (64位平台) | 18446744073709551615 |
最大值 (32位平台) | 4294967295 |
此选项对从站上所有中继日志的总大小(以字节为单位)设置上限。
值为0表示
“
无限制
”
。
这对于磁盘空间有限的从属服务器主机很有用。
达到限制时,I / O线程将停止从主服务器读取二进制日志事件,直到SQL线程赶上并删除了一些未使用的中继日志。
请注意,此限制不是绝对的:在某些情况下,SQL线程在删除中继日志之前需要更多事件。
在这种情况下,I / O线程超出限制,直到SQL线程可以删除某些中继日志,因为不这样做会导致死锁。
您不应该设置
--relay-log-space-limit
为小于
--max-relay-log-size
(或
--max-binlog-size
如果)
的值的两倍
--max-relay-log-size
是0)。
在这种情况下,I / O线程有可能因为
--relay-log-space-limit
超出而
等待可用空间
,但SQL线程没有要清除的中继日志,并且无法满足I / O线程。
这会强制I / O线程
--relay-log-space-limit
暂时
忽略
。
属性 | 值 |
---|---|
命令行格式 | --replicate-do-db=name |
类型 | 串 |
使用数据库名称创建复制筛选器。
也可以使用这样的过滤器创建
CHANGE
REPLICATION FILTER REPLICATE_DO_DB
。
此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。
在名为
channel_1
use
的通道上配置通道特定的复制筛选器
。
在这种情况下,第一个冒号被解释为分隔符,随后的冒号是文字冒号。
有关
更多信息
,
请参见
第17.2.5.4节“基于复制通道的过滤器”
。
--replicate-do-db:
channel_1
:db_name
全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。
特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。
他们不能对使用
group_replication_applier
或
group_replication_recovery
通道。
此复制筛选器的确切效果取决于是使用基于语句还是基于行的复制。
基于语句的复制。
告诉从SQL线程限制复制到报表,其中默认的数据库(即,由选定的一个
USE
)是
db_name
。
要指定多个数据库,请多次使用此选项,每个数据库使用一次;
但是,这样做
不会
复制跨数据库语句,例如
在选择不同的数据库(或没有数据库)时。
UPDATE
some_db.some_table
SET
foo='bar'
要指定多个数据库, 必须 使用此选项的多个实例。 因为数据库名称可以包含逗号,所以如果提供以逗号分隔的列表,则该列表将被视为单个数据库的名称。
使用基于语句的复制时无法正常工作的示例:如果从属服务器启动
--replicate-do-db=sales
并且您在主服务器上发出以下语句,
UPDATE
则
不会
复制
语句
:
使用价格; 更新sales.january SET金额=金额+ 1000;
这种
“
仅检查默认数据库
”
行为的
主要原因
是,仅从语句中就很难知道是否应该复制它(例如,如果您使用多表
DELETE
语句或多表
UPDATE
语句跨多个数据库)。
如果不需要,只检查默认数据库而不是所有数据库也更快。
基于行的复制。
告诉从属SQL线程限制复制到数据库
db_name
。
只有属于的表
db_name
被更改;
当前数据库对此没有影响。
假设从属服务器启动
--replicate-do-db=sales
并且基于行的复制生效,然后在主服务器上运行以下语句:
使用价格; UPDATE sales.february SET amount = amount + 100;
从属数据库中
的
february
表
sales
根据
UPDATE
语句进行
更改
;
无论
USE
声明
是否
已发布,都会
发生这种情况
。
但是,在使用基于行的复制时,在主服务器上发出以下语句对从服务器没有影响,并且
--replicate-do-db=sales
:
使用价格; 更新price.march SET金额=金额-25;
即使声明
USE prices
改为
USE sales
,
UPDATE
声明的效果仍然不会被复制。
--replicate-do-db
对于引用多个数据库的语句,基于语句的复制与基于行的复制相比,处理方式的
另一个重要区别
。
假设从属服务器启动
--replicate-do-db=db1
,并在主服务器上执行以下语句:
使用db1; UPDATE db1.table1 SET col1 = 10,db2.table2 SET col2 = 20;
如果使用基于语句的复制,则会在从属服务器上更新这两个表。
但是,使用基于行的复制时,只会
table1
受到奴隶的影响;
因为
table2
是在不同的数据库中,
table2
所以奴隶不会被改变
UPDATE
。
现在假设
使用
USE db1
了一个
USE db4
语句
而不是
语句
:
使用db4; UPDATE db1.table1 SET col1 = 10,db2.table2 SET col2 = 20;
在这种情况下,
UPDATE
使用基于语句的复制时
,该
语句对从站没有影响。
但是,如果使用基于行的复制,
UPDATE
则会
table1
在从属服务器上进行
更改
,但不会
table2
-
但
也就是说,只
--replicate-do-db
更改
了名为的数据库中的表
,并且选择默认数据库对此行为没有影响。
如果需要跨数据库更新才能工作,请
改用。
请参见
第17.2.5节“服务器如何评估复制过滤规则”
。
--replicate-wild-do-table=
db_name
.%
此选项以
--binlog-do-db
影响二进制日志记录
的相同方式影响复制,
复制格式对
--replicate-do-db
影响复制行为的影响与对行为的日志记录格式的影响相同
--binlog-do-db
。
属性 | 值 |
---|---|
命令行格式 | --replicate-ignore-db=name |
类型 | 串 |
使用数据库名称创建复制筛选器。
也可以使用这样的过滤器创建
CHANGE
REPLICATION FILTER REPLICATE_IGNORE_DB
。
此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。
在名为
channel_1
use
的通道上配置通道特定的复制筛选器
。
在这种情况下,第一个冒号被解释为分隔符,随后的冒号是文字冒号。
有关
更多信息
,
请参见
第17.2.5.4节“基于复制通道的过滤器”
。
--replicate-ignore-db:
channel_1
:db_name
全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。
特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。
他们不能对使用
group_replication_applier
或
group_replication_recovery
通道。
要指定要忽略的多个数据库,请多次使用此选项,每个数据库使用一次。 因为数据库名称可以包含逗号,所以如果提供以逗号分隔的列表,则该列表将被视为单个数据库的名称。
与此同时
--replicate-do-db
,此过滤的确切效果取决于是使用基于语句还是基于行的复制,并在接下来的几段中进行了描述。
基于语句的复制。
告诉slave SQL线程不会复制任何声明,其中默认的数据库(即,由选定的一个
USE
)是
db_name
。
基于行的复制。
告诉从属SQL线程不更新数据库中的任何表
db_name
。
默认数据库无效。
使用基于语句的复制时,以下示例无法正常工作。
假设从属服务器启动
--replicate-ignore-db=sales
并在主服务器上发出以下语句:
使用价格; 更新sales.january SET金额=金额+ 1000;
该
UPDATE
声明
是
在这种情况下复制,因为
--replicate-ignore-db
只适用于默认数据库(由确定的
USE
语句)。
由于
sales
数据库是在语句中显式指定的,因此该语句尚未过滤。
但是,使用基于行的复制时,
UPDATE
语句的效果
不会
传播到从属,并且表的从属副本
sales.january
不会更改。
在这种情况下,
--replicate-ignore-db=sales
导致
对主副本中的表所做的
所有
更改
sales
数据库被奴隶忽略。
如果您使用跨数据库更新并且不希望复制这些更新,则不应使用此选项。 请参见 第17.2.5节“服务器如何评估复制过滤规则” 。
如果需要跨数据库更新才能工作,请
改用。
请参见
第17.2.5节“服务器如何评估复制过滤规则”
。
--replicate-wild-ignore-table=
db_name
.%
此选项以
--binlog-ignore-db
影响二进制日志记录
的相同方式影响复制,
复制格式对
--replicate-ignore-db
影响复制行为的影响与对行为的日志记录格式的影响相同
--binlog-ignore-db
。
--replicate-do-table=
db_name.tbl_name
属性 | 值 |
---|---|
命令行格式 | --replicate-do-table=name |
类型 | 串 |
通过告知从属SQL线程将复制限制到给定表来创建复制筛选器。
要指定多个表,请多次使用此选项,每个表使用一次。
与之相反,这适用于跨数据库更新和默认数据库更新
--replicate-do-db
。
请参见
第17.2.5节“服务器如何评估复制过滤规则”
。
您还可以通过发出
CHANGE
REPLICATION FILTER REPLICATE_DO_TABLE
语句
来创建此类过滤器
。
此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。
在名为
channel_1
use
的通道上配置通道特定的复制筛选器
。
在这种情况下,第一个冒号被解释为分隔符,随后的冒号是文字冒号。
有关
更多信息
,
请参见
第17.2.5.4节“基于复制通道的过滤器”
。
--replicate-do-table:
channel_1
:db_name.tbl_name
全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。
特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。
他们不能对使用
group_replication_applier
或
group_replication_recovery
通道。
此选项仅影响适用于表的语句。
它不会影响仅适用于其他数据库对象的语句,例如存储的例程。
要过滤在存储例程上运行的语句,请使用一个或多个
--replicate-*-db
选项。
--replicate-ignore-table=
db_name.tbl_name
属性 | 值 |
---|---|
命令行格式 | --replicate-ignore-table=name |
类型 | 串 |
通过告知从属SQL线程不复制任何更新指定表的语句来创建复制过滤器,即使任何其他表可能由同一语句更新。
要指定多个要忽略的表,请多次使用此选项,每个表一次。
与之相反,这适用于跨数据库更新
--replicate-ignore-db
。
请参见
第17.2.5节“服务器如何评估复制过滤规则”
。
您还可以通过发出
CHANGE
REPLICATION FILTER REPLICATE_IGNORE_TABLE
语句
来创建此类过滤器
。
此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。
在名为
channel_1
use
的通道上配置通道特定的复制筛选器
。
在这种情况下,第一个冒号被解释为分隔符,随后的冒号是文字冒号。
有关
更多信息
,
请参见
第17.2.5.4节“基于复制通道的过滤器”
。
--replicate-ignore-table:
channel_1
:db_name.tbl_name
全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。
特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。
他们不能对使用
group_replication_applier
或
group_replication_recovery
通道。
此选项仅影响适用于表的语句。
它不会影响仅适用于其他数据库对象的语句,例如存储的例程。
要过滤在存储例程上运行的语句,请使用一个或多个
--replicate-*-db
选项。
--replicate-rewrite-db=
from_name
->to_name
属性 | 值 |
---|---|
命令行格式 | --replicate-rewrite-db=old_name->new_name |
类型 | 串 |
告诉从创建转换的默认数据库复制过滤器(即,通过选择的一个
USE
),以
to_name
如果它是
from_name
在主。
只有涉及表的语句才会受到影响(不是语句,如
CREATE DATABASE
,
DROP DATABASE
和
ALTER DATABASE
),并且只有
from_name
在主服务器上是默认数据库时
才会
受到影响
。
要指定多次重写,请多次使用此选项。
服务器使用第一个
from_name
匹配值
的服务器
。
数据库名称转换在
之前
完成
--replicate-*
规则经过测试。
您还可以通过发出
CHANGE
REPLICATION FILTER REPLICATE_REWRITE_DB
语句
来创建此类过滤器
。
如果在命令行中使用此选项,并且该
>
字符对于命令解释程序是特殊的,请引用选项值。
例如:
外壳> mysqld --replicate-rewrite-db="olddb
->newdb
"
此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。
指定通道名称后跟冒号,然后指定过滤器规范。
第一个冒号被解释为分隔符,任何后续冒号都被解释为文字冒号。
例如,在名为的通道上配置通道特定的复制筛选器
channel_1
,请使用:
外壳> mysqld --replicate-rewrite-db=channel_1
:db_name1
->db_name2
如果使用冒号但未指定通道名称,则该选项会为默认复制通道配置复制筛选器。 有关 更多信息 , 请参见 第17.2.5.4节“基于复制通道的过滤器” 。
全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。
特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。
他们不能对使用
group_replication_applier
或
group_replication_recovery
通道。
使用此选项时表名使用数据库名限定的语句不适用于表级复制过滤选项,例如
--replicate-do-table
。
假设我们有一个
a
在master上
命名的数据库
,一个
b
在slave上
命名
,每个包含一个表
t
,并且已经启动了master
--replicate-rewrite-db='a->b'
。
在稍后的时间点,我们执行
DELETE
FROM
a.t
。
在这种情况下,没有相关的过滤规则有效,原因如下:
--replicate-do-table=a.t
因为slave
t
在数据库中
有表
,
所以不起作用
b
。
--replicate-do-table=b.t
与原始语句不匹配,因此被忽略。
--replicate-do-table=*.t
处理方式相同
--replicate-do-table=a.t
,因此也不起作用。
同样,该
--replication-rewrite-db
选项不适用于跨数据库更新。
属性 | 值 |
---|---|
命令行格式 | --replicate-same-server-id[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
此选项适用于复制从属服务器。
默认值为0(
FALSE
)。
如果将此选项设置为1(
TRUE
),则从属设备不会跳过具有自己的服务器ID的事件。
此设置通常仅在罕见配置中有用。
在复制从站上启用二进制日志记录时,
如果服务器是循环复制拓扑的一部分,则从属服务器上
的
--replicate-same-server-id
和
--log-slave-updates
选项
组合
可能会导致复制中出现无限循环。
(在MySQL
8.0中,默认情况下启用二进制日志记录,启用二进制日志记录时,从属更新日志记录是默认值。)但是,使用全局事务标识符(GTID)可以通过跳过已经执行的事务来防止这种情况应用。
如果
gtid_mode=ON
在从站上设置,您可以使用此组合选项启动服务器,但在服务器运行时无法更改为任何其他GTID模式。
如果设置了任何其他GTID模式,则服务器不会以此选项组合启动。
默认情况下,如果从属I / O线程具有从属服务器ID(此优化有助于节省磁盘使用),则从属I / O线程不会将二进制日志事件写入中继日志。
如果要使用
--replicate-same-server-id
,请确保在使从属设备读取您希望从属SQL线程执行的事件之前,使用此选项启动从属设备。
--replicate-wild-do-table=
db_name.tbl_name
属性 | 值 |
---|---|
命令行格式 | --replicate-wild-do-table=name |
类型 | 串 |
通过告知从属线程将复制限制为任何更新的表与指定的数据库和表名模式匹配的语句来创建复制过滤器。
模式可以包含
通配符
%
和
_
通配符,其含义与
LIKE
模式匹配运算符的
含义相同
。
要指定多个表,请多次使用此选项,每个表使用一次。
这适用于跨数据库更新。
请参见
第17.2.5节“服务器如何评估复制过滤规则”
。
您还可以通过发出
CHANGE
REPLICATION FILTER REPLICATE_WILD_DO_TABLE
语句
来创建此类过滤器
。
此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。
在名为
channel_1
use
的通道上配置通道特定的复制筛选器
。
在这种情况下,第一个冒号被解释为分隔符,随后的冒号是文字冒号。
有关
更多信息
,
请参见
第17.2.5.4节“基于复制通道的过滤器”
。
--replicate-wild-do-table:
channel_1
:db_name.tbl_name
全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。
特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。
他们不能对使用
group_replication_applier
或
group_replication_recovery
通道。
此选项适用于表,视图和触发器。
它不适用于存储过程和函数或事件。
要过滤对后一个对象进行操作的语句,请使用一个或多个
--replicate-*-db
选项。
例如,
--replicate-wild-do-table=foo%.bar%
仅复制使用数据库名称以
foo
表开头且表名开头的表的更新
bar
。
如果表名称模式
%
,它匹配任何表名和选项也适用于数据库级的语句(
CREATE
DATABASE
,
DROP
DATABASE
,和
ALTER
DATABASE
)。
例如,如果使用
--replicate-wild-do-table=foo%.%
,则在数据库名称与模式匹配时复制数据库级语句
foo%
。
要在数据库或表名模式中包含文字通配符,请使用反斜杠对其进行转义。
例如,要复制已命名
my_own%db
但不从
my1ownAABCdb
数据库
复制表的
数据库的
所有表
,您应该转义
_
和这样的
%
字符:
--replicate-wild-do-table=my\_own\%db
。
如果在命令行上使用该选项,则可能需要将反斜杠加倍或引用选项值,具体取决于命令解释程序。
例如,使用
bash
shell,您需要键入
--replicate-wild-do-table=my\\_own\\%db
。
--replicate-wild-ignore-table=
db_name.tbl_name
属性 | 值 |
---|---|
命令行格式 | --replicate-wild-ignore-table=name |
类型 | 串 |
创建一个复制过滤器,使从属线程不会复制任何表与给定通配符模式匹配的语句。
要指定多个要忽略的表,请多次使用此选项,每个表一次。
这适用于跨数据库更新。
请参见
第17.2.5节“服务器如何评估复制过滤规则”
。
您还可以通过发出
CHANGE
REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE
语句
来创建此类过滤器
。
此选项支持特定于通道的复制过滤器,使多源复制从属服务器可以为不同的源使用特定的过滤器。
在名为
channel_1
use
的通道上配置通道特定的复制筛选器
。
在这种情况下,第一个冒号被解释为分隔符,随后的冒号是文字冒号。
有关
更多信息
,
请参见
第17.2.5.4节“基于复制通道的过滤器”
。
--replicate-wild-ignore:
channel_1
:db_name.tbl_name
全局复制筛选器不能在为组复制配置的MySQL服务器实例上使用,因为在某些服务器上筛选事务会使该组无法就一致状态达成协议。
特定于通道的复制筛选器可用于不直接与组复制相关的复制通道,例如,组成员还充当组外部主服务器的复制从属服务器。
他们不能对使用
group_replication_applier
或
group_replication_recovery
通道。
例如,
--replicate-wild-ignore-table=foo%.bar%
不复制使用数据库名称以
foo
表开头且表名开头的表的更新
bar
。
有关匹配如何工作的信息,请参阅该
--replicate-wild-do-table
选项
的说明
。
在选项值中包含文字通配符的规则也是相同的
--replicate-wild-ignore-table
。
属性 | 值 |
---|---|
命令行格式 | --report-host=host_name |
系统变量 | report_host |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
从站注册期间要向主站报告的从站的主机名或IP地址。
该值显示在
SHOW SLAVE
HOSTS
主服务器
的输出中
。
如果您不希望从站向主站注册自己,请保留未设置的值。
主设备在从设备连接后从TCP / IP套接字中简单地读取从设备的IP地址是不够的。 由于NAT和其他路由问题,该IP可能无法从主服务器或其他主机连接到从服务器。
属性 | 值 |
---|---|
命令行格式 | --report-password=name |
系统变量 | report_password |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
从站注册期间要向主站报告的从站的帐户密码。
SHOW SLAVE HOSTS
如果主服务器已启动,则
此值将显示在
主服务器
的输出中
--show-slave-auth-info
。
虽然此选项的名称可能暗示其他情况,
--report-password
但未连接到MySQL用户权限系统,因此不一定(甚至可能)与MySQL复制用户帐户的密码相同。
属性 | 值 |
---|---|
命令行格式 | --report-port=port_num |
系统变量 | report_port |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 整数 |
默认值 | [slave_port] |
最低价值 | 0 |
最大价值 | 65535 |
用于连接从站的TCP / IP端口号,在从站注册期间报告给主站。 仅当从站正在侦听非默认端口或者您有从主站或其他客户端到从站的特殊隧道时才设置此项。 如果您不确定,请不要使用此选项。
此选项的默认值是从站实际使用的端口号(Bug#13333431)。
这也是显示的默认值
SHOW SLAVE
HOSTS
。
属性 | 值 |
---|---|
命令行格式 | --report-user=name |
系统变量 | report_user |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 串 |
从站注册期间要向主站报告的从站的帐户用户名。
SHOW SLAVE HOSTS
如果主服务器已启动,则
此值将显示在
主服务器
的输出中
--show-slave-auth-info
。
虽然此选项的名称可能暗示其他情况,
--report-user
但未连接到MySQL用户权限系统,因此不一定(甚至可能)与MySQL复制用户帐户的名称相同。
属性 | 值 |
---|---|
命令行格式 | --slave-checkpoint-group=# |
类型 | 整数 |
默认值 | 512 |
最低价值 | 32 |
最大价值 | 524280 |
块大小 | 8 |
设置在调用检查点操作以更新其状态之前,多线程从站可以处理的最大事务数,如下所示
SHOW SLAVE STATUS
。
设置此选项对未启用多线程的从站没有影响。
NDB Cluster目前不支持多线程从站,它会静默忽略此选项的设置。 有关 更多信息 , 请参见 第22.6.3节“NDB群集复制中的已知问题” 。
此选项与
--slave-checkpoint-period
选项
结合使用,
以便在超过任一限制时执行检查点,并且计数器跟踪事务数和自上次检查点重置以来经过的时间。
除非服务器是使用构建的,否则此选项的最小允许值为32,
-DWITH_DEBUG
在这种情况下,最小值为1.有效值始终为8的倍数;
您可以将其设置为不是这样的倍数的值,但是在存储该值之前,服务器将其舍入到下一个较低的8的倍数。
(
例外
:调试服务器不执行此类舍入。)无论服务器是如何构建的,默认值为512,允许的最大值为524280。
属性 | 值 |
---|---|
命令行格式 | --slave-checkpoint-period=# |
类型 | 整数 |
默认值 | 300 |
最低价值 | 1 |
最大价值 | 4G |
设置在调用检查点操作以更新多线程从站的状态之前允许通过的最长时间(以毫秒为单位),如下所示
SHOW SLAVE STATUS
。
设置此选项对未启用多线程的从站没有影响。
NDB Cluster目前不支持多线程从站,它会静默忽略此选项的设置。 有关 更多信息 , 请参见 第22.6.3节“NDB群集复制中的已知问题” 。
此选项与
--slave-checkpoint-group
选项
结合使用,
以便在超过任一限制时执行检查点,并且计数器跟踪事务数和自上次检查点重置以来经过的时间。
此选项的最小允许值为1,除非服务器是使用构建的
-DWITH_DEBUG
,在这种情况下最小值为0.无论服务器是如何构建的,默认值为300,最大可能值为4294967296(4GB) 。
属性 | 值 |
---|---|
命令行格式 | --slave-parallel-workers=# |
类型 | 整数 |
默认值 | 0 |
最低价值 | 0 |
最大价值 | 1024 |
在从属设备上启用多线程,并设置从属应用程序线程的数量,以便并行执行复制事务。 当值是大于0的数字时,从属服务器是具有指定数量的应用程序线程的多线程从属服务器,以及用于管理它们的协调器线程。 如果您使用多个复制通道,则每个通道都具有此数量的线程。
在从站上启用多线程时,支持重试事务。
当
slave_preserve_commit_order=1
从站上的事务以与从站的中继日志中出现的顺序相同的顺序在从站上外部化时。
在应用程序线程之间分配事务的方式由
--slave-parallel-type
。
要禁用并行执行,请将此选项设置为0,这将为从属设备提供单个应用程序线程,而不是协调器线程。
使用此设置,
--slave-parallel-type
和
slave_preserve_commit_order
选项无效,将被忽略。
NDB Cluster目前不支持多线程从站,它会静默忽略此选项的设置。 有关 更多信息 , 请参见 第22.6.3节“NDB群集复制中的已知问题” 。
--slave-pending-jobs-size-max=
#
属性 | 值 |
---|---|
命令行格式 | --slave-pending-jobs-size-max=# |
类型 | 整数 |
默认值 (> = 8.0.12) | 128M |
默认值 (<= 8.0.11) | 16M |
最低价值 | 1024 |
最大价值 | 16EiB |
块大小 | 1024 |
对于多线程从站,此选项设置可用于保存尚未应用的事件的从属工作队列的最大内存量(以字节为单位)。 设置此选项对未启用多线程的从站没有影响。
此选项的最小可能值为1024字节; 默认值为128MB。 最大可能值为18446744073709551615(16 exbibytes)。 在存储之前,不是1024字节的精确倍数的值向下舍入到1024字节的下一个较低倍数。
此变量的值是软限制,可以设置为与正常工作负载匹配。 如果异常大的事件超过此大小,则事务将一直保持到所有从属工作程序都有空队列,然后进行处理。 所有后续交易将持续到大型交易完成为止。
属性 | 值 |
---|---|
命令行格式 | --skip-slave-start[={OFF|ON}] |
类型 | 布尔 |
默认值 | OFF |
告诉从服务器在服务器启动时不启动从属线程。
要在以后启动线程,请使用
START SLAVE
语句。
属性 | 值 |
---|---|
命令行格式 | --slave-load-tmpdir=dir_name |
系统变量 | slave_load_tmpdir |
范围 | 全球 |
动态 | 没有 |
SET_VAR
提示适用
|
没有 |
类型 | 目录名称 |
默认值 | Value of --tmpdir |
从站创建临时文件的目录的名称。
默认情况下,此选项等于
tmpdir
系统变量
的值
,或者未指定系统变量时应用的默认值。
当从属SQL线程复制一个
LOAD
DATA
语句,它将要从中继日志加载的文件提取到临时文件中,然后将这些文件加载到表中。
如果主服务器上加载的文件很大,那么从服务器上的临时文件也很庞大。
因此,建议使用此选项告诉从属服务器将临时文件放在位于具有大量可用空间的某个文件系统中的目录中。
在这种情况下,中继日志也很庞大,因此您可能还希望使用该
--relay-log