16.1.6.3 副本服务器选项和变量

本节说明适用于副本的服务器选项和系统变量,并包含以下内容:

command lineoption file中指定选项。在服务器运行时,可以使用更改为主语句设置许多选项。使用SET指定系统变量值。

服务器 ID. 在源和每个副本上,必须设置server_id系统变量以构建范围从 1 到 232-1 的唯一复制 ID。“ Unique”table 示每个 ID 必须彼此不同。复制拓扑中的任何其他源或副本使用的 ID。示例my.cnf文件:

[mysqld]
server-id=3
副本的启动选项

本节说明用于控制副本服务器的启动选项。在服务器运行时,可以使用更改为主语句设置许多这些选项。其他选项(例如--replicate-*选项)只能在副本服务器启动时进行设置。与复制相关的系统变量将在本节后面讨论。

PropertyValue
Command-Line Format--log-warnings[=#]
DeprecatedYes
System Variablelog_warnings
ScopeGlobal
DynamicYes
TypeInteger
Default Value2
Minimum Value0
最大值(64 位平台)18446744073709551615
最大值(32 位平台)4294967295

Note

log_error_verbosity系统变量优先于--log-warnings选项或log_warnings系统变量,因此应优先使用它们。有关更多信息,请参见log_error_verbositylog_warnings的描述。 --log-warnings命令行选项和log_warnings系统变量已弃用,并将在以后的 MySQL 版本中删除。

使服务器在错误日志中记录有关其正在执行的操作的更多消息。关于复制,服务器会生成网络或连接失败后重新连接成功的警告,并提供有关每个复制线程如何启动的信息。默认情况下,此变量设置为 2.要禁用它,请将其设置为 0.如果值大于 0,服务器将记录有关对基于语句的日志记录不安全的语句的消息。如果值大于 0,则将记录新连接尝试的异常终止连接和访问被拒绝的错误。 1.参见第 B.4.2.10 节,“通信错误和中止的连接”

Note

此选项的作用不仅限于复制。它会影响整个服务器活动中的诊断消息。

PropertyValue
Command-Line Format--master-info-file=file_name
TypeFile name
Default Valuemaster.info

副本用于记录有关源信息的文件所使用的名称。数据目录中的默认名称为master.info。有关此文件格式的信息,请参见第 16.2.4.2 节“复制应用程序元数据存储库”

PropertyValue
Command-Line Format--master-retry-count=#
DeprecatedYes
TypeInteger
Default Value86400
Minimum Value0
最大值(64 位平台)18446744073709551615
最大值(32 位平台)4294967295

副本在放弃之前尝试重新连接到源的次数。默认值为 86400 次。值 0table 示“无限”,并且副本尝试永久连接。当副本达到其连接超时(由slave_net_timeout系统变量指定)而未从源接收数据或心跳 signal 时,将触发重新连接尝试。尝试以更改为主语句的MASTER_CONNECT_RETRY选项设置的间隔(默认为每 60 秒)尝试重新连接。

该选项已被弃用,并将在将来的 MySQL 版本中删除。请改用更改为主语句的MASTER_RETRY_COUNT选项。

PropertyValue
Command-Line Format--max-relay-log-size=#
System Variablemax_relay_log_size
ScopeGlobal
DynamicYes
TypeInteger
Default Value0
Minimum Value0
Maximum Value1073741824

服务器自动旋转中继日志文件的大小。如果该值不为零,则当继电器日志的大小超过该值时,它将自动旋转。如果该值为零(默认值),则发生继电器日志旋转的大小由值max_binlog_size确定。有关更多信息,请参见第 16.2.4.1 节“中继日志”

PropertyValue
Command-Line Format--relay-log-purge[={OFF|ON}]
System Variablerelay_log_purge
ScopeGlobal
DynamicYes
TypeBoolean
Default ValueON

不再需要中继日志时,请禁用或启用它们的自动清除。默认值为 1(启用)。这是一个全局变量,可以使用SET GLOBAL relay_log_purge = N进行动态更改。启用--relay-log-recovery选项时,禁用中继日志清除将使数据一致性受到威胁。

PropertyValue
Command-Line Format--relay-log-space-limit=#
System Variablerelay_log_space_limit
ScopeGlobal
DynamicNo
TypeInteger
Default Value0
Minimum Value0
最大值(64 位平台)18446744073709551615
最大值(32 位平台)4294967295

此选项对副本上所有中继日志的总大小(以字节为单位)设置上限。值 0table 示“无限制”。这对于磁盘空间有限的副本服务器主机很有用。达到限制后,复制 I/O 线程将停止从源读取二进制日志事件,直到复制 SQL 线程赶上并删除一些未使用的中继日志为止。请注意,此限制不是绝对的:在某些情况下,SQL 线程需要更多事件才能删除中继日志。在那种情况下,I/O 线程会超出限制,直到 SQL 线程有可能删除某些中继日志为止,因为不这样做会导致死锁。您不应将--relay-log-space-limit设置为小于--max-relay-log-size值的两倍(如果--max-relay-log-size为 0 则为--max-binlog-size)。在这种情况下,由于超出了--relay-log-space-limit,因此 I/O 线程有可能 await 可用空间,但是 SQL 线程没有要清除的中继日志,因此无法满足 I/O 线程。这将强制 I/O 线程暂时忽略--relay-log-space-limit

PropertyValue
Command-Line Format--replicate-do-db=name
TypeString

使用数据库名称创建复制过滤器。也可以使用更改复制过滤器 REPLICATE_DO_DB创建此类过滤器。此筛选的确切效果取决于是否使用基于语句的复制或基于行的复制,并将在接下来的几段中进行介绍。

Note

复制过滤器不能用于配置为组复制的 MySQL 服务器实例上,因为在某些服务器上过滤事务将使组无法在一致状态下达成协议。

基于语句的复制. 告诉复制 SQL 线程将复制限制为默认数据库(即USE选择的数据库为* db_name )的语句。要指定多个数据库,请多次使用此选项,每个数据库一次;但是,这样做不会在选择其他数据库(或未选择数据库)的情况下复制 UPDATE some_db.some_table SET foo='bar'之类的跨数据库语句。

Warning

要指定多个数据库,您必须使用此选项的多个实例。因为数据库名称可以包含逗号,所以如果提供逗号分隔的列 table,则该列 table 将被视为单个数据库的名称。

一个使用基于语句的复制时可能无法正常工作的示例:如果副本以--replicate-do-db=sales开头,并且您在源上发出以下语句,则UPDATE语句“不”被复制:

USE prices;
UPDATE sales.january SET amount=amount+1000;

出现这种“仅检查默认数据库”行为的主要原因是,仅凭语句很难知道是否应该复制它(例如,如果您使用的是多 tableDELETE语句或多 tableUPDATE语句来执行操作跨多个数据库)。如果不需要,则仅检查默认数据库而不是所有数据库的速度也更快。

基于行的复制. 告诉复制 SQL 线程将复制限制为数据库* db_name 。仅属于 db_name *的 table 被更改;当前数据库对此没有影响。假定副本以--replicate-do-db=sales开始,并且基于行的复制生效,然后在源上运行以下语句:

USE prices;
UPDATE sales.february SET amount=amount+100;

副本sales数据库中的februarytable 根据UPDATE语句进行了更改;无论是否发出USE语句,都会发生这种情况。但是,在使用基于行的复制和--replicate-do-db=sales时,在源上发出以下语句对副本没有影响:

USE prices;
UPDATE prices.march SET amount=amount-25;

即使将USE prices语句更改为USE salesUPDATE语句的效果仍然不会被复制。

与基于行的复制相反,在基于语句的复制中处理--replicate-do-db的另一个重要区别在于引用多个数据库的语句。假设副本以--replicate-do-db=db1开头,并且以下语句在源上执行:

USE db1;
UPDATE db1.table1 SET col1 = 10, db2.table2 SET col2 = 20;

如果使用的是基于语句的复制,则两个 table 都会在副本上更新。但是,在使用基于行的复制时,副本上只有table1受影响;反之亦然。由于table2在另一个数据库中,因此副本table2不会被UPDATE更改。现在假设使用USE db4语句代替USE db1语句:

USE db4;
UPDATE db1.table1 SET col1 = 10, db2.table2 SET col2 = 20;

在这种情况下,使用基于语句的复制时,UPDATE语句对副本没有影响。但是,如果您使用的是基于行的复制,则UPDATE会更改副本上的table1而不是table2-换句话说,仅更改由--replicate-do-db命名的数据库中的 table,并且默认数据库的选择对此没有影响。行为。

如果需要跨数据库更新才能正常工作,请改用--replicate-wild-do-table=db_name.%。参见第 16.2.5 节“服务器如何评估复制过滤规则”

Note

此选项以与--binlog-do-db影响二进制日志记录相同的方式影响复制,复制格式对--replicate-do-db如何影响复制行为的影响与日志记录格式对--binlog-do-db行为的影响相同。

此选项对BEGINCOMMITROLLBACK语句无效。

PropertyValue
Command-Line Format--replicate-ignore-db=name
TypeString

使用数据库名称创建复制过滤器。也可以使用更改复制过滤器 REPLICATE_IGNORE_DB创建此类过滤器。与--replicate-do-db一样,此筛选的确切效果取决于是否使用基于语句的复制或基于行的复制,并将在接下来的几段中进行介绍。

Note

复制过滤器不能用于配置为组复制的 MySQL 服务器实例上,因为在某些服务器上过滤事务将使组无法在一致状态下达成协议。

基于语句的复制. 告诉复制 SQL 线程不要复制默认数据库(即USE选择的数据库)为* db_name *的任何语句。

基于行的复制. 告诉复制 SQL 线程不要更新数据库中的任何 tabledb_name *。默认数据库无效。

当使用基于语句的复制时,以下示例无法正常工作。假设副本以--replicate-ignore-db=sales开头,并且在源上发出以下语句:

USE prices;
UPDATE sales.january SET amount=amount+1000;

在这种情况下,将复制UPDATE语句*,因为--replicate-ignore-db仅适用于默认数据库(由USE语句确定)。由于sales数据库是在语句中显式指定的,因此该语句尚未过滤。但是,在使用基于行的复制时,UPDATE语句的效果不会传播到副本,并且sales.januarytable 的副本副本不会更改;在这种情况下,--replicate-ignore-db=sales导致sales数据库的源副本中对 table 所做的“所有”更改被副本忽略。

要指定多个要忽略的数据库,请多次使用此选项,每个数据库一次。因为数据库名称可以包含逗号,所以如果提供逗号分隔的列 table,则该列 table 将被视为单个数据库的名称。

如果您正在使用跨数据库更新,并且您不希望复制这些更新,则不应使用此选项。参见第 16.2.5 节“服务器如何评估复制过滤规则”

如果需要跨数据库更新才能正常工作,请改用--replicate-wild-ignore-table=db_name.%。参见第 16.2.5 节“服务器如何评估复制过滤规则”

Note

此选项以与--binlog-ignore-db影响二进制日志记录相同的方式影响复制,复制格式对--replicate-ignore-db如何影响复制行为的影响与日志记录格式对--binlog-ignore-db行为的影响相同。

此选项对BEGINCOMMITROLLBACK语句无效。

PropertyValue
Command-Line Format--replicate-do-table=name
TypeString

通过告诉复制 SQL 线程将复制限制到给定 table 来创建复制筛选器。要指定多个 table,请多次使用此选项,每个 table 一次。与--replicate-do-db相比,这适用于跨数据库更新和默认数据库更新。参见第 16.2.5 节“服务器如何评估复制过滤规则”。您也可以通过发出更改复制过滤器 REPLICATE_DO_TABLE语句来创建此类过滤器。

Note

复制过滤器不能用于配置为组复制的 MySQL 服务器实例上,因为在某些服务器上过滤事务将使组无法在一致状态下达成协议。

此选项仅影响适用于 table 的语句。它不会影响仅适用于其他数据库对象的语句,例如存储的例程。要过滤对存储的例程进行操作的语句,请使用一个或多个--replicate-*-db选项。

PropertyValue
Command-Line Format--replicate-ignore-table=name
TypeString

通过告诉复制 SQL 线程不要复制任何更新指定 table 的语句来创建复制过滤器,即使同一 table 可能会更新任何其他 table。要指定多个要忽略的 table,请多次使用此选项,每个 table 一次。与--replicate-ignore-db相反,这适用于跨数据库更新。参见第 16.2.5 节“服务器如何评估复制过滤规则”。您也可以通过发出更改复制过滤器 REPLICATE_IGNORE_TABLE语句来创建此类过滤器。

Note

复制过滤器不能用于配置为组复制的 MySQL 服务器实例上,因为在某些服务器上过滤事务将使组无法在一致状态下达成协议。

此选项仅影响适用于 table 的语句。它不会影响仅适用于其他数据库对象的语句,例如存储的例程。要过滤对存储的例程进行操作的语句,请使用一个或多个--replicate-*-db选项。

PropertyValue
Command-Line Format--replicate-rewrite-db=old_name->new_name
TypeString

告诉副本创建一个复制过滤器,如果源上的数据库是from_name ,则该复制过滤器会将指定的数据库转换为 to_name *。仅涉及 table 的语句会受影响,而不会影响诸如CREATE DATABASEDROP DATABASEALTER DATABASE之类的语句。

要指定多个重写,请多次使用此选项。服务器使用第一个具有* from_name *值匹配的值。在测试--replicate-*规则之前,数据库名称转换已完成。您也可以通过发出更改复制过滤器 REPLICATE_REWRITE_DB语句来创建此类过滤器。

如果您在命令行上使用--replicate-rewrite-db选项,而>字符是命令解释器的特殊字符,请引用选项值。例如:

shell> mysqld --replicate-rewrite-db="olddb->newdb"

--replicate-rewrite-db选项的效果因查询使用基于语句的还是基于行的二进制日志记录格式而异。使用基于语句的格式,DML 语句将根据USE语句指定的当前数据库进行转换。使用基于行的格式,DML 语句将基于已修改 table 所在的数据库进行翻译。不管二进制日志记录格式如何,总是根据USE语句指定的当前数据库过滤 DDL 语句。

为确保重写产生预期的结果,尤其是与其他复制筛选选项结合使用时,请在使用--replicate-rewrite-db选项时遵循以下建议:

  • 在源和具有不同名称的副本上手动创建* from_name to_name *数据库。

    • 如果您使用基于语句的或混合的二进制日志记录格式,请不要使用跨数据库查询,也不要在查询中指定数据库名称。对于 DDL 和 DML 语句,都依赖USE语句指定当前数据库,并且在查询中仅使用 table 名。

    • 如果仅对 DDL 语句使用基于行的二进制日志记录格式,请依靠USE语句指定当前数据库,并且仅在查询中使用 table 名。对于 DML 语句,可以根据需要使用完全限定的 table 名(* db . table *)。

如果遵循这些建议,则可以安全地将--replicate-rewrite-db选项与 table 级复制过滤选项(例如--replicate-do-table)结合使用。

Note

全局复制筛选器不能在配置用于组复制的 MySQL 服务器实例上使用,因为在某些服务器上筛选事务将使组无法就一致状态达成协议。

PropertyValue
Command-Line Format--replicate-same-server-id[={OFF|ON}]
TypeBoolean
Default ValueOFF

在副本服务器上使用。通常,应使用默认设置 0,以防止循环复制引起的无限循环。如果设置为 1,则副本不会跳过具有其自己的服务器 ID 的事件。通常,这仅在很少的配置中有用。如果启用了log_slave_updates,则不能设置为 1.默认情况下,如果复制 I/O 线程具有副本的服务器 ID,则它们不会将二进制日志事件写入中继日志(此优化有助于节省磁盘使用量)。如果要使用--replicate-same-server-id,请确保使用此选项启动副本,然后再让副本读取要执行复制 SQL 线程的事件。

PropertyValue
Command-Line Format--replicate-wild-do-table=name
TypeString

通过告诉复制 SQL 线程将复制限制为其中任何更新的 table 与指定的数据库和 table 名称模式匹配的语句,从而创建复制筛选器。模式可以包含%_通配符,其含义与LIKE模式匹配运算符的含义相同。要指定多个 table,请多次使用此选项,每个 table 一次。这适用于跨数据库更新。参见第 16.2.5 节“服务器如何评估复制过滤规则”。您也可以通过发出更改复制过滤器 REPLICATE_WILD_DO_TABLE语句来创建此类过滤器。

Note

复制过滤器不能用于配置为组复制的 MySQL 服务器实例上,因为在某些服务器上过滤事务将使组无法在一致状态下达成协议。

此选项适用于 table,视图和触发器。它不适用于存储过程和功能或事件。要过滤对后一个对象操作的语句,请使用一个或多个--replicate-*-db选项。

例如,--replicate-wild-do-table=foo%.bar%仅复制使用 table 的更新,该 table 的数据库名称以foo开头,而 table 名称以bar开头。

如果 table 名模式为%,则它与任何 table 名匹配,并且该选项也适用于数据库级语句(CREATE DATABASEDROP DATABASEALTER DATABASE)。例如,如果使用--replicate-wild-do-table=foo%.%,并且数据库名称与模式foo%匹配,则复制数据库级语句。

要在数据库或 table 名称模式中包含 Literals 通配符,请使用反斜杠对其进行转义。例如,要复制名为my_own%db的数据库的所有 table,但不从my1ownAABCdb数据库复制 table,则应转义_%字符,如下所示:--replicate-wild-do-table=my_own%db。如果在命令行上使用选项,则可能需要加倍反斜杠或引用选项值,具体取决于命令解释器。例如,对于 bash Shell,您需要 Importing--replicate-wild-do-table=my\_own\%db

PropertyValue
Command-Line Format--replicate-wild-ignore-table=name
TypeString

创建一个复制过滤器,以防止复制 SQL 线程复制任何 table 与给定通配符模式匹配的语句。要指定多个要忽略的 table,请多次使用此选项,每个 table 一次。这适用于跨数据库更新。参见第 16.2.5 节“服务器如何评估复制过滤规则”。您也可以通过发出更改复制过滤器 REPLICATE_WILD_IGNORE_TABLE语句来创建此类过滤器。

Note

复制过滤器不能用于配置为组复制的 MySQL 服务器实例上,因为在某些服务器上过滤事务将使组无法在一致状态下达成协议。

例如,--replicate-wild-ignore-table=foo%.bar%不复制使用 table 的更新,该 table 的数据库名称以foo开头,而 table 名称以bar开头。

有关匹配的工作原理的信息,请参见--replicate-wild-do-table选项的描述。在选项值中包括 Literals 通配符的规则也与--replicate-wild-ignore-table相同。

PropertyValue
Command-Line Format--skip-slave-start[={OFF|ON}]
TypeBoolean
Default ValueOFF

指示副本服务器启动时不启动复制线程。要稍后启动线程,请使用START SLAVE语句。

PropertyValue
Command-Line Format--slave-skip-errors=name
System Variableslave_skip_errors
ScopeGlobal
DynamicNo
TypeString
Default ValueOFF
Valid ValuesOFF

[list of error codes]
all
ddl_exist_errors

通常,当副本上发生错误时,复制会停止,这使您有机会手动解决数据中的不一致问题。当语句返回选项值中列出的任何错误时,此选项会使复制 SQL 线程 continue 复制。

除非您完全理解为什么会出错,否则不要使用此选项。如果复制设置和 Client 端程序中没有错误,而 MySQL 本身中也没有错误,则永远不会发生停止复制的错误。不加选择地使用此选项会导致副本无可救药地与源同步,而您不知道为什么会发生这种情况。

对于错误代码,应在副本的错误日志和显示从站状态的输出中使用错误消息提供的数字。 附录 B,错误消息和常见问题,列出服务器错误代码。

简写值ddl_exist_errors等效于错误代码列 table1007,1008,1050,1051,1054,1060,1061,1068,1094,1146

您也可以(但不应该)使用非常不推荐的值all来使副本忽略所有错误消息,并且无论发生什么都会 continue 进行。不用说,如果使用all,则不能保证数据的完整性。在这种情况下,如果副本的数据与源中的数据不一致,请不要抱怨(或提交文件错误报告)。 你被警告了

Examples:

--slave-skip-errors=1062,1053
--slave-skip-errors=all
--slave-skip-errors=ddl_exist_errors

PropertyValue
Command-Line Format--slave-sql-verify-checksum[={OFF|ON}]
TypeBoolean
Default ValueON

启用此选项后,副本将检查从中继日志读取的校验和。如果不匹配,则副本会因错误而停止。

MySQL 测试套件在内部使用以下选项进行复制测试和调试。它们不适用于生产环境。

PropertyValue
Command-Line Format--abort-slave-event-count=#
TypeInteger
Default Value0
Minimum Value0

当此选项设置为 0(默认值)以外的某个正整数* value *时,它将影响复制行为,如下所示:复制 SQL 线程启动后,允许value *日志事件被执行;之后,复制 SQL 线程将不再接收任何事件,就像切断了源网络连接一样。复制 SQL 线程 continue 运行,并且显示从站状态的输出在Slave_IO_RunningSlave_SQL_Running列中都显示Yes,但是没有从中继日志中读取其他事件。

PropertyValue
Command-Line Format--disconnect-slave-event-count=#
TypeInteger
Default Value0
用于将副本状态记录到 table 的选项

MySQL 5.7 支持将复制元数据记录到 table 而不是文件中。可以使用以下两个系统变量分别配置源元数据存储库和副本元数据存储库的写入:

有关这些变量的信息,请参见第 16.1.6.3 节“ Replica 服务器选项和变量”

这些变量可用于使副本对意外停止具 Elastic。有关更多信息,请参见第 16.3.2 节“处理副本意外停止”

信息日志 table 及其内容被认为是给定 MySQL 服务器本地的。它们不会被复制,对它们的更改也不会写入二进制日志。

有关更多信息,请参见第 16.2.4 节“中继日志和复制应用程序元数据存储库”

复制副本上使用的系统变量

下 table 描述了用于控制副本服务器的系统变量。可以在服务器启动时设置它们,其中一些可以在运行时使用SET进行更改。本节前面列出了与副本一起使用的服务器选项。

PropertyValue
Command-Line Format--init-slave=name
System Variableinit_slave
ScopeGlobal
DynamicYes
TypeString

此变量类似于init_connect,但是它是复制服务器每次启动复制 SQL 线程时要执行的字符串。字符串的格式与init_connect变量的格式相同。该变量的设置对随后的START SLAVE语句生效。

Note

复制 SQL 线程在执行init_slave之前将确认发送给 Client 端。因此,不能保证START SLAVE返回时已执行init_slave。有关更多信息,请参见第 13.4.2.5 节“ START SLAVE 语句”

PropertyValue
Command-Line Format--log-slow-slave-statements[={OFF|ON}]
System Variablelog_slow_slave_statements
ScopeGlobal
DynamicYes
TypeBoolean
Default ValueOFF

启用慢速查询日志后,此变量将启用日志记录,以记录在副本上执行的时间超过long_query_time秒的查询。请注意,如果正在使用基于行的复制(binlog_format=ROW),则log_slow_slave_statements无效。仅当以二进制格式的语句格式记录查询时,即设置为binlog_format=STATEMENT或设置为binlog_format=MIXED且语句以语句格式记录时,查询才会添加到副本的慢速查询日志中。设置为binlog_format=MIXED时以行格式记录的慢速查询或设置为binlog_format=ROW时记录的慢速查询不会添加到副本的慢速查询日志中,即使启用log_slow_slave_statements也是如此。

设置log_slow_slave_statements不会立即生效。变量的状态适用于所有后续START SLAVE语句。另请注意,long_query_time的全局设置适用于 SQL 线程的生存期。如果更改了该设置,则必须停止并重新启动复制 SQL 线程才能在此处实施更改(例如,通过使用SQL_THREAD选项发出STOP SLAVESTART SLAVE语句)。

PropertyValue
Command-Line Format--master-info-repository={FILE|TABLE}
System Variablemaster_info_repository
ScopeGlobal
DynamicYes
TypeString
Default ValueFILE
Valid ValuesFILE

TABLE

此变量的设置确定副本服务器是将源状态和连接信息记录到FILE(master.info)还是TABLE(mysql.slave_master_info)。仅当没有执行复制线程时,才可以更改此变量的值。

此变量的设置还直接影响sync_master_info系统变量的设置;有关更多信息,请参见该变量说明。

对于FILE日志记录,您可以使用--master-info-file服务器选项更改文件名。

在配置多个复制通道之前,必须将此变量设置为TABLE。如果使用多个复制通道,则不能将值设置回FILE

PropertyValue
Command-Line Format--max-relay-log-size=#
System Variablemax_relay_log_size
ScopeGlobal
DynamicYes
TypeInteger
Default Value0
Minimum Value0
Maximum Value1073741824

如果副本对其中继日志进行写操作导致当前日志文件大小超过此变量的值,则副本将旋转中继日志(关闭当前文件并打开下一个文件)。如果max_relay_log_size为 0,则服务器将max_binlog_size用于二进制日志和中继日志。如果max_relay_log_size大于 0,它将限制中继日志的大小,这使您可以为两个日志设置不同的大小。您必须将max_relay_log_size设置为 4096 字节至 1GB(含)之间,或设置为 0.默认值为 0.请参见第 16.2.2 节“复制实现的详细信息”

PropertyValue
Command-Line Format--relay-log=file_name
System Variablerelay_log
ScopeGlobal
DynamicNo
TypeFile name

中继日志文件的基本名称。对于默认复制通道,中继日志的默认基本名称是host_name-relay-bin。对于非默认复制通道,中继日志的默认基本名称是host_name-relay-bin-channel,其中* channel *是此中继日志中记录的复制通道的名称。

服务器将文件写入数据目录中,除非给基本名称提供前导的绝对路径名以指定其他目录。服务器通过在基本名称中添加数字后缀来依次创建中继日志文件。

由于 MySQL 解析服务器选项的方式,如果在服务器启动时指定此变量,则必须提供一个值。 仅当未实际指定选项时才使用默认基本名称。如果在服务器启动时指定relay_log系统变量而未指定值,则可能会导致意外行为;否则,可能会导致意外行为。此行为取决于使用的其他选项,指定它们的 Sequences 以及是否在命令行或选项文件中指定它们。有关 MySQL 如何处理服务器选项的更多信息,请参见第 4.2.2 节“指定程序选项”

如果指定此变量,则指定的值还将用作中继日志索引文件的基本名称。您可以通过使用relay_log_index系统变量指定其他中继日志索引文件基本名称来覆盖此行为。

服务器从索引文件读取条目时,将检查条目是否包含相对路径。如果是这样,则将路径的相对部分替换为使用relay_log系统变量设置的绝对路径。绝对路径保持不变;在这种情况下,必须手动编辑索引以启用新路径。

您可能会发现relay_log系统变量对于执行以下任务很有用:

  • 创建名称独立于主机名的中继日志。

    • 如果您需要将中继日志放置在数据目录之外的其他区域,因为您的中继日志往往很大,并且您不想减少max_relay_log_size

    • 通过使用磁盘之间的负载平衡来提高速度。

您可以从relay_log_basename系统变量中获取中继日志文件名(和路径)。

PropertyValue
System Variablerelay_log_basename
ScopeGlobal
DynamicNo
TypeFile name
Default Valuedatadir + '/' + hostname + '-relay-bin'

保留中继日志文件的名称和完整路径。该变量由服务器设置,并且是只读的。

PropertyValue
Command-Line Format--relay-log-index=file_name
System Variablerelay_log_index
ScopeGlobal
DynamicNo
TypeFile name
Default Value*host_name*-relay-bin.index

中继日志索引文件的名称。对于默认的复制通道,默认名称为host_name-relay-bin.index。对于非默认复制通道,默认名称为host_name-relay-bin-channel.index,其中* channel *是此中继日志索引中记录的复制通道的名称。

服务器将文件写入数据目录中,除非该名称以开头的绝对路径名指定以指定其他目录。名称。

由于 MySQL 解析服务器选项的方式,如果在服务器启动时指定此变量,则必须提供一个值。 仅当未实际指定选项时才使用默认基本名称。如果在服务器启动时指定relay_log_index系统变量而未指定值,则可能会导致意外行为;否则,可能会导致意外行为。此行为取决于使用的其他选项,指定它们的 Sequences 以及是否在命令行或选项文件中指定它们。有关 MySQL 如何处理服务器选项的更多信息,请参见第 4.2.2 节“指定程序选项”

PropertyValue
Command-Line Format--relay-log-info-file=file_name
System Variablerelay_log_info_file
ScopeGlobal
DynamicNo
TypeFile name
Default Valuerelay-log.info

relay_log_info_repository=FILE时,副本在其中记录有关中继日志信息的文件的名称。如果relay_log_info_repository=TABLE,则是在存储库更改为FILE的情况下将使用的文件名。数据目录中的默认名称为relay-log.info

PropertyValue
Command-Line Format--relay-log-info-repository=value
System Variablerelay_log_info_repository
ScopeGlobal
DynamicYes
TypeString
Default ValueFILE
Valid ValuesFILE

TABLE

此变量确定副本在中继日志中的位置是写入FILE(relay-log.info)还是写入TABLE(mysql.slave_relay_log_info)。仅当没有执行复制线程时,才可以更改此变量的值。

此变量的设置还直接影响sync_relay_log_info系统变量的设置;有关更多信息,请参见该变量说明。

在配置多个复制通道之前,必须将此变量设置为TABLE。如果使用多个复制通道,则无法将值设置回FILE

PropertyValue
Command-Line Format--relay-log-purge[={OFF|ON}]
System Variablerelay_log_purge
ScopeGlobal
DynamicYes
TypeBoolean
Default ValueON

一旦不再需要中继日志文件,则禁用或启用它们的自动清除。默认值为 1(ON)。

PropertyValue
Command-Line Format--relay-log-recovery[={OFF|ON}]
System Variablerelay_log_recovery
ScopeGlobal
DynamicNo
TypeBoolean
Default ValueOFF

如果启用,此变量将在服务器启动后立即启用自动中继日志恢复。恢复过程将创建一个新的中继日志文件,将 SQL 线程位置初始化为该新的中继日志,并将 I/O 线程初始化为 SQL 线程位置。然后 continue 从源中读取中继日志。该全局变量在运行时为只读。可以在副本启动时使用--relay-log-recovery选项设置其值,该副本应在副本意外停止后使用,以确保不会处理任何可能损坏的中继日志。可以启用此选项以使副本可以应对意外的暂停。有关更多信息,请参见第 16.3.2 节“处理副本意外停止”

此变量还与relay_log_purge变量交互,该变量控制不再需要的日志清除。禁用relay_log_purge时启用relay_log_recovery可能会导致从尚未清除的文件中读取中继日志,从而导致数据不一致。

当使用多线程副本(换言之slave_parallel_workers大于 0)时,从中继日志执行的事务序列中可能会出现诸如间隙之类的不一致性。存在不一致时启用relay_log_recovery会导致错误,并且该选项无效。在这种情况下,解决方案是发出从开始直到 SQL_AFTER_MTS_GAPS,这会使服务器进入更一致的状态,然后发出RESET SLAVE删除中继日志。有关更多信息,请参见第 16.4.1.32 节,“复制和事务不一致”

Note

此变量不会影响以下组复制通道:

  • group_replication_applier

  • group_replication_recovery

在组上运行的任何其他通道都会受到影响,例如从外部源或另一个组复制的通道。

PropertyValue
Command-Line Format--relay-log-space-limit=#
System Variablerelay_log_space_limit
ScopeGlobal
DynamicNo
TypeInteger
Default Value0
Minimum Value0
最大值(64 位平台)18446744073709551615
最大值(32 位平台)4294967295

所有中继日志使用的最大空间量。

PropertyValue
Command-Line Format--report-host=host_name
System Variablereport_host
ScopeGlobal
DynamicNo
TypeString

在副本注册期间要报告给源的副本的主机名或 IP 地址。此值出现在源服务器上的显示从主机的输出中。如果您不希望副本将自身注册到源,请将该值保留为 unset。

Note

副本连接后,源仅从 TCP/IP 套接字读取副本的 IP 地址是不够的。由于 NAT 和其他路由问题,该 IP 可能无效,无法从源或其他主机连接到副本。

PropertyValue
Command-Line Format--report-password=name
System Variablereport_password
ScopeGlobal
DynamicNo
TypeString

在副本注册期间要报告给源的副本的复制用户帐户密码。如果源以--show-slave-auth-info开头,则此值显示在源服务器上的显示从主机的输出中。

尽管此变量的名称可能暗示其他含义,但report_password未连接到 MySQL 用户特权系统,因此不一定(或什至可能)与 MySQL 复制用户帐户的密码相同。

PropertyValue
Command-Line Format--report-port=port_num
System Variablereport_port
ScopeGlobal
DynamicNo
TypeInteger
Default Value[slave_port]
Minimum Value0
Maximum Value65535

用于连接到副本的 TCP/IP 端口号,将在副本注册期间报告给源。仅当副本在非默认端口上侦听或从源或其他 Client 端到副本有特殊隧道时,才设置此选项。如果不确定,请不要使用此选项。

此选项的默认值是副本实际使用的端口号。这也是显示从主机显示的默认值。

PropertyValue
Command-Line Format--report-user=name
System Variablereport_user
ScopeGlobal
DynamicNo
TypeString

在副本注册期间要报告给源的副本的帐户用户名。如果源以--show-slave-auth-info开头,则此值显示在源服务器上的显示从主机的输出中。

尽管此变量的名称可能暗示其他含义,但是report_user未连接到 MySQL 用户特权系统,因此不一定(或什至可能)与 MySQL 复制用户帐户的名称相同。

PropertyValue
Command-Line Format--rpl-semi-sync-slave-enabled[={OFF|ON}]
System Variablerpl_semi_sync_slave_enabled
ScopeGlobal
DynamicYes
TypeBoolean
Default ValueOFF

控制是否在副本上启用半同步复制。要启用或禁用插件,请将此变量分别设置为ONOFF(或 1 或 0)。默认值为OFF

仅当安装了副本端半同步复制插件时,此变量才可用。

PropertyValue
Command-Line Format--rpl-semi-sync-slave-trace-level=#
System Variablerpl_semi_sync_slave_trace_level
ScopeGlobal
DynamicYes
TypeInteger
Default Value32

副本上的半同步复制调试跟踪级别。有关允许的值,请参见rpl_semi_sync_master_trace_level

仅当安装了副本端半同步复制插件时,此变量才可用。

PropertyValue
Command-Line Format--rpl-stop-slave-timeout=seconds
System Variablerpl_stop_slave_timeout
ScopeGlobal
DynamicYes
TypeInteger
Default Value31536000
Minimum Value2
Maximum Value31536000

您可以通过设置此变量来控制STOP SLAVE在超时之前 await 的时间长度(以秒为单位)。这可以用来避免STOP SLAVE与其他 SQL 语句之间使用不同 Client 端连接到副本的死锁。

rpl_stop_slave_timeout的最大值和默认值为 31536000 秒(1 年)。最小为 2 秒。对该变量所做的更改将对后续的STOP SLAVE语句生效。

此变量仅影响发出STOP SLAVE语句的 Client 端。当达到超时时,发出 Client 端返回一条错误消息,指出命令执行不完整。然后,Client 端停止 await 复制线程停止,但是复制线程 continue 尝试停止,并且STOP SLAVE指令仍然有效。一旦复制线程不再繁忙,就执行STOP SLAVE语句,并且副本停止。

PropertyValue
Command-Line Format--slave-checkpoint-group=#
System Variableslave_checkpoint_group
ScopeGlobal
DynamicYes
TypeInteger
Default Value512
Minimum Value32
Maximum Value524280
Block Size8

设置在调用检查点操作以更新其状态之前,多线程副本可以处理的最大事务数,如显示从站状态所示。设置此变量对未启用多线程的副本无效。设置此变量不会立即生效。变量的状态适用于所有后续START SLAVE命令。

Note

NDB 群集当前不支持多线程副本,它会静默忽略此变量的设置。有关更多信息,请参见第 21.6.3 节“ NDB 群集复制中的已知问题”

该变量与slave_checkpoint_period系统变量结合使用,从而当超出任一限制时,将执行检查点,并且将重置自上一个检查点以来的事务数量和经过的时间的计数器都将被重置。

除非使用-DWITH_DEBUG构建服务器,否则此变量的最小允许值为 32.在这种情况下,最小值为 1.有效值始终是 8 的倍数;有效值始终是 8 的倍数。您可以将其设置为非整数倍的值,但是服务器会在存储该值之前将其四舍五入为下一个较低的 8 的倍数。 (* Exception *:调试服务器不执行这种舍入操作.)无论服务器是如何构建的,默认值为 512,最大允许值为 524280.

PropertyValue
Command-Line Format--slave-checkpoint-period=#
System Variableslave_checkpoint_period
ScopeGlobal
DynamicYes
TypeInteger
Default Value300
Minimum Value1
Maximum Value4G
Unitmilliseconds

设置在调用检查点操作以更新多线程副本的状态之前允许通过的最长时间(以毫秒为单位),如显示从站状态所示。设置此变量对未启用多线程的副本无效。设置此变量将立即对所有复制通道(包括正在运行的通道)生效。

Note

NDB 群集当前不支持多线程副本,它会静默忽略此变量的设置。有关更多信息,请参见第 21.6.3 节“ NDB 群集复制中的已知问题”

该变量与slave_checkpoint_group系统变量结合使用,从而当超出任一限制时,将执行检查点,并且将重置自上一个检查点以来的事务数量和经过的时间的计数器都将被重置。

除非使用-DWITH_DEBUG构建服务器,否则此变量的最小允许值为 1,在这种情况下,最小值为 0.无论构建服务器的方式如何,默认值为 300,最大可能值为 4294967296(4GB )。

PropertyValue
Command-Line Format--slave-compressed-protocol[={OFF|ON}]
System Variableslave_compressed_protocol
ScopeGlobal
DynamicYes
TypeBoolean
Default ValueOFF

如果源和副本都支持压缩,是否使用源/副本协议的压缩。如果禁用此变量(默认设置),则连接不会被压缩。对该变量所做的更改将在以后的连接尝试中生效。这包括在发出START SLAVE语句之后,以及正在运行的复制 I/O 线程进行的重新连接(例如,在为更改为主语句设置MASTER_RETRY_COUNT选项之后)。另请参见第 4.2.6 节“连接压缩控制”

PropertyValue
Command-Line Format--slave-exec-mode=mode
System Variableslave_exec_mode
ScopeGlobal
DynamicYes
TypeEnumeration
Default ValueIDEMPOTENT(NDB)

STRICT(其他)
Valid ValuesIDEMPOTENT
STRICT

控制复制线程如何解决复制期间的冲突和错误。 IDEMPOTENT模式可抑制重复密钥和找不到密钥的错误; STRICTtable 示不会发生这种抑制。

IDEMPOTENT模式旨在用于 NDB 群集复制的多源复制,循环复制和某些其他特殊复制方案中。 (有关更多信息,请参见第 21.6.10 节“ NDB 群集复制:双向复制和循环复制”第 21.6.11 节“ NDB 群集复制冲突解决”。)NDB 群集会忽略为slave_exec_mode显式设置的任何值,并将其始终视为IDEMPOTENT

在 MySQL Server 5.7 中,STRICT模式是默认值。

对于NDB以外的存储引擎,仅当您绝对确定可以安全地忽略重复键错误和未找到键错误时,才应使用IDEMPOTENT模式。它旨在用于采用多源复制或循环复制的 NDB 群集的故障转移方案中,不建议在其他情况下使用。

PropertyValue
Command-Line Format--slave-load-tmpdir=dir_name
System Variableslave_load_tmpdir
ScopeGlobal
DynamicNo
TypeDirectory name
Default ValueValue of --tmpdir

副本在其中创建临时文件的目录的名称。设置此变量将立即对所有复制通道(包括正在运行的通道)生效。默认情况下,变量值等于tmpdir系统变量的值,或者未指定该系统变量时应用的默认值。

当复制 SQL 线程复制LOAD DATA语句时,它将从中继日志中加载的文件提取到临时文件中,然后将其加载到 table 中。如果源中加载的文件很大,则副本上的临时文件也很大。因此,建议使用此选项告诉副本将临时文件放在具有大量可用空间的某些文件系统中的目录中。在这种情况下,中继日志也很大,因此您可能还需要设置relay_log系统变量以将中继日志放置在该文件系统中。

此选项指定的目录应该位于基于磁盘的文件系统(而不是基于内存的文件系统)中,以便用于复制LOAD DATA语句的临时文件可以在计算机重新启动后幸免。该目录也不应是 os 在系统启动过程中清除的目录。但是,如果已删除临时文件,则复制现在可以在重新启动后 continue。

PropertyValue
Command-Line Format--slave-max-allowed-packet=#
System Variableslave_max_allowed_packet
ScopeGlobal
DynamicYes
TypeInteger
Default Value1073741824
Minimum Value1024
Maximum Value1073741824

此变量设置复制 SQL 和 I/O 线程的最大数据包大小,因此使用基于行的复制的大型更新不会导致复制失败,因为更新超过了max_allowed_packet。设置此变量将立即对所有复制通道(包括正在运行的通道)生效。

该全局变量的值始终是 1024 的正整数倍;如果您将其设置为非某个值,则该值将四舍五入到下一个最高的 1024 倍,因为它会被存储或使用;将slave_max_allowed_packet设置为 0 会导致使用 1024. (在所有这种情况下,都会发出截断警告.)默认值和最大值为 1073741824(1 GB);默认值为 1073741824(1 GB)。最小为 1024.

PropertyValue
Command-Line Format--slave-net-timeout=#
System Variableslave_net_timeout
ScopeGlobal
DynamicYes
TypeInteger
Default Value60
Minimum Value1

副本认为连接断开,中止读取并尝试重新连接之前,await 来自源的更多数据或心跳 signal 的秒数。设置此变量不会立即生效。变量的状态适用于所有后续的START SLAVE命令。

第一次重试在超时后立即发生。重试之间的间隔由更改为主语句的MASTER_CONNECT_RETRY选项控制,并且重新连接尝试的次数由更改为主语句的MASTER_RETRY_COUNT选项限制。

心跳间隔由更改为主语句的MASTER_HEARTBEAT_PERIOD选项控制,如果连接仍然良好,则该心跳间隔将在没有数据的情况下停止连接超时。心跳间隔的默认值为slave_net_timeout的一半,它记录在源元数据存储库中,并显示在replication_connection_configuration Performance Schematable 中。请注意,更改值或默认设置slave_net_timeout不会自动更改心跳间隔,无论是已明确设置还是正在使用先前计算的默认值。如果更改了连接超时,则还必须发出更改为主来将心跳间隔调整为适当的值,以使其在连接超时之前发生。

PropertyValue
Command-Line Format--slave-parallel-type=value
System Variableslave_parallel_type
ScopeGlobal
DynamicYes
TypeEnumeration
Default ValueDATABASE
Valid ValuesDATABASE

LOGICAL_CLOCK

使用多线程副本(slave_parallel_workers大于 0)时,此变量指定用于决定允许哪些事务在副本上并行执行的策略。该变量对未启用多线程的副本无效。可能的值为:

  • LOGICAL_CLOCK:在源上提交的属于同一二进制日志组的事务将并行应用于副本。基于事务的时间戳跟踪事务之间的依赖关系,以在可能的情况下提供附加的并行化。设置此值后,如果事务中有写集,并且可以提供比时间戳更好的结果,则可以在源上使用binlog_transaction_dependency_tracking系统变量来指定使用写集代替时间戳。

    • DATABASE:并行应用更新不同数据库的事务。仅当将数据分区到多个数据库中并在源上同时并发地对其进行更新时,此值才适用。不得有跨数据库的约束,因为这样的约束可能会在副本数据库上违反。

设置slave_preserve_commit_order=1时,只能使用LOGICAL_CLOCK

如果您的复制拓扑使用多个级别的副本,则LOGICAL_CLOCK可能会为副本远离源的每个级别实现较少的并行化。您可以通过在源上使用binlog_transaction_dependency_tracking来指定使用写集而不是使用时间戳来并行化来减少这种影响。

PropertyValue
Command-Line Format--slave-parallel-workers=#
System Variableslave_parallel_workers
ScopeGlobal
DynamicYes
TypeInteger
Default Value0
Minimum Value0
Maximum Value1024

设置用于并行执行复制事务的应用程序线程数。将此变量设置为大于 0 的数字将创建具有此应用线程数量的多线程副本。设置为 0(默认值)时,并行执行被禁用,并且副本使用单个应用程序线程。设置slave_parallel_workers不会立即生效。变量的状态适用于所有后续START SLAVE语句。

Note

NDB 群集当前不支持多线程副本,它会静默忽略此变量的设置。有关更多信息,请参见第 21.6.3 节“ NDB 群集复制中的已知问题”

多线程副本通过使用协调器线程和此变量配置的应用程序线程数来提供并行执行。事务在应用程序线程之间的分配方式由slave_parallel_type配置。除非slave_preserve_commit_order=1,否则副本并行应用的事务可能会无序提交。因此,检查最近执行的事务并不能保证源上的所有先前事务都已在副本上执行。使用多线程副本时,这对日志记录和恢复具有影响。例如,在多线程副本上,开始奴隶直到语句仅支持使用SQL_AFTER_MTS_GAPS

在 MySQL 5.7 中,在副本上启用多线程时,支持重试事务。在以前的版本中,使用多线程副本时,slave_transaction_retries被视为等于 0.

PropertyValue
Command-Line Format--slave-pending-jobs-size-max=#
System Variableslave_pending_jobs_size_max
ScopeGlobal
DynamicYes
TypeInteger
Default Value16M
Minimum Value1024
Maximum Value16EiB
Unitbytes
Block Size1024

对于多线程副本,此变量设置可用于保存尚未应用事件的工作队列的最大内存量(以字节为单位)。设置此变量对未启用多线程的副本无效。设置此变量不会立即生效。变量的状态适用于所有后续的START SLAVE命令。

该变量的最小可能值为 1024;默认值为 16MB。可能的最大值是 18446744073709551615(16 艾字节)。并非 1024 的精确倍数的值在存储之前会向下舍入为 1024 的下一个最高倍数。

该变量的值是一个软限制,可以设置为与正常工作负载匹配。如果异常大的事件超出了此大小,则事务将一直保留到所有辅助线程都具有空队列,然后再进行处理。保留所有后续事务,直到完成大事务为止。

PropertyValue
Command-Line Format--slave-preserve-commit-order[={OFF|ON}]
System Variableslave_preserve_commit_order
ScopeGlobal
DynamicYes
TypeBoolean
Default ValueOFF

对于多线程副本,此变量的设置 1 确保事务在副本上的外部化 Sequences 与副本中继日志中出现的 Sequences 相同,并防止已从中继日志执行的事务序列出现间隙。此变量对未启用多线程的副本无效。请注意,slave_preserve_commit_order=1不会保留非事务 DML 更新的 Sequences,因此它们可能会在中继日志中先于它们的事务之前提交,这可能会导致间隔。

slave_preserve_commit_order=1要求在副本上启用--log-bin--log-slave-updates,并且slave_parallel_type设置为LOGICAL_CLOCK。更改此变量之前,必须停止所有复制线程(对于所有复制通道,如果您正在使用多个复制通道)。

启用slave_preserve_commit_order后,正在执行的线程将 await,直到所有先前的事务都被提交为止。在线程 await 其他工作程序提交事务时,线程将其状态报告为Waiting for preceding transaction to commit。 (在 MySQL 5.7.8 之前,它显示为Waiting for its turn to commit.)在多线程副本上启用此模式可确保它永远不会进入源不在的状态。这支持使用复制进行读取横向扩展。参见第 16.3.4 节“使用复制进行横向扩展”

如果设置了slave_preserve_commit_order=0,则副本并行应用的事务可能会无序提交。因此,检查最近执行的事务并不能保证源上的所有先前事务都已在副本上执行。从副本的中继日志中执行的事务序列中可能会有间隙。使用多线程副本时,这对日志记录和恢复具有影响。请注意,设置slave_preserve_commit_order=1可以防止出现间隙,但不能防止源二进制日志位置滞后(其中Exec_master_log_pos落后于已执行事务的位置)。有关更多信息,请参见第 16.4.1.32 节,“复制和事务不一致”

PropertyValue
Command-Line Format--slave-rows-search-algorithms=value
System Variableslave_rows_search_algorithms
ScopeGlobal
DynamicYes
TypeSet
Default ValueTABLE_SCAN,INDEX_SCAN
Valid ValuesTABLE_SCAN,INDEX_SCAN

INDEX_SCAN,HASH_SCAN
TABLE_SCAN,HASH_SCAN
TABLE_SCAN,INDEX_SCAN,HASH_SCAN(相当于 INDEX_SCAN,HASH_SCAN)

在为基于行的日志记录和复制准备一批行时,此变量控制如何在行中搜索匹配项,特别是是否使用哈希扫描。设置此变量将立即对所有复制通道(包括正在运行的通道)生效。

从列 tableINDEX_SCANTABLE_SCANHASH_SCAN中指定两个值的以下组合的逗号分隔列 table。该值应为字符串,因此,如果在运行时而不是在服务器启动时进行设置,则必须用引号将该值引起来。此外,该值不得包含任何空格。下 table 列出了推荐的组合(列 table)及其效果:

使用的索引/选项值INDEX_SCAN,HASH_SCANINDEX_SCAN,TABLE_SCAN
主键或唯一键Index scanIndex scan
(Other) Key哈希扫描索引Index scan
No indexHash scanTable scan
  • 默认值为INDEX_SCAN,TABLE_SCAN,这意味着所有可以使用索引的搜索都使用它们,而没有任何索引的搜索都使用 table 扫描。

    • 要对不使用主键或唯一键的任何搜索使用哈希,请设置INDEX_SCAN,HASH_SCAN。指定INDEX_SCAN,HASH_SCAN与指定INDEX_SCAN,TABLE_SCAN,HASH_SCAN具有相同的效果。

    • 不要使用组合TABLE_SCAN,HASH_SCAN。此设置将强制对所有搜索进行哈希处理。与INDEX_SCAN,HASH_SCAN相比,它没有任何优势,如果单个事件包含对同一行的多个更新或与 Sequences 相关的更新,则可能导致“找不到记录”错误或重复的键错误。

列 table 中指定算法的 Sequences 与SELECTSHOW VARIABLES语句显示的 Sequences 没有区别。

可以指定单个值,但这不是最佳选择,因为设置单个值会将搜索限制为仅使用该算法。特别是,不建议单独设置INDEX_SCAN,因为在这种情况下,如果不存在索引,搜索将根本找不到行。

PropertyValue
Command-Line Format--slave-skip-errors=name
System Variableslave_skip_errors
ScopeGlobal
DynamicNo
TypeString
Default ValueOFF
Valid ValuesOFF

[list of error codes]
all
ddl_exist_errors

通常,当副本上发生错误时,复制会停止,这使您有机会手动解决数据中的不一致问题。当语句返回变量值中列出的任何错误时,此变量将导致复制 SQL 线程 continue 复制。

PropertyValue
Command-Line Format--slave-sql-verify-checksum[={OFF|ON}]
System Variableslave_sql_verify_checksum
ScopeGlobal
DynamicYes
TypeBoolean
Default ValueON

使复制 SQL 线程使用从中继日志中读取的校验和来验证数据。如果不匹配,则副本会因错误而停止。设置此变量将立即对所有复制通道(包括正在运行的通道)生效。

Note

当通过网络接受事件时,如果可能,复制 I/O 线程总是读取校验和。

PropertyValue
Command-Line Format--slave-transaction-retries=#
System Variableslave_transaction_retries
ScopeGlobal
DynamicYes
TypeInteger
Default Value10
Minimum Value0
最大值(64 位平台)18446744073709551615
最大值(32 位平台)4294967295

如果由于InnoDB死锁或事务的执行时间超过InnoDBinnodb_lock_wait_timeoutNDBTransactionDeadlockDetectionTimeoutTransactionInactiveTimeout而导致复制 SQL 线程未能执行事务,它将自动重试slave_transaction_retries次,然后停止并显示错误。具有非临时错误的事务不会重试。

slave_transaction_retries的默认值为 10.将变量设置为 0 将禁用事务的自动重试。设置该变量对所有复制通道(包括正在运行的通道)立即生效。

从 MySQL 5.7.5 开始,在副本上启用多线程时,支持重试事务。在以前的版本中,使用多线程副本时,slave_transaction_retries被视为等于 0.

性能模式 tablereplication_applier_statusCOUNT_TRANSACTIONS_RETRIES列中显示了每个复制通道上发生的重试次数。

PropertyValue
Command-Line Format--slave-type-conversions=set
System Variableslave_type_conversions
ScopeGlobal
DynamicNo
TypeSet
Default Value``
Valid ValuesALL_LOSSY

ALL_NON_LOSSY
ALL_SIGNED
ALL_UNSIGNED

使用基于行的复制时,控制对副本有效的类型转换模式。在 MySQL 5.7.2 和更高版本中,其值是一个逗号分隔的集合,该集合由列 table 中的ALL_LOSSYALL_NON_LOSSYALL_SIGNEDALL_UNSIGNED组成的零个或多个元素。将此变量设置为空字符串以禁止源和副本之间的类型转换。设置此变量将立即对所有复制通道(包括正在运行的通道)生效。

在 MySQL 5.7.2(错误#15831300)中添加了ALL_SIGNEDALL_UNSIGNED。有关适用于基于行的复制中的属性提升和降级的类型转换模式的其他信息,请参见基于行的复制:属性提升和降级

PropertyValue
System Variablesql_slave_skip_counter
ScopeGlobal
DynamicYes
TypeInteger

副本应跳过的源中的事件数。设置该选项不会立即生效。该变量适用于下一个START SLAVE语句;下一个START SLAVE语句也将值更改回 0.当此变量设置为非零值并且配置了多个复制通道时,START SLAVE语句只能与FOR CHANNEL channel子句一起使用。

此选项与基于 GTID 的复制不兼容,并且在gtid_mode=ON时不得将其设置为非零值。如果在使用 GTID 时需要跳过事务,请改用gtid_executed。参见第 16.1.7.3 节“跳过 Transaction”

Important

如果跳过通过设置此变量指定的事件数将导致副本在事件组的中间开始,则副本将 continue 跳过,直到找到下一个事件组的起点并从该点开始。有关更多信息,请参见第 16.1.7.3 节“跳过 Transaction”

PropertyValue
Command-Line Format--sync-master-info=#
System Variablesync_master_info
ScopeGlobal
DynamicYes
TypeInteger
Default Value10000
Minimum Value0
最大值(64 位平台)18446744073709551615
最大值(32 位平台)4294967295

此变量对副本的影响取决于副本的master_info_repository设置为FILE还是TABLE,如以下段落中所述。

master_info_repository = FILE. 如果sync_master_info的值大于 0,则副本在每个sync_master_info事件之后将其master.info文件同步到磁盘(使用fdatasync())。如果为 0,则 MySQL 服务器不执行master.info文件与磁盘的同步;而是,服务器依赖 os 来定期刷新其内容,就像处理其他任何文件一样。

master_info_repository = TABLE. 如果sync_master_info的值大于 0,则副本在每个sync_master_info事件后更新其源元数据存储库 table。如果为 0,则 table 永远不会更新。

sync_master_info的默认值为 10000.设置此变量将立即对所有复制通道(包括正在运行的通道)生效。

PropertyValue
Command-Line Format--sync-relay-log=#
System Variablesync_relay_log
ScopeGlobal
DynamicYes
TypeInteger
Default Value10000
Minimum Value0
最大值(64 位平台)18446744073709551615
最大值(32 位平台)4294967295

如果此变量的值大于 0,则每将sync_relay_log个事件写入中继日志后,MySQL 服务器就会使用fdatasync()将其中继日志同步到磁盘。设置此变量将立即对所有复制通道(包括正在运行的通道)生效。

sync_relay_log设置为 0 不会对磁盘进行任何同步。在这种情况下,服务器依赖于 os 不时刷新中继日志的内容,就像处理其他任何文件一样。

值 1 是最安全的选择,因为在发生崩溃的情况下,您从中继日志中最多丢失一个事件。但是,它也是最慢的选择(除非磁盘具有 Batteries 备份的高速缓存,这使得同步非常快)。

PropertyValue
Command-Line Format--sync-relay-log-info=#
System Variablesync_relay_log_info
ScopeGlobal
DynamicYes
TypeInteger
Default Value10000
Minimum Value0
最大值(64 位平台)18446744073709551615
最大值(32 位平台)4294967295

sync_relay_log_info的默认值为 10000.设置此变量将立即对所有复制通道(包括正在运行的通道)生效。

此变量对副本的影响取决于服务器的relay_log_info_repository设置(FILETABLE)。如果设置为TABLE,则变量的作用还取决于中继日志信息 table 使用的存储引擎是事务性的(例如InnoDB)还是事务性的(MyISAM)。这些因素对sync_relay_log_info值为零且大于零的服务器行为的影响如下:

  • sync_relay_log_info = 0

      • 如果relay_log_info_repository设置为FILE,则 MySQL 服务器不执行relay-log.info文件到磁盘的同步;而是,服务器依赖 os 来定期刷新其内容,就像处理其他任何文件一样。
    • 如果relay_log_info_repository设置为TABLE,并且该 table 的存储引擎是事务性的,则在每次事务处理后都会更新该 table。 (在这种情况下,实际上会忽略sync_relay_log_info设置.)

    • 如果relay_log_info_repository设置为TABLE,并且该 table 的存储引擎不是事务性的,则该 table 永远不会更新。

  • sync_relay_log_info = N > 0

      • 如果relay_log_info_repository设置为FILE,则副本在每个* N *事务之后将其relay-log.info文件同步到磁盘(使用fdatasync())。
    • 如果relay_log_info_repository设置为TABLE,并且该 table 的存储引擎是事务性的,则在每次事务处理后都会更新该 table。 (在这种情况下,实际上会忽略sync_relay_log_info设置.)

    • 如果relay_log_info_repository设置为TABLE,并且该 table 的存储引擎不是事务性的,则在每个* N *事件后更新该 table。