?官网地址:MySQL :: MySQL Replication :: 2.6.3 Replica Server Options and Variables
欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.
本节介绍适用于副本的服务器选项和系统变量,并包含以下内容:
在命令行或?选项文件中 指定选项?。许多选项可以在服务器运行时使用该?CHANGE MASTER TO语句进行设置。使用 指定系统变量值?SET。
服务器 ID。??在源和每个副本上,您必须设置?server_id系统变量以建立一个范围从 1 到 2?32?- 1的唯一复制 ID。?“唯一”?意味着每个 ID 必须与任何其他源使用的每个其他 ID 不同或复制拓扑中的副本。示例my.cnf
文件:
[mysqld]
server-id=3
本节介绍用于控制副本服务器的启动选项。其中许多选项可以在服务器运行时使用该CHANGE MASTER TO语句进行设置。其他选项(例如?--replicate-*
选项)只能在副本服务器启动时设置。本节稍后将讨论与复制相关的系统变量。
命令行格式 | --log-warnings[=#] |
---|---|
已弃用 | 是的 |
系统变量 | log_warnings |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 2 |
最小值 | 0 |
最大值(64 位平台) | 18446744073709551615 |
最大值(32 位平台) | 4294967295 |
系统log_error_verbosity?变量优先于?--log-warnings选项或系统变量,并且应该用来代替选项或?log_warnings系统变量。log_error_verbosity有关详细信息,请参阅和?的说明?log_warnings。?不推荐使用--log-warnings命令行选项和系统 变量;log_warnings预计它们会在未来的 MySQL 版本中被删除。
使服务器将更多有关其正在执行的操作的消息记录到错误日志中。对于复制,服务器会生成警告,表明在网络或连接失败后成功重新连接,并提供有关每个复制线程如何启动的信息。该变量默认设置为 2。要禁用它,请将其设置为 0。如果该值大于 0,服务器将记录有关基于语句的日志记录不安全的语句的消息。如果该值大于 0,则记录中止的连接和新连接尝试的访问被拒绝错误1. 请参阅通信错误和中止连接。
此选项的效果不仅限于复制。它会影响一系列服务器活动中的诊断消息。
命令行格式 | --master-info-file=file_name |
---|---|
类型 | 文件名 |
默认值 | master.info |
副本用于记录源信息的文件的名称。默认名称位于?master.info
数据目录中。有关此文件格式的信息,请参阅?第 5.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 |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 0 |
最小值 | 0 |
最大值 | 1073741824 |
单元 | 字节 |
块大小 | 4096 |
服务器自动轮换中继日志文件的大小。如果该值非零,则当中继日志的大小超过该值时,将自动轮转。如果该值为零(默认值),则发生中继日志轮换的大小由 的值确定?max_binlog_size。有关更多信息,请参见第 5.4.1 节“中继日志”。
命令行格式 | --relay-log-purge[={OFF|ON}] |
---|---|
系统变量 | relay_log_purge |
范围 | 全球的 |
动态的 | 是的 |
类型 | 布尔值 |
默认值 | ON |
一旦不再需要中继日志,就禁用或启用自动清除它们。默认值为 1(启用)。这是一个全局变量,可以使用 动态更改。启用该选项时禁用中继日志的清除?会使数据一致性面临风险。?SET GLOBAL relay_log_purge =?
N
--relay-log-recovery
命令行格式 | --relay-log-space-limit=# |
---|---|
系统变量 | relay_log_space_limit |
范围 | 全球的 |
动态的 | 不 |
类型 | 整数 |
默认值 | 0 |
最小值 | 0 |
最大值 | 18446744073709551615 |
单元 | 字节 |
此选项对副本上所有中继日志的总大小(以字节为单位)设置上限。值为 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。此过滤的精确效果取决于使用的是基于语句的复制还是基于行的复制,并将在接下来的几段中进行描述。
复制过滤器不能在配置为组复制的 MySQL 服务器实例上使用,因为过滤某些服务器上的事务会使组无法就一致状态达成一致。
基于语句的复制。??告诉复制 SQL 线程将复制限制为默认数据库(即由 所选择的数据库USE)为 的 语句db_name
。要指定多个数据库,请多次使用此选项,每个数据库一次;但是,这样做不会?复制跨数据库语句,例如在选择不同数据库(或未选择数据库)时。?UPDATE?
some_db.some_table
?SET foo='bar'
要指定多个数据库,您?必须使用此选项的多个实例。由于数据库名称可以包含逗号,因此如果您提供逗号分隔的列表,则该列表将被视为单个数据库的名称。
使用基于语句的复制时,可能无法按预期工作的示例:如果启动副本并且--replicate-do-db=sales?您在源上发出以下语句, 则不会复制 该UPDATE语句 :
USE prices;
UPDATE sales.january SET amount=amount+1000;
这种“仅检查默认数据库”行为 的主要原因是,仅从语句中很难知道是否应该复制它(例如,如果您正在使用多表?DELETE语句或多表UPDATE?语句跨多个数据库)。如果不需要,仅检查默认数据库而不是所有数据库也更快。
基于行的复制。??告诉复制 SQL 线程限制对数据库的复制db_name
。db_name
仅更改属于的表;当前数据库对此没有影响。假设副本启动且?--replicate-do-db=sales基于行的复制生效,然后在源上运行以下语句:
USE prices;
UPDATE sales.february SET amount=amount+100;
february
副本上数据库中的表?按照sales
语句进行更改UPDATE?;无论是否?USE发表该声明,都会发生这种情况。但是,使用基于行的复制时,在源上发出以下语句不会对副本产生影响--replicate-do-db=sales:
USE prices;
UPDATE prices.march SET amount=amount-25;
即使将语句USE prices
更改为USE sales
,?UPDATE语句的效果仍然不会被复制。
基于语句的复制与基于行的复制的处理方式的另一个重要区别?--replicate-do-db在于引用多个数据库的语句。假设副本以 启动?--replicate-do-db=db1,并且在源上执行以下语句:
USE db1;
UPDATE db1.table1, db2.table2 SET db1.table1.col1 = 10, db2.table2.col2 = 20;
如果您使用基于语句的复制,则两个表都会在副本上更新。但是,当使用基于行的复制时,仅table1
在副本上受到影响;由于table2
位于不同的数据库中,因此table2
副本上的?UPDATE.?现在假设使用了以下语句?USE db1
而 不是该语句:USE db4
USE db4;
UPDATE db1.table1, db2.table2 SET db1.table1.col1 = 10, db2.table2.col2 = 20;
在这种情况下,UPDATE?当使用基于语句的复制时,该语句不会对副本产生任何影响。但是,如果您使用基于行的复制,则?UPDATE会在副本上发生更改?table1
,但不会 更改table2
— 换句话说,只有名为 by 的数据库中的表?--replicate-do-db会发生更改,并且默认数据库的选择对此行为没有影响。
如果您需要跨数据库更新才能工作,请?改用。请参见第 5.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。与 一样?--replicate-do-db,此过滤的精确效果取决于使用的是基于语句的复制还是基于行的复制,并将在接下来的几段中进行描述。
复制过滤器不能在配置为组复制的 MySQL 服务器实例上使用,因为过滤某些服务器上的事务会使组无法就一致状态达成一致。
基于语句的复制。??告诉复制 SQL 线程不要复制默认数据库(即 所选择的数据库USE)为 的 任何语句db_name
。
基于行的复制。??告诉复制 SQL 线程不要更新数据库中的任何表db_name
。默认数据库没有影响。
使用基于语句的复制时,以下示例不会按您的预期工作。假设副本已启动,?--replicate-ignore-db=sales?并且您在源上发出以下语句:
USE prices;
UPDATE sales.january SET amount=amount+1000;
在这种情况下?会复制 该UPDATE语句 ,因为仅适用于默认数据库(由该?语句确定)。由于?在语句中显式指定了数据库,因此该语句未被过滤。但是,当使用基于行的复制时,?语句的效果不会传播到副本,并且副本的表副本?保持不变;在这种情况下,?会导致对源副本中的表进行的所有更改--replicate-ignore-dbUSEsales
UPDATEsales.january
--replicate-ignore-db=salessales
?副本将忽略的数据库。
要指定多个要忽略的数据库,请多次使用此选项,每个数据库一次。由于数据库名称可以包含逗号,因此如果您提供逗号分隔的列表,则该列表将被视为单个数据库的名称。
如果您正在使用跨数据库更新并且不希望复制这些更新,则不应使用此选项。请参见第 5.5 节“服务器如何评估复制过滤规则”。
如果您需要跨数据库更新才能工作,请?改用。请参见第 5.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.?请参见?第 5.5 节“服务器如何评估复制过滤规则”。您还可以通过发出语句来创建这样的过滤器?CHANGE REPLICATION FILTER REPLICATE_DO_TABLE。
复制过滤器不能在配置为组复制的 MySQL 服务器实例上使用,因为过滤某些服务器上的事务会使组无法就一致状态达成一致。
此选项仅影响应用于表的语句。它不会影响仅适用于其他数据库对象的语句,例如存储例程。要过滤对存储例程进行操作的语句,请使用一个或多个选项?--replicate-*-db
。
--replicate-ignore-table=db_name.tbl_name
命令行格式 | --replicate-ignore-table=name |
---|---|
类型 | 细绳 |
通过告诉复制 SQL 线程不要复制任何更新指定表的语句(即使同一语句可能更新任何其他表)来创建复制过滤器。要指定忽略多个表,请多次使用此选项,每个表一次。与?--replicate-ignore-db.?请参见?第 5.5 节“服务器如何评估复制过滤规则”。您还可以通过发出语句来创建这样的过滤器?CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE?。
复制过滤器不能在配置为组复制的 MySQL 服务器实例上使用,因为过滤某些服务器上的事务会使组无法就一致状态达成一致。
此选项仅影响应用于表的语句。它不会影响仅适用于其他数据库对象的语句,例如存储例程。要过滤对存储例程进行操作的语句,请使用一个或多个选项?--replicate-*-db
。
--replicate-rewrite-db=from_name->to_name
命令行格式 | --replicate-rewrite-db=old_name->new_name |
---|---|
类型 | 细绳 |
告诉副本创建一个复制过滤器,将指定的数据库转换为?to_name
它位于?from_name
源上的情况。仅涉及表的语句受到影响,而不是诸如CREATE DATABASE、?DROP DATABASE、 和 之 类的语句ALTER DATABASE。
要指定多次重写,请多次使用此选项。服务器使用第一个?from_name
值匹配的值。数据库名称翻译是 在测试规则之前?完成的。--replicate-*
您还可以通过发出语句来创建这样的过滤器?CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB。
如果您?--replicate-rewrite-db在命令行上使用该选项,并且该>
?字符对于您的命令解释器来说是特殊的,请引用该选项值。例如:
$> mysqld --replicate-rewrite-db="olddb->newdb"
该选项的效果?--replicate-rewrite-db根据查询使用的是基于语句还是基于行的二进制日志记录格式而有所不同。使用基于语句的格式,DML 语句根据?USE语句指定的当前数据库进行转换。使用基于行的格式,DML 语句根据修改表所在的数据库进行转换。无论二进制日志记录格式如何,DDL 语句始终根据?USE语句指定的当前数据库进行过滤。
为了确保重写产生预期结果,特别是与其他复制过滤选项结合使用时,请在使用该?--replicate-rewrite-db?选项时遵循以下建议:
如果遵循这些建议,则可以安全地将该?--replicate-rewrite-db选项与表级复制过滤选项(例如?--replicate-do-table.
全局复制过滤器不能在配置为组复制的 MySQL 服务器实例上使用,因为过滤某些服务器上的事务会使组无法就一致状态达成一致。
命令行格式 | --replicate-same-server-id[={OFF|ON}] |
---|---|
类型 | 布尔值 |
默认值 | OFF |
用于副本服务器。通常您应该使用默认设置 0,以防止循环复制引起的无限循环。如果设置为 1,副本不会跳过具有自己的服务器 ID 的事件。通常,这仅在罕见的配置中有用。log_slave_updates如果启用则不能设置为 1 。默认情况下,如果二进制日志事件具有副本的服务器 ID,复制 I/O 线程不会将二进制日志事件写入中继日志(此优化有助于节省磁盘使用量)。如果要使用?--replicate-same-server-id,请确保在使副本读取您希望复制 SQL 线程执行的其自己的事件之前使用此选项启动副本。
--replicate-wild-do-table=db_name.tbl_name
命令行格式 | --replicate-wild-do-table=name |
---|---|
类型 | 细绳 |
通过告诉复制 SQL 线程将复制限制为任何已更新表与指定数据库和表名称模式匹配的语句来创建复制过滤器。模式可以包含%
?和_
通配符,它??们的含义与LIKE?模式匹配运算符相同。要指定多个表,请多次使用此选项,每个表一次。这适用于跨数据库更新。请参见?第 5.5 节“服务器如何评估复制过滤规则”。您还可以通过发出语句来创建这样的过滤器?CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE?。
复制过滤器不能在配置为组复制的 MySQL 服务器实例上使用,因为过滤某些服务器上的事务会使组无法就一致状态达成一致。
此选项适用于表、视图和触发器。它不适用于存储过程和函数或事件。要过滤对后一个对象进行操作的语句,请使用一个或多个选项--replicate-*-db
。
例如,?--replicate-wild-do-table=foo%.bar%?仅复制使用数据库名称以 开头foo
且表名称以 开头的表的更新bar
。
如果表名称模式为%
,则它与任何表名称匹配,并且该选项也适用于数据库级语句(CREATE DATABASE、DROP DATABASE和ALTER DATABASE)。例如,如果您使用?--replicate-wild-do-table=foo%.%,并且数据库名称与模式匹配,则将复制数据库级语句foo%
。
表级复制过滤器仅应用于查询中明确提及和操作的表。它们不适用于由查询隐式更新的表。例如,?GRANT更新mysql.user
系统表但未提及该表的语句不受指定mysql.%
为通配符模式的过滤器的影响。
要在数据库或表名称模式中包含文字通配符,请使用反斜杠对其进行转义。例如,要复制名为 的数据库的所有表?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 |
---|---|
类型 | 细绳 |
创建一个复制过滤器,阻止复制 SQL 线程复制任何表与给定通配符模式匹配的语句。要指定忽略多个表,请多次使用此选项,每个表一次。这适用于跨数据库更新。请参见?第 5.5 节“服务器如何评估复制过滤规则”。您还可以通过发出语句来创建这样的过滤器?CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE?。
复制过滤器不能在配置为组复制的 MySQL 服务器实例上使用,因为过滤某些服务器上的事务会使组无法就一致状态达成一致。
例如,?--replicate-wild-ignore-table=foo%.bar%?不复制使用数据库名称以 开头foo
并且表名称以 开头的表的更新bar
。
有关匹配工作原理的信息,请参阅该?--replicate-wild-do-table?选项的说明。在选项值中包含文字通配符的规则?--replicate-wild-ignore-table?也与 for 相同。
表级复制过滤器仅应用于查询中明确提及和操作的表。它们不适用于由查询隐式更新的表。例如,?GRANT更新mysql.user
系统表但未提及该表的语句不受指定mysql.%
为通配符模式的过滤器的影响。
如果您需要过滤掉?GRANT语句或其他管理语句,可能的解决方法是使用--replicate-ignore-db?过滤器。此过滤器对当前有效的默认数据库进行操作,由?USE语句确定。因此,您可以创建一个过滤器来忽略未复制的数据库的语句,然后?USE在发出您想要忽略的任何管理语句之前立即发出该语句以将默认数据库切换到该数据库。在管理语句中,命名应用该语句的实际数据库。
例如,如果?--replicate-ignore-db=nonreplicated?在副本服务器上配置 ,则以下语句序列会导致该?GRANT语句被忽略,因为默认数据库?nonreplicated
有效:
USE nonreplicated;
GRANT SELECT, INSERT ON replicated.t1 TO 'someuser'@'somehost';
命令行格式 | --skip-slave-start[={OFF|ON}] |
---|---|
系统变量 | skip_slave_start |
范围 | 全球的 |
动态的 | 不 |
类型 | 布尔值 |
默认值 | OFF |
告诉副本服务器在服务器启动时不要启动复制线程。要稍后启动线程,请使用START SLAVE语句。
--slave-skip-errors=[err_code1,err_code2,...|all|ddl_exist_errors]
命令行格式 | --slave-skip-errors=name |
---|---|
系统变量 | slave_skip_errors |
范围 | 全球的 |
动态的 | 不 |
类型 | 细绳 |
默认值 | OFF |
有效值 |
|
通常,当副本上发生错误时,复制会停止,这使您有机会手动解决数据中的不一致问题。当语句返回选项值中列出的任何错误时,此选项会导致复制 SQL 线程继续复制。
除非您完全理解出现错误的原因,否则请勿使用此选项。如果您的复制设置和客户端程序中没有错误,并且 MySQL 本身也没有错误,则永远不会发生停止复制的错误。不加区别地使用此选项会导致副本与源完全不同步,而您不知道为什么会发生这种情况。
对于错误代码,您应该使用副本的错误日志和 的输出中的错误消息提供的数字SHOW SLAVE STATUS。?错误消息和常见问题,列出服务器错误代码。
简写值ddl_exist_errors
相当于错误代码列表?1007,1008,1050,1051,1054,1060,1061,1068,1094,1146
。
您还可以(但不应该)使用非常不推荐的值all
来使副本忽略所有错误消息并无论发生什么情况都继续运行。不用说,如果您使用all
,则无法保证数据的完整性。在这种情况下,如果副本的数据与源上的数据不接近,请不要抱怨(或提交错误报告)。你被警告了。
NDB由于检查纪元序列号的?内部机制,在 NDB Cluster 之间复制时,此选项不会以相同的方式工作 ;一旦NDB
?检测到纪元号丢失或乱序,它就会立即停止副本应用程序线程。
例子:
--slave-skip-errors=1062,1053
--slave-skip-errors=all
--slave-skip-errors=ddl_exist_errors
--slave-sql-verify-checksum={0|1}
命令行格式 | --slave-sql-verify-checksum[={OFF|ON}] |
---|---|
类型 | 布尔值 |
默认值 | ON |
启用此选项后,副本会检查从中继日志读取的校验和。如果出现不匹配的情况,副本会因错误而停止。
MySQL 测试套件内部使用以下选项进行复制测试和调试。它们不适用于生产环境。
命令行格式 | --abort-slave-event-count=# |
---|---|
类型 | 整数 |
默认值 | 0 |
最小值 | 0 |
当此选项设置为?value
除 0(默认值)之外的某个正整数时,它会影响复制行为,如下所示: 复制 SQL 线程启动后,?value
允许执行日志事件;此后,复制 SQL 线程不再接收任何事件,就像来自源的网络连接被切断一样。复制 SQL 线程继续运行,并且输出?SHOW SLAVE STATUS显示?Yes
在?Slave_IO_Running
和?Slave_SQL_Running
列中,但不会从中继日志中读取更多事件。
MySQL 测试套件内部使用此选项进行复制测试和调试。它不适用于生产环境。
--disconnect-slave-event-count
命令行格式 | --disconnect-slave-event-count=# |
---|---|
类型 | 整数 |
默认值 | 0 |
MySQL 测试套件内部使用此选项进行复制测试和调试。它不适用于生产环境。
MySQL 5.7 支持将复制元数据记录到表而不是文件中。可以使用这两个系统变量单独配置副本连接元数据存储库和应用程序元数据存储库的写入:
有关这些变量的信息,请参见?第 2.6.3 节 “副本服务器选项和变量”。
这些变量可用于使副本能够适应意外停止。有关更多信息,请参阅?第 3.2 节“处理副本意外停止”。
信息日志表及其内容被视为给定 MySQL 服务器的本地信息。它们不会被复制,并且对它们的更改也不会写入二进制日志。
有关更多信息,请参阅第 5.4 节 “中继日志和复制元数据存储库”。
以下列表描述了用于控制副本服务器的系统变量。它们可以在服务器启动时设置,其中一些可以在运行时使用?SET.?本节前面列出了与副本一起使用的服务器选项。
命令行格式 | --init-slave=name |
---|---|
系统变量 | init_slave |
范围 | 全球的 |
动态的 | 是的 |
类型 | 细绳 |
该变量与 类似?init_connect,但它是每次复制 SQL 线程启动时由副本服务器执行的字符串。字符串的格式与变量的格式相同?init_connect。该变量的设置对后续?START SLAVE语句生效。
复制 SQL 线程在执行之前向客户端发送确认?init_slave。因此,不保证 返回init_slave时已经被执行START SLAVE?。有关详细信息,请参阅START SLAVE 语句。
命令行格式 | --log-slow-slave-statements[={OFF|ON}] |
---|---|
系统变量 | log_slow_slave_statements |
范围 | 全球的 |
动态的 | 是的 |
类型 | 布尔值 |
默认值 | OFF |
long_query_time启用慢查询日志后,此变量将启用在副本上执行时间?超过几秒的查询的日志记录 。请注意,如果正在使用基于行的复制 (?binlog_format=ROW),?log_slow_slave_statements?则不会产生任何效果。仅当查询以语句格式记录在二进制日志中时,即当?binlog_format=STATEMENT设置时,或者当?binlog_format=MIXED设置时并且语句以语句格式记录时,才会添加到副本的慢查询日志中。设置时以行格式记录的慢速查询?binlog_format=MIXED,或以下时记录的慢速查询?binlog_format=ROWlog_slow_slave_statements?设置后,即使启用?,也不会添加到副本的慢查询日志中 。
设置?log_slow_slave_statements?不会立即生效。变量的状态适用于所有后续START SLAVE?语句。另请注意,全局设置?long_query_time适用于 SQL 线程的生命周期。如果更改该设置,则必须停止并重新启动复制 SQL 线程以实现更改(例如,通过发出?带有该选项的STOP SLAVEand 语句)。?START SLAVESQL_THREAD
命令行格式 | --master-info-repository={FILE|TABLE} |
---|---|
系统变量 | master_info_repository |
范围 | 全球的 |
动态的 | 是的 |
类型 | 细绳 |
默认值 | FILE |
有效值 |
|
此变量的设置确定副本是否将有关源的元数据(包括状态和连接信息)记录到系统数据库InnoDB
?中的表中mysql
,或者作为数据目录中的文件。有关连接元数据存储库的更多信息,请参阅?第 5.4 节 “中继日志和复制元数据存储库”。
默认设置为FILE
。作为文件,副本的连接元数据存储库?master.info
默认命名。您可以使用该?--master-info-file选项更改此名称。
替代设置是TABLE
。作为一个?InnoDB
表,副本的连接元数据存储库被命名为?mysql.slave_master_info
。TABLE
配置多个复制通道时需要进行?此 设置。
TABLE
在配置多个复制通道之前?必须设置此变量。如果您使用多个复制通道,则无法将该值设置回FILE
。
连接元数据存储库位置的设置直接影响?sync_master_info
系统变量设置的效果。仅当没有复制线程正在执行时才可以更改设置。
命令行格式 | --max-relay-log-size=# |
---|---|
系统变量 | max_relay_log_size |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 0 |
最小值 | 0 |
最大值 | 1073741824 |
单元 | 字节 |
块大小 | 4096 |
如果副本对其中继日志的写入导致当前日志文件大小超过此变量的值,则副本将轮换中继日志(关闭当前文件并打开下一个文件)。如果?max_relay_log_size为0,服务器?max_binlog_size同时使用二进制日志和中继日志。如果?max_relay_log_size大于 0,则会限制中继日志的大小,这使您可以为两个日志设置不同的大小。您必须设置?max_relay_log_size为 4096 字节到 1GB(含)之间,或者设置为 0。默认值为 0。请参阅第 5.3 节 “复制线程”。
命令行格式 | --relay-log=file_name |
---|---|
系统变量 | relay_log |
范围 | 全球的 |
动态的 | 不 |
类型 | 文件名 |
中继日志文件的基本名称。对于默认复制通道,中继日志的默认基本名称是?
。对于非默认复制通道,中继日志的默认基本名称为?,其中是此中继日志中记录的复制通道的名称。?host_name
-relay-binhost_name
-relay-bin-channel
channel
服务器将文件写入数据目录中,除非给定的基本名称带有前导绝对路径名以指定不同的目录。服务器通过在基本名称中添加数字后缀来按顺序创建中继日志文件。
由于 MySQL 解析服务器选项的方式,如果在服务器启动时指定此变量,则必须提供一个值;仅当未实际指定该选项时才使用默认基本名称。如果relay_log在服务器启动时指定系统变量而不指定值,则可能会导致意外行为;此行为取决于所使用的其他选项、??指定它们的顺序以及它们是在命令行上还是在选项文件中指定。有关 MySQL 如何处理服务器选项的更多信息,请参阅?指定程序选项。
如果指定此变量,则指定的值还将用作中继日志索引文件的基本名称。您可以通过使用系统变量指定不同的中继日志索引文件基本名称来覆盖此行为?relay_log_index
。
当服务器从索引文件中读取条目时,它会检查该条目是否包含相对路径。如果是,则路径的相对部分将替换为使用?relay_log系统变量设置的绝对路径。绝对路径保持不变;在这种情况下,必须手动编辑索引才能使用新路径。
您可能会发现relay_log?系统变量在执行以下任务时很有用:
创建名称与主机名无关的中继日志。
如果您需要将中继日志放在数据目录以外的某个区域,因为您的中继日志往往非常大并且您不想减少?max_relay_log_size。
通过在磁盘之间使用负载平衡来提高速度。
您可以从系统变量中获取中继日志文件名(和路径)?relay_log_basename
。
系统变量 | relay_log_basename |
---|---|
范围 | 全球的 |
动态的 | 不 |
类型 | 文件名 |
默认值 | datadir + '/' + hostname + '-relay-bin' |
保存中继日志文件的基本名称和完整路径。最大变量长度为256。该变量由服务器设置并且是只读的。
命令行格式 | --relay-log-index=file_name |
---|---|
系统变量 | relay_log_index |
范围 | 全球的 |
动态的 | 不 |
类型 | 文件名 |
默认值 | *host_name*-relay-bin.index |
中继日志索引文件的名称。最大变量长度为 256。对于默认复制通道,默认名称为?
。对于非默认复制通道,默认名称为?,其中是此中继日志索引中记录的复制通道的名称。?host_name
-relay-bin.indexhost_name
-relay-bin-channel
.indexchannel
服务器将文件写入数据目录中,除非名称以前导绝对路径名指定以指定不同的目录。姓名。
由于 MySQL 解析服务器选项的方式,如果在服务器启动时指定此变量,则必须提供一个值;仅当未实际指定该选项时才使用默认基本名称。如果relay_log_index在服务器启动时指定系统变量而不指定值,则可能会导致意外行为;此行为取决于所使用的其他选项、??指定它们的顺序以及它们是在命令行上还是在选项文件中指定。有关 MySQL 如何处理服务器选项的更多信息,请参阅?指定程序选项。
命令行格式 | --relay-log-info-file=file_name |
---|---|
系统变量 | relay_log_info_file |
范围 | 全球的 |
动态的 | 不 |
类型 | 文件名 |
默认值 | relay-log.info |
副本在其中记录有关中继日志信息的文件的名称,当?relay_log_info_repository=FILE.?如果?relay_log_info_repository=TABLE
,则它是在存储库更改为 时使用的文件名FILE
)。默认名称位于relay-log.info
数据目录中。有关应用程序元数据存储库的信息,请参阅第 5.4.2 节 “复制元数据存储库”。
命令行格式 | --relay-log-info-repository=value |
---|---|
系统变量 | relay_log_info_repository |
范围 | 全球的 |
动态的 | 是的 |
类型 | 细绳 |
默认值 | FILE |
有效值 |
|
此变量的设置确定副本服务器是将其应用程序元数据存储库存储为 系统数据库InnoDB
中的表?mysql
,还是数据目录中的文件。有关应用程序元数据存储库的更多信息,请参阅第 5.4 节 “中继日志和复制元数据存储库”。
默认设置为FILE
。作为文件,副本的应用程序元数据存储库?relay-log.info
默认命名,您可以使用?relay_log_info_file系统变量更改此名称。
通过设置TABLE
,作为一个?InnoDB
表,副本的应用程序元数据存储库被命名为?mysql.slave_relay_log_info
。TABLE
配置多个复制通道时需要进行此 设置。TABLE
还需要对副本的应用程序元数据存储库进行设置,以使复制能够适应意外停止。?有关更多信息,请参阅?第 3.2 节“处理副本意外停止”?。
TABLE
在配置多个复制通道之前?必须设置此变量。如果您使用多个复制通道,则无法将该值设置回FILE
。
应用者元数据存储库位置的设置直接影响?sync_relay_log_info
系统变量设置的效果。仅当没有复制线程正在执行时才可以更改设置。
命令行格式 | --relay-log-purge[={OFF|ON}] |
---|---|
系统变量 | relay_log_purge |
范围 | 全球的 |
动态的 | 是的 |
类型 | 布尔值 |
默认值 | ON |
一旦不再需要中继日志文件,就禁用或启用自动清除它们。默认值为 1 (?ON
)。
命令行格式 | --relay-log-recovery[={OFF|ON}] |
---|---|
系统变量 | relay_log_recovery |
范围 | 全球的 |
动态的 | 不 |
类型 | 布尔值 |
默认值 | OFF |
如果启用,此变量会在服务器启动后立即启用自动中继日志恢复。恢复过程创建一个新的中继日志文件,将 SQL 线程位置初始化为该新的中继日志,并将 I/O 线程初始化为 SQL 线程位置。然后继续从源读取中继日志。
该全局变量在运行时是只读的。它的值可以使用副本服务器启动时的选项进行设置?--relay-log-recovery,该值应该在副本意外停止后使用,以确保不会处理可能损坏的中继日志,并且必须使用该选项来保证副本的崩溃安全性。默认值为 0(禁用)。有关对意外停止最具弹性的副本设置组合的信息,请参阅?第 3.2 节 “处理副本的意外停止”。
该变量还与?relay_log_purge控制不再需要日志时清除日志的变量进行交互。relay_log_recovery禁用时?启用?relay_log_purge存在从未清除的文件中读取中继日志的风险,从而导致数据不一致。
对于多线程副本(其中?slave_parallel_workers大于 0),从 MySQL 5.7.13 开始,设置?relay_log_recovery = ON?会自动处理从中继日志执行的事务序列中的任何不一致和间隙。当使用基于文件位置的复制时,可能会出现这些间隙。(有关更多详细信息,请参阅?第 4.1.32 节 “复制和事务不一致”。)中继日志恢复过程使用与中继日志恢复过程相同的方法处理间隙。?START SLAVE UNTIL SQL_AFTER_MTS_GAPS声明会。当副本达到一致的无间隙状态时,中继日志恢复过程将继续从复制 SQL 线程位置开始从源获取更多事务。在 MySQL 5.7.13 之前的 MySQL 版本中,此过程不是自动的,需要使用 启动服务器?relay_log_recovery=0,使用 启动副本?START SLAVE UNTIL SQL_AFTER_MTS_GAPS以修复任何事务不一致,然后使用 重新启动副本?relay_log_recovery=1。当使用基于 GTID 的复制时,从 MySQL 5.7.28 开始,多线程副本首先检查是否?MASTER_AUTO_POSITION
设置为?ON
,如果是,则省略计算应该跳过或不跳过的事务的步骤,使得恢复过程不需要旧的中继日志。
此变量不会影响以下组复制通道:
group_replication_applier
group_replication_recovery
在组上运行的任何其他通道都会受到影响,例如从外部源或另一个组复制的通道。
命令行格式 | --relay-log-space-limit=# |
---|---|
系统变量 | relay_log_space_limit |
范围 | 全球的 |
动态的 | 不 |
类型 | 整数 |
默认值 | 0 |
最小值 | 0 |
最大值 | 18446744073709551615 |
单元 | 字节 |
用于所有中继日志的最大空间量。
replication_optimize_for_static_plugin_config
命令行格式 | --replication-optimize-for-static-plugin-config[={OFF|ON}] |
---|---|
介绍 | 5.7.33 |
系统变量 | replication_optimize_for_static_plugin_config |
范围 | 全球的 |
动态的 | 是的 |
类型 | 布尔值 |
默认值 | OFF |
使用共享锁并避免不必要的锁获取,以提高半同步复制的性能。启用该系统变量后,半同步复制插件无法卸载,因此必须禁用该系统变量才能完成卸载。
该系统变量可以在安装半同步复制插件之前或之后启用,也可以在复制运行时启用。半同步复制源服务器还可以通过启用此系统变量获得性能优势,因为它们使用与副本相同的锁定机制。
replication_optimize_for_static_plugin_config?当服务器上使用组复制时可以启用。在这种情况下,当由于高工作负载而出现锁争用时,它可能会提高性能。
replication_sender_observe_commit_only
命令行格式 | --replication-sender-observe-commit-only[={OFF|ON}] |
---|---|
介绍 | 5.7.33 |
系统变量 | replication_sender_observe_commit_only |
范围 | 全球的 |
动态的 | 是的 |
类型 | 布尔值 |
默认值 | OFF |
限制回调以提高半同步复制的性能。该系统变量可以在安装半同步复制插件之前或之后启用,也可以在复制运行时启用。半同步复制源服务器还可以通过启用此系统变量获得性能优势,因为它们使用与副本相同的锁定机制。
命令行格式 | --report-host=host_name |
---|---|
系统变量 | report_host |
范围 | 全球的 |
动态的 | 不 |
类型 | 细绳 |
在副本注册期间要向源报告的副本的主机名或 IP 地址。SHOW SLAVE HOSTS该值出现在源服务器的输出中。如果您不希望副本向源注册自身,请保留该值未设置。
在副本连接后,源仅从 TCP/IP 套接字读取副本的 IP 地址是不够的。由于 NAT 和其他路由问题,该 IP 可能不适用于从源主机或其他主机连接到副本。
命令行格式 | --report-password=name |
---|---|
系统变量 | report_password |
范围 | 全球的 |
动态的 | 不 |
类型 | 细绳 |
副本注册期间要报告给源的副本的复制用户帐户密码。SHOW SLAVE HOSTS如果源是通过 启动的,则?该值将出现在源服务器上的输出中--show-slave-auth-info。
尽管此变量的名称可能另有暗示,但?report_password它未连接到 MySQL 用户权限系统,因此不一定(甚至可能)与 MySQL 复制用户帐户的密码相同。
命令行格式 | --report-port=port_num |
---|---|
系统变量 | report_port |
范围 | 全球的 |
动态的 | 不 |
类型 | 整数 |
默认值 | [slave_port] |
最小值 | 0 |
最大值 | 65535 |
用于连接到副本的 TCP/IP 端口号,在副本注册期间向源报告。仅当副本正在侦听非默认端口或者您有从源或其他客户端到副本的特殊隧道时才设置此选项。如果您不确定,请勿使用此选项。
此选项的默认值是副本实际使用的端口号。这也是 所显示的默认值SHOW SLAVE HOSTS。
命令行格式 | --report-user=name |
---|---|
系统变量 | report_user |
范围 | 全球的 |
动态的 | 不 |
类型 | 细绳 |
副本注册时向源端报告的副本的账户用户名。SHOW SLAVE HOSTS如果源是通过 启动的,则?该值将出现在源服务器上的输出中--show-slave-auth-info。
尽管此变量的名称可能另有暗示,但?report_user它未连接到 MySQL 用户权限系统,因此不一定(甚至可能)与 MySQL 复制用户帐户的名称相同。
命令行格式 | --rpl-semi-sync-slave-enabled[={OFF|ON}] |
---|---|
系统变量 | rpl_semi_sync_slave_enabled |
范围 | 全球的 |
动态的 | 是的 |
类型 | 布尔值 |
默认值 | OFF |
控制是否在副本上启用半同步复制。要启用或禁用插件,请分别将此变量设置为ON
或OFF
?(或 1 或 0)。默认为?OFF
.
仅当安装了副本端半同步复制插件时,此变量才可用。
rpl_semi_sync_slave_trace_level
命令行格式 | --rpl-semi-sync-slave-trace-level=# |
---|---|
系统变量 | rpl_semi_sync_slave_trace_level |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 32 |
最小值 | 0 |
最大值 | 4294967295 |
副本上的半同步复制调试跟踪级别。请?rpl_semi_sync_master_trace_level?参阅 允许值。
仅当安装了副本端半同步复制插件时,此变量才可用。
命令行格式 | --rpl-stop-slave-timeout=# |
---|---|
系统变量 | rpl_stop_slave_timeout |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 31536000 |
最小值 | 2 |
最大值 | 31536000 |
单元 | 秒 |
STOP SLAVE您可以通过设置此变量来?控制超时之前等待的时间长度(以秒为单位) 。这可用于避免STOP SLAVE
使用与副本的不同客户端连接的其他 SQL 语句之间的死锁。
的最大值和默认值为?rpl_stop_slave_timeout
31536000 秒(1 年)。最短时间为 2 秒。对此变量的更改将对后续?STOP SLAVE语句生效。
该变量仅影响发出语句的客户端?STOP SLAVE
。当达到超时时,发出命令的客户端会返回一条错误消息,指出命令执行未完成。然后,客户端停止等待复制线程停止,但复制线程继续尝试停止,并且该?STOP SLAVE
指令仍然有效。一旦复制线程不再繁忙,?STOP SLAVE
就会执行该语句并且副本会停止。
命令行格式 | --slave-checkpoint-group=# |
---|---|
系统变量 | slave_checkpoint_group |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 512 |
最小值 | 32 |
最大值 | 524280 |
块大小 | 8 |
设置在调用检查点操作以更新其状态之前多线程副本可以处理的最大事务数,如 所示?SHOW SLAVE STATUS。设置此变量对未启用多线程的副本没有影响。设置此变量不会立即生效。变量的状态适用于所有后续START SLAVE?命令。
NDB Cluster 目前不支持多线程副本,它会默默地忽略此变量的设置。有关详细信息,请参阅?NDB Cluster Replication 中的已知问题。
该变量与系统变量结合使用?slave_checkpoint_period
?,当超出任一限制时,将执行检查点,并重置跟踪事务数量和自上一个检查点以来经过的时间的计数器。
该变量的最小允许值为 32,除非服务器是使用 构建的?-DWITH_DEBUG,在这种情况下最小值为 1。有效值始终是 8 的倍数;您可以将其设置为不是该倍数的值,但服务器在存储该值之前将其向下舍入为 8 的下一个较小倍数。(例外:调试服务器不执行此类舍入。)无论服务器如何构建,默认值都是 512,最大允许值为 524280。
命令行格式 | --slave-checkpoint-period=# |
---|---|
系统变量 | slave_checkpoint_period |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 300 |
最小值 | 1 |
最大值 | 4294967295 |
单元 | 毫秒 |
设置调用检查点操作以更新多线程副本的状态之前允许经过的最长时间(以毫秒为单位),如 所示?SHOW SLAVE STATUS。设置此变量对未启用多线程的副本没有影响。设置此变量会立即对所有复制通道生效,包括正在运行的通道。
NDB Cluster 目前不支持多线程副本,它会默默地忽略此变量的设置。有关详细信息,请参阅?NDB Cluster Replication 中的已知问题。
该变量与系统变量结合使用?slave_checkpoint_group?,当超出任一限制时,将执行检查点,并重置跟踪事务数量和自上一个检查点以来经过的时间的计数器。
该变量的最小允许值为 1,除非服务器是使用 构建的?-DWITH_DEBUG,在这种情况下最小值为 0。无论服务器如何构建,默认值都是 300 毫秒,最大可能值为 4294967295 毫秒(约 49.7 天)。
命令行格式 | --slave-compressed-protocol[={OFF|ON}] |
---|---|
系统变量 | slave_compressed_protocol |
范围 | 全球的 |
动态的 | 是的 |
类型 | 布尔值 |
默认值 | OFF |
如果源和副本都支持,是否使用源/副本协议的压缩。如果禁用此变量(默认),则连接将被解压缩。对此变量的更改将在后续连接尝试中生效;这包括在发出?START SLAVE语句之后,以及由正在运行的复制 I/O 线程进行的重新连接(例如,在设置 语句MASTER_RETRY_COUNT
的选项 之后CHANGE MASTER TO)。另请参见连接压缩控制。
命令行格式 | --slave-exec-mode=mode |
---|---|
系统变量 | slave_exec_mode |
范围 | 全球的 |
动态的 | 是的 |
类型 | 枚举 |
默认值 |
|
有效值 |
|
控制复制线程如何解决复制期间的冲突和错误。IDEMPOTENT
?模式会抑制重复键和未找到键错误;STRICT
意味着没有发生这样的压制。
IDEMPOTENT
模式适用于 NDB Cluster Replication 的多源复制、循环复制和其他一些特殊复制场景。(有关详细信息,请参阅?NDB Cluster Replication:双向和循环复制和?NDB Cluster Replication 冲突解决。)NDB Cluster 忽略为 显式设置的任何值?slave_exec_mode,并始终将其视为IDEMPOTENT
。
在 MySQL Server 5.7 中,STRICT
?mode 是默认值。
对于除 之外的存储引擎?NDB,?IDEMPOTENT
仅当您完全确定可以安全地忽略重复键错误和键未找到错误时才应使用模式。它适用于采用多源复制或循环复制的 NDB Cluster 的故障转移场景,不建议在其他情况下使用。
命令行格式 | --slave-load-tmpdir=dir_name |
---|---|
系统变量 | slave_load_tmpdir |
范围 | 全球的 |
动态的 | 不 |
类型 | 目录名称 |
默认值 | Value of --tmpdir |
副本在其中创建临时文件的目录的名称。设置此变量会立即对所有复制通道生效,包括正在运行的通道。默认情况下,变量值等于tmpdir系统变量的值,或者在未指定系统变量时应用默认值。
当复制SQL线程复制一条?LOAD DATA语句时,它会从中继日志中提取要加载的文件到临时文件中,然后将它们加载到表中。如果源上加载的文件很大,则副本上的临时文件也很大。因此,建议使用此选项来告诉副本将临时文件放入某个具有大量可用空间的文件系统中的目录中。在这种情况下,中继日志也很大,因此您可能还需要设置?relay_log系统变量以将中继日志放置在该文件系统中。
此选项指定的目录应位于基于磁盘的文件系统(而不是基于内存的文件系统)中,以便用于复制?LOAD DATA语句的临时文件可以在计算机重新启动后继续存在。该目录也不应该是在系统启动过程中被操作系统清除的目录。但是,如果临时文件已被删除,复制现在可以在重新启动后继续。
命令行格式 | --slave-max-allowed-packet=# |
---|---|
系统变量 | slave_max_allowed_packet |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 1073741824 |
最小值 | 1024 |
最大值 | 1073741824 |
单元 | 字节 |
块大小 | 1024 |
此变量设置复制 SQL 和 I/O 线程的最大数据包大小,以便使用基于行的复制的大型更新不会因为更新超出限制而导致复制失败?max_allowed_packet。设置此变量会立即对所有复制通道生效,包括正在运行的通道。
该全局变量的值始终为 1024 的正整数倍;如果您将其设置为某个不是的值,则该值将向下舍入为 1024 的下一个最高倍数,因为它被存储或使用;设置?slave_max_allowed_packet
为 0 会导致使用 1024。(在所有此类情况下都会发出截断警告。)默认值和最大值为 1073741824 (1 GB);最小值为 1024。
命令行格式 | --slave-net-timeout=# |
---|---|
系统变量 | slave_net_timeout |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 60 |
最小值 | 1 |
最大值 | 31536000 |
单元 | 秒 |
在副本认为连接断开、中止读取并尝试重新连接之前等待来自源的更多数据或心跳信号的秒数。设置此变量不会立即生效。变量的状态适用于所有后续?START SLAVE命令。
第一次重试在超时后立即发生。重试间隔由 语句MASTER_CONNECT_RETRY
的选项 控制CHANGE MASTER TO,重新连接尝试的次数由 语句MASTER_RETRY_COUNT
的选项 限制CHANGE MASTER TO。
MASTER_HEARTBEAT_PERIOD
心跳间隔由语句的选项?控制,该间隔在连接仍然良好的情况下停止在没有数据的情况下发生连接超时?CHANGE MASTER TO。心跳间隔默认为 值的一半?slave_net_timeout,它记录在副本的连接元数据存储库中并显示在?replication_connection_configuration?性能架构表中。请注意,对值或默认设置的更改?slave_net_timeout不会自动更改心跳间隔,无论是已明确设置还是使用先前计算的默认值。如果连接超时发生更改,您还必须发出命令CHANGE MASTER TO将心跳间隔调整为适当的值,以便在连接超时之前发生。
命令行格式 | --slave-parallel-type=value |
---|---|
系统变量 | slave_parallel_type |
范围 | 全球的 |
动态的 | 是的 |
类型 | 枚举 |
默认值 | DATABASE |
有效值 |
|
使用多线程副本(slave_parallel_workers
大于 0)时,此变量指定用于决定允许哪些事务在副本上并行执行的策略。该变量对未启用多线程的副本没有影响。可能的值为:
LOGICAL_CLOCK
:作为源上同一二进制日志组提交的一部分的事务将并行应用于副本。根据时间戳跟踪事务之间的依赖关系,以在可能的情况下提供额外的并行化。设置此值后,如果?binlog_transaction_dependency_tracking?写入集可用于事务并且与时间戳相比提供改进的结果,则可以在源上使用系统变量来指定使用写入集代替时间戳进行并行化。
DATABASE
:更新不同数据库的事务是并行应用的。仅当数据被分区到多个数据库中并且在源上独立且同时更新时,此值才适用。不得存在跨数据库约束,因为副本上可能会违反此类约束。
设置后?slave_preserve_commit_order=1?,只能使用LOGICAL_CLOCK
.
如果您的复制拓扑使用多个级别的副本,LOGICAL_CLOCK
则副本远离源的每个级别可能会实现较少的并行化。您可以通过?binlog_transaction_dependency_tracking?在源上使用来指定在可能的情况下使用写入集而不是时间戳来进行并行化,从而减少这种影响。
命令行格式 | --slave-parallel-workers=# |
---|---|
系统变量 | slave_parallel_workers |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 0 |
最小值 | 0 |
最大值 | 1024 |
设置用于并行执行复制事务的应用程序线程数。将此变量设置为大于 0 的数字将创建具有此数量的应用程序线程的多线程副本。当设置为 0(默认)时,并行执行被禁用,并且副本使用单个应用程序线程。设置?slave_parallel_workers不会立即生效。变量的状态适用于所有后续START SLAVE?语句。
NDB Cluster 目前不支持多线程副本,它会默默地忽略此变量的设置。有关详细信息,请参阅?NDB Cluster Replication 中的已知问题。
多线程副本通过使用协调器线程和此变量配置的应用程序线程数来提供并行执行。事务在应用程序线程之间分配的方式由 配置?slave_parallel_type。副本并行应用的事务可能会无序提交,除非?slave_preserve_commit_order=1
。因此,检查最近执行的事务并不能保证来自源的所有先前事务都已在副本上执行。这对使用多线程副本时的日志记录和恢复有影响。例如,在多线程副本上?START SLAVE UNTIL声明仅支持使用?SQL_AFTER_MTS_GAPS
.
在 MySQL 5.7 中,在副本上启用多线程时支持事务重试。在以前的版本中,?slave_transaction_retries
?使用多线程副本时被视为等于 0。
NDB Cluster 目前不支持多线程副本。有关如何?处理此变量的设置的 更多信息,请参阅?NDB Cluster Replication 中的已知问题。NDB
命令行格式 | --slave-pending-jobs-size-max=# |
---|---|
系统变量 | slave_pending_jobs_size_max |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 16M |
最小值 | 1024 |
最大值 | 16EiB |
单元 | 字节 |
块大小 | 1024 |
对于多线程副本,此变量设置可用于保存尚未应用的事件的工作队列的最大内存量(以字节为单位)。设置此变量对未启用多线程的副本没有影响。设置此变量不会立即生效。变量的状态适用于所有后续?START SLAVE命令。
该变量的最小可能值为 1024;默认为 16MB。最大可能值为 18446744073709551615(16 艾字节)。不是 1024 的精确倍数的值在存储之前会向下舍入到 1024 的下一个最大倍数。
该变量的值是一个软限制,可以设置为匹配正常工作负载。如果异常大的事件超过此大小,则事务将被保留,直到所有工作线程都有空队列,然后再进行处理。所有后续交易都会被保留,直到大交易完成为止。
命令行格式 | --slave-preserve-commit-order[={OFF|ON}] |
---|---|
系统变量 | slave_preserve_commit_order |
范围 | 全球的 |
动态的 | 是的 |
类型 | 布尔值 |
默认值 | OFF |
对于多线程副本,此变量的设置 1 可确保事务按照副本中继日志中出现的顺序在副本上外部化,并防止已从中继日志执行的事务序列出现间隙。该变量对未启用多线程的副本没有影响。请注意,?slave_preserve_commit_order=1?不会保留非事务性 DML 更新的顺序,因此这些更新可能会在中继日志中先于它们的事务之前提交,这可能会导致间隙。
slave_preserve_commit_order=1?要求在副本上启用?--log-bin和 ,并且设置为。在更改此变量之前,必须停止所有复制线程(如果您使用多个复制通道,则适用于所有复制通道)。?--log-slave-updatesslave_parallel_typeLOGICAL_CLOCK
启用后?slave_preserve_commit_order?,执行线程会等待所有先前的事务都已提交后再提交。当线程等待其他工作人员提交其事务时,它将其状态报告为Waiting for preceding transaction to commit
。(在 MySQL 5.7.8 之前,这显示为Waiting for its turn to commit
。)在多线程副本上启用此模式可确保它永远不会进入源不处于的状态。这支持使用复制进行读取横向扩展。请参见?第 3.4 节“使用复制进行横向扩展”。
如果?slave_preserve_commit_order=0?设置,副本并行应用的事务可能会乱序提交。因此,检查最近执行的事务并不能保证来自源的所有先前事务都已在副本上执行。从副本的中继日志执行的事务序列中可能存在间隙。这对使用多线程副本时的日志记录和恢复有影响。请注意,该设置?slave_preserve_commit_order=1?可以防止间隙,但不会防止源二进制日志位置滞后(其中Exec_master_log_pos
?位于已执行交易的位置之后)。有关更多信息,请参阅?第 4.1.32 节“复制和事务不一致”?。
命令行格式 | --slave-rows-search-algorithms=value |
---|---|
系统变量 | slave_rows_search_algorithms |
范围 | 全球的 |
动态的 | 是的 |
类型 | 放 |
默认值 | TABLE_SCAN,INDEX_SCAN |
有效值 |
|
当为基于行的日志记录和复制准备批量行时,此变量控制如何搜索行以查找匹配项,特别是是否使用哈希扫描。设置此变量会立即对所有复制通道生效,包括正在运行的通道。
INDEX_SCAN
指定列表, ,?中?2 个值的以下组合的逗号分隔列表TABLE_SCAN
。HASH_SCAN
该值应为字符串,因此如果在运行时而不是在服务器启动时设置,则必须用引号引起该值。此外,该值不得包含任何空格。推荐组合(列表)及其效果如下表所示:
使用的指数/期权价值 | INDEX_SCAN,HASH_SCAN | INDEX_SCAN,TABLE_SCAN |
---|---|---|
主键或唯一键 | 索引扫描 | 索引扫描 |
(其他)钥匙 | 对索引进行哈希扫描 | 索引扫描 |
无索引 | 哈希扫描 | 表扫描 |
默认值为?INDEX_SCAN,TABLE_SCAN
,这意味着所有可以使用索引的搜索都使用索引,而没有任何索引的搜索则使用表扫描。
要对不使用主键或唯一键的任何搜索使用散列,请设置?INDEX_SCAN,HASH_SCAN
。指定?INDEX_SCAN,HASH_SCAN
与指定 具有相同的效果?INDEX_SCAN,TABLE_SCAN,HASH_SCAN
,这是允许的。
不要组合使用?TABLE_SCAN,HASH_SCAN
。此设置强制对所有搜索进行哈希处理。与 相比,它没有任何优势,并且在单个事件包含对同一行的多个更新或依赖于顺序的更新的情况下,?INDEX_SCAN,HASH_SCAN
它可能会导致“记录未找到”错误或重复键错误。
列表中指定算法的顺序与SELECTor?SHOW VARIABLES语句显示它们的顺序没有区别。
可以指定单个值,但这不是最佳选择,因为设置单个值会限制搜索仅使用该算法。特别是,?INDEX_SCAN
不建议单独设置,因为在这种情况下,如果不存在索引,则搜索根本无法找到行。
命令行格式 | --slave-skip-errors=name |
---|---|
系统变量 | slave_skip_errors |
范围 | 全球的 |
动态的 | 不 |
类型 | 细绳 |
默认值 | OFF |
有效值 |
|
通常,当副本上发生错误时,复制会停止,这使您有机会手动解决数据中的不一致问题。当语句返回变量值中列出的任何错误时,此变量会导致复制 SQL 线程继续复制。
命令行格式 | --slave-sql-verify-checksum[={OFF|ON}] |
---|---|
系统变量 | slave_sql_verify_checksum |
范围 | 全球的 |
动态的 | 是的 |
类型 | 布尔值 |
默认值 | ON |
使复制 SQL 线程使用从中继日志读取的校验和来验证数据。如果出现不匹配的情况,副本会因错误而停止。设置此变量会立即对所有复制通道生效,包括正在运行的通道。
当通过网络接受事件时,复制 I/O 线程始终读取校验和(如果可能)。
命令行格式 | --slave-transaction-retries=# |
---|---|
系统变量 | slave_transaction_retries |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 10 |
最小值 | 0 |
最大值(64 位平台) | 18446744073709551615 |
最大值(32 位平台) | 4294967295 |
如果复制 SQL 线程由于InnoDB死锁或事务的执行时间超过?InnoDBs?innodb_lock_wait_timeout或?NDBs?TransactionDeadlockDetectionTimeout?或 而 无法执行TransactionInactiveTimeout事务,它会?slave_transaction_retries?在停止并出现错误之前自动重试多次。出现非临时错误的事务不会重试。
默认值为?slave_transaction_retries?10。将该变量设置为 0 将禁用事务的自动重试。设置该变量会立即对所有复制通道(包括正在运行的通道)生效。
从 MySQL 5.7.5 开始,在副本上启用多线程时支持事务重试。在以前的版本中,?slave_transaction_retries?使用多线程副本时被视为等于 0。
性能架构表?replication_applier_status?在列中显示每个复制通道上发生的重试次数?COUNT_TRANSACTIONS_RETRIES
。
命令行格式 | --slave-type-conversions=set |
---|---|
系统变量 | slave_type_conversions |
范围 | 全球的 |
动态的 | 是的 |
类型 | 放 |
默认值 | |
有效值 |
|
控制使用基于行的复制时对副本有效的类型转换模式。在 MySQL 5.7.2 及更高版本中,其值是列表中零个或多个元素的逗号分隔集:ALL_LOSSY
,?ALL_NON_LOSSY
,?ALL_SIGNED
,?ALL_UNSIGNED
。将此变量设置为空字符串以禁止源和副本之间的类型转换。设置此变量会立即对所有复制通道生效,包括正在运行的通道。
ALL_SIGNED
并?ALL_UNSIGNED
在 MySQL 5.7.2 中添加(Bug#15831300)。有关适用于基于行的复制中属性升级和降级的类型转换模式的更多信息,请参阅?基于行的复制:属性升级和降级。
系统变量 | sql_slave_skip_counter |
---|---|
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 0 |
最小值 | 0 |
最大值 | 4294967295 |
副本应跳过的源事件数。设置该选项不会立即生效。该变量适用于下一条START SLAVE语句;下一条?START SLAVE语句还将值更改回 0。当此变量设置为非零值并且配置了多个复制通道时,该START SLAVE?语句只能与该子句一起使用。?FOR CHANNEL?
channel
此选项与基于 GTID 的复制不兼容,并且在 时不得设置为非零值?gtid_mode=ON。如果您在使用 GTID 时需要跳过事务,请?gtid_executed改为从源使用。请参阅?第 2.7.3 节“跳过事务”。
如果跳过通过设置此变量指定的事件数将导致副本在事件组的中间开始,则副本将继续跳过,直到找到下一个事件组的开头并从该点开始。有关更多信息,请参阅?第 2.7.3 节“跳过事务”。
命令行格式 | --sync-master-info=# |
---|---|
系统变量 | sync_master_info |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 10000 |
最小值 | 0 |
最大值 | 4294967295 |
此变量对副本的影响取决于副本是否?master_info_repository设置为FILE
或TABLE
,如以下段落中所述。
master_info_repository = 文件。??如果 的值sync_master_info
大于 0,则副本会在每个事件发生后将其?master.info
文件同步到磁盘(使用?fdatasync()
)?sync_master_info
。如果为0,则MySQL服务器不进行文件同步?master.info
到磁盘;相反,服务器依赖操作系统定期刷新其内容,就像处理任何其他文件一样。
master_info_repository = 表。??如果 的值sync_master_info
大于 0,则副本会在每次?sync_master_info
事件后更新其连接元数据存储库表。如果为 0,则表永远不会更新。
默认值为sync_master_info
10000。设置此变量会立即对所有复制通道生效,包括正在运行的通道。
命令行格式 | --sync-relay-log=# |
---|---|
系统变量 | sync_relay_log |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 10000 |
最小值 | 0 |
最大值 | 4294967295 |
如果该变量的值大于0,则 在每个事件写入中继日志fdatasync()
后,MySQL 服务器会将其中继日志同步到磁盘(使用 ) 。sync_relay_log
设置此变量会立即对所有复制通道生效,包括正在运行的通道。
设置sync_relay_log
为 0 会导致不同步到磁盘;在这种情况下,服务器依赖操作系统像任何其他文件一样不时刷新中继日志的内容。
值 1 是最安全的选择,因为如果发生意外停止,您最多会丢失中继日志中的一个事件。然而,它也是最慢的选择(除非磁盘有电池支持的缓存,这使得同步非常快)。有关对意外停止最具弹性的副本设置组合的信息,请参阅?第 3.2 节 “处理副本的意外停止”。
命令行格式 | --sync-relay-log-info=# |
---|---|
系统变量 | sync_relay_log_info |
范围 | 全球的 |
动态的 | 是的 |
类型 | 整数 |
默认值 | 10000 |
最小值 | 0 |
最大值 | 4294967295 |
默认值为sync_relay_log_info
?10000。设置此变量会立即对所有复制通道生效,包括正在运行的通道。
此变量对副本的影响取决于服务器的?relay_log_info_repository?设置(FILE
或?TABLE
)。如果设置为?TABLE
,则该变量的影响还取决于中继日志信息表使用的存储引擎是事务性的(如?InnoDB)还是非事务性的(MyISAM)。对于零值和大于零的值,这些因素对服务器行为的影响?sync_relay_log_info
如下:
sync_relay_log_info = 0
如果?relay_log_info_repository?设置为FILE
,则MySQL服务器不进行文件同步?relay-log.info
到磁盘;相反,服务器依赖操作系统定期刷新其内容,就像处理任何其他文件一样。
如果?relay_log_info_repository?设置为TABLE
,并且该表的存储引擎是事务性的,则该表会在每次事务后更新。(?sync_relay_log_info
在这种情况下,该设置实际上被忽略。)
如果?relay_log_info_repository?设置为TABLE
,并且该表的存储引擎不是事务性的,则该表永远不会更新。
sync_relay_log_info =?
N
?> 0
如果?relay_log_info_repository?设置为FILE
,则副本会在每次事务后将其?relay-log.info
文件同步到磁盘(使用fdatasync()
)?N
。
如果?relay_log_info_repository?设置为TABLE
,并且该表的存储引擎是事务性的,则该表会在每次事务后更新。(?sync_relay_log_info
在这种情况下,该设置实际上被忽略。)
如果?relay_log_info_repository?设置为TABLE
,并且该表的存储引擎不是事务性的,则该表将在每个?N
事件后更新。