Documentation Home

16.1.6.3 副本服务器选项和变量

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

命令行选项文件中指定选项。许多选项可以在服务器运行时使用该 CHANGE MASTER TO语句进行设置。使用指定系统变量值 SET

服务器标识。  在源和每个副本上,您必须设置 server_id系统变量以建立一个唯一的复制 ID,范围从 1 到 2 32 − 1。唯一 意味着每个 ID 必须不同于任何其他源使用的每个其他 ID或复制拓扑中的副本。示例my.cnf文件:

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

本节介绍用于控制副本服务器的启动选项。可以在服务器运行时使用CHANGE MASTER TO语句设置其中许多选项。其他的,比如 --replicate-*选项,只能在副本服务器启动时设置。与复制相关的系统变量将在本节后面讨论。

  • --log-warnings[=level]

    命令行格式 --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,服务器会记录有关基于语句的日志记录不安全的语句的消息。如果该值大于 ,则会记录新连接尝试的中止连接和拒绝访问错误1. 请参阅第 B.3.2.9 节“通信错误和中止连接”

    笔记

    此选项的影响不仅限于复制。它会影响一系列服务器活动的诊断消息。

  • --master-info-file=file_name

    命令行格式 --master-info-file=file_name
    类型 文件名
    默认值 master.info

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

  • --master-retry-count=count

    命令行格式 --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=size

    命令行格式 --max-relay-log-size=#
    系统变量 max_relay_log_size
    范围 全球的
    动态的 是的
    类型 整数
    默认值 0
    最小值 0
    最大值 1073741824
    单元 字节
    块大小 4096

    服务器自动轮换中继日志文件的大小。如果此值不为零,则中继日志在其大小超过此值时会自动轮换。如果此值为零(默认值),则发生中继日志轮换的大小由 的值确定 max_binlog_size。有关详细信息,请参阅第 16.2.4.1 节,“中继日志”

  • --relay-log-purge={0|1}

    命令行格式 --relay-log-purge[={OFF|ON}]
    系统变量 relay_log_purge
    范围 全球的
    动态的 是的
    类型 布尔值
    默认值 ON

    一旦不再需要,就禁用或启用中继日志的自动清除。默认值为 1(启用)。这是一个全局变量,可以使用 动态更改。启用该选项时禁用清除中继日志 会使数据一致性面临风险。 SET GLOBAL relay_log_purge = N--relay-log-recovery

  • --relay-log-space-limit=size

    命令行格式 --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=db_name

    命令行格式 --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;

    replica上的数据库中的februarysales是按照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, 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——换句话说,只有命名为 的数据库中的表 --replicate-do-db会发生变化,默认数据库的选择对此行为没有影响。

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

    笔记

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

    此选项对 BEGINCOMMITROLLBACK 语句没有影响。

  • --replicate-ignore-db=db_name

    命令行格式 --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-dbUSEsalesUPDATEsales.january--replicate-ignore-db=salessales 被副本忽略的数据库。

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

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

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

    笔记

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

    此选项对 BEGINCOMMITROLLBACK 语句没有影响。

  • --replicate-do-table=db_name.tbl_name

    命令行格式 --replicate-do-table=name
    类型 细绳

    通过告诉复制 SQL 线程将复制限制到给定的表来创建复制过滤器。要指定多个表,请多次使用此选项,每个表一次。这适用于跨数据库更新和默认数据库更新,与 --replicate-do-db. 请参阅 第 16.2.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. 请参阅 第 16.2.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 选项时遵循以下建议:

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

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

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

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

    笔记

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

  • --replicate-same-server-id

    命令行格式 --replicate-same-server-id[={OFF|ON}]
    类型 布尔值
    默认值 OFF

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

  • --replicate-wild-do-table=db_name.tbl_name

    命令行格式 --replicate-wild-do-table=name
    类型 细绳

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

    笔记

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

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

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

    如果表名模式是%,它匹配任何表名并且该选项也适用于数据库级语句(CREATE DATABASEDROP DATABASEALTER 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 线程复制任何表与给定通配符模式匹配的语句。要指定要忽略的多个表,请多次使用此选项,每个表一次。这适用于跨数据库更新。请参阅 第 16.2.5 节,“服务器如何评估复制过滤规则”。您还可以通过发出 CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE 语句来创建这样的过滤器。

    重要的

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

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

    有关匹配如何工作的信息,请参阅 --replicate-wild-do-table 选项的描述。在选项值中包含文字通配符的规则也与 for 相同 --replicate-wild-ignore-table

    重要的

    表级复制过滤器仅适用于在查询中明确提及和操作的表。它们不适用于查询隐式更新的表。例如, 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

    命令行格式 --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
    有效值

    OFF

    [list of error codes]

    all

    ddl_exist_errors

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

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

    对于错误代码,您应该使用副本的错误日志和 的输出中的错误消息提供的数字SHOW SLAVE STATUS附录 B,错误消息和常见问题,列出了服务器错误代码。

    速记值ddl_exist_errors相当于错误代码列表 1007,1008,1050,1051,1054,1060,1061,1068,1094,1146

    您也可以(但不应该)使用非常不推荐的值all来使副本忽略所有错误消息并继续运行而不管发生什么。不用说,如果您使用all,则无法保证数据的完整性。在这种情况下,如果副本的数据与源上的数据相去甚远,请不要抱怨(或提交错误报告)。你已被警告

    NDB由于检查纪元序列号 的内部机制,在 NDB 集群之间复制时,此选项不会以相同的方式工作 ;一旦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

    命令行格式 --abort-slave-event-count=#
    类型 整数
    默认值 0
    最小值 0

    当此选项设置为 value0(默认值)以外的某个正整数时,它会影响复制行为,如下所示:复制 SQL 线程启动后, value允许执行日志事件;之后,复制 SQL 线程不再接收任何事件,就像来自源的网络连接被切断一样。复制 SQL 线程继续运行,输出 SHOW SLAVE STATUS显示 YesSlave_IO_RunningSlave_SQL_Running列中,但没有从中继日志中读取更多事件。

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

  • --disconnect-slave-event-count

    命令行格式 --disconnect-slave-event-count=#
    类型 整数
    默认值 0

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

将副本状态记录到表的选项

MySQL 5.7 支持将复制元数据记录到表而不是文件中。副本的连接元数据存储库和应用程序元数据存储库的写入可以使用这两个系统变量单独配置:

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

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

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

有关详细信息,请参阅第 16.2.4 节,“中继日志和复制元数据存储库”

副本上使用的系统变量

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

  • init_slave

    命令行格式 --init-slave=name
    系统变量 init_slave
    范围 全球的
    动态的 是的
    类型 细绳

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

    笔记

    复制 SQL 线程在执行之前向客户端发送确认 init_slave。因此,返回时不保证 init_slave已经执行START SLAVE 。有关详细信息,请参阅第 13.4.2.5 节,“START SLAVE 语句”

  • log_slow_slave_statements

    命令行格式 --log-slow-slave-statements[={OFF|ON}]
    系统变量 log_slow_slave_statements
    范围 全球的
    动态的 是的
    类型 布尔值
    默认值 OFF

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

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

  • master_info_repository

    命令行格式 --master-info-repository={FILE|TABLE}
    系统变量 master_info_repository
    范围 全球的
    动态的 是的
    类型 细绳
    默认值 FILE
    有效值

    FILE

    TABLE

    此变量的设置确定副本是否将有关源的元数据(包括状态和连接信息)记录到系统数据库InnoDB 中的表mysql,或作为数据目录中的文件。有关连接元数据存储库的更多信息,请参阅 第 16.2.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=#
    系统变量 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。请参阅 第 16.2.3 节,“复制线程”

  • relay_log

    命令行格式 --relay-log=file_name
    系统变量 relay_log
    范围 全球的
    动态的
    类型 文件名

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

    服务器将文件写入数据目录,除非给定基本名称和前导绝对路径名以指定不同的目录。服务器通过向基本名称添加数字后缀来按顺序创建中继日志文件。

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

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

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

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

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

    • 如果您需要将中继日志放在数据目录以外的某个区域,因为您的中继日志往往非常大并且您不想减少 max_relay_log_size

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

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

  • relay_log_basename

    系统变量 relay_log_basename
    范围 全球的
    动态的
    类型 文件名
    默认值 datadir + '/' + hostname + '-relay-bin'

    保存中继日志文件的基本名称和完整路径。最大变量长度为 256。该变量由服务器设置并且是只读的。

  • relay_log_index

    命令行格式 --relay-log-index=file_name
    系统变量 relay_log_index
    范围 全球的
    动态的
    类型 文件名
    默认值 *host_name*-relay-bin.index

    中继日志索引文件的名称。最大可变长度为 256。对于默认复制通道,默认名称为 host_name-relay-bin.index. 对于非默认复制通道,默认名称为 ,其中是记录在该中继日志索引中的复制通道的名称。 host_name-relay-bin-channel.indexchannel

    服务器将文件写入数据目录,除非名称带有前导绝对路径名以指定不同的目录。姓名。

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

  • relay_log_info_file

    命令行格式 --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在数据目录中。有关应用程序元数据存储库的信息,请参阅第 16.2.4.2 节,“复制元数据存储库”

  • relay_log_info_repository

    命令行格式 --relay-log-info-repository=value
    系统变量 relay_log_info_repository
    范围 全球的
    动态的 是的
    类型 细绳
    默认值 FILE
    有效值

    FILE

    TABLE

    该变量的设置决定了副本服务器是将其应用程序元数据存储库存储为 系统数据库InnoDB中的表 mysql,还是存储为数据目录中的文件。有关应用程序元数据存储库的更多信息,请参阅第 16.2.4 节,“中继日志和复制元数据存储库”

    默认设置为FILE。作为文件,副本的应用程序元数据存储库 relay-log.info默认命名,您可以使用 relay_log_info_file系统变量更改此名称。

    通过设置TABLE,作为一个 InnoDB表,副本的应用程序元数据存储库被命名为 mysql.slave_relay_log_info。配置 TABLE多个复制通道时需要设置。副本的应用程序元数据存储库的 TABLE设置也需要使复制对意外停止具有弹性。有关更多信息,请参阅 第 16.3.2 节,“处理副本的意外停止”

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

    应用程序元数据存储库位置的设置直接影响 sync_relay_log_info系统变量设置的效果。您只能在没有复制线程正在执行时更改设置。

  • relay_log_purge

    命令行格式 --relay-log-purge[={OFF|ON}]
    系统变量 relay_log_purge
    范围 全球的
    动态的 是的
    类型 布尔值
    默认值 ON

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

  • relay_log_recovery

    命令行格式 --relay-log-recovery[={OFF|ON}]
    系统变量 relay_log_recovery
    范围 全球的
    动态的
    类型 布尔值
    默认值 OFF

    如果启用,此变量会在服务器启动后立即启用自动中继日志恢复。恢复过程创建一个新的中继日志文件,将 SQL 线程位置初始化到这个新的中继日志,并将 I/O 线程初始化到 SQL 线程位置。然后继续从源读取中继日志。

    这个全局变量在运行时是只读的。它的值可以 --relay-log-recovery在副本服务器启动时使用选项设置,应该在副本意外停止后使用,以确保没有处理可能损坏的中继日志,并且必须使用它来保证崩溃安全的副本。默认值为 0(禁用)。有关对意外停止最具弹性的副本设置组合的信息,请参阅 第 16.3.2 节,“处理副本的意外停止”

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

    对于多线程副本( slave_parallel_workers大于 0),从 MySQL 5.7.13 开始,设置会 relay_log_recovery = ON 自动处理从中继日志执行的事务序列中的任何不一致和间隙。当使用基于文件位置的复制时,可能会出现这些间隙。(有关更多详细信息,请参阅 第 16.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=#
    系统变量 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

    命令行格式 --report-host=host_name
    系统变量 report_host
    范围 全球的
    动态的
    类型 细绳

    在副本注册期间要报告给源的副本的主机名或 IP 地址。该值出现在SHOW SLAVE HOSTS源服务器上的输出中。如果您不希望副本向源注册自己,请保留该值。

    笔记

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

  • report_password

    命令行格式 --report-password=name
    系统变量 report_password
    范围 全球的
    动态的
    类型 细绳

    在副本注册期间要报告给源的副本的复制用户帐户密码。如果源是使用 启动的,则此值会出现在SHOW SLAVE HOSTS源服务器上 的输出中--show-slave-auth-info

    尽管此变量的名称可能另有含义, report_password但未连接到 MySQL 用户权限系统,因此不一定(甚至可能)与 MySQL 复制用户帐户的密码相同。

  • report_port

    命令行格式 --report-port=port_num
    系统变量 report_port
    范围 全球的
    动态的
    类型 整数
    默认值 [slave_port]
    最小值 0
    最大值 65535

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

    此选项的默认值是副本实际使用的端口号。这也是 显示的默认值SHOW SLAVE HOSTS

  • report_user

    命令行格式 --report-user=name
    系统变量 report_user
    范围 全球的
    动态的
    类型 细绳

    在副本注册期间要报告给源的副本的帐户用户名。如果源是使用 启动的,则此值会出现在SHOW SLAVE HOSTS源服务器上 的输出中--show-slave-auth-info

    尽管此变量的名称可能另有含义, report_user但未连接到 MySQL 用户权限系统,因此不一定(甚至可能)与 MySQL 复制用户帐户的名称相同。

  • rpl_semi_sync_slave_enabled

    命令行格式 --rpl-semi-sync-slave-enabled[={OFF|ON}]
    系统变量 rpl_semi_sync_slave_enabled
    范围 全球的
    动态的 是的
    类型 布尔值
    默认值 OFF

    控制是否在副本上启用半同步复制。要启用或禁用插件,请分别将此变量设置为ONOFF (或 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=#
    系统变量 rpl_stop_slave_timeout
    范围 全球的
    动态的 是的
    类型 整数
    默认值 31536000
    最小值 2
    最大值 31536000
    单元

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

    的最大值和默认值为 rpl_stop_slave_timeout31536000 秒(1 年)。最小值为 2 秒。STOP SLAVE对此变量的更改对后续语句 生效 。

    此变量仅影响发出 STOP SLAVE语句的客户端。当达到超时时,发出命令的客户端返回一条错误消息,指出命令执行未完成。客户端然后停止等待复制线程停止,但复制线程继续尝试停止, STOP SLAVE指令仍然有效。一旦复制线程不再繁忙, STOP SLAVE就会执行语句并停止副本。

  • slave_checkpoint_group

    命令行格式 --slave-checkpoint-group=#
    系统变量 slave_checkpoint_group
    范围 全球的
    动态的 是的
    类型 整数
    默认值 512
    最小值 32
    最大值 524280
    块大小 8

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

    笔记

    NDB Cluster 目前不支持多线程副本,它会默默地忽略此变量的设置。有关更多信息,请参阅 第 21.7.3 节,“NDB Cluster 复制中的已知问题”

    该变量与 slave_checkpoint_period 系统变量结合使用,当超过任一限制时,将执行检查点,并重置跟踪交易数量和自上次检查点以来经过的时间的计数器。

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

  • slave_checkpoint_period

    命令行格式 --slave-checkpoint-period=#
    系统变量 slave_checkpoint_period
    范围 全球的
    动态的 是的
    类型 整数
    默认值 300
    最小值 1
    最大值 4294967295
    单元 毫秒

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

    笔记

    NDB Cluster 目前不支持多线程副本,它会默默地忽略此变量的设置。有关更多信息,请参阅 第 21.7.3 节,“NDB Cluster 复制中的已知问题”

    该变量与 slave_checkpoint_group 系统变量结合使用,当超过任一限制时,将执行检查点,并重置跟踪交易数量和自上次检查点以来经过的时间的计数器。

    此变量的最小允许值为 1,除非服务器是使用 构建的 -DWITH_DEBUG,在这种情况下最小值为 0。无论服务器是如何构建的,默认值为 300 毫秒,最大可能值为 4294967295 毫秒(约 49.7 天)。

  • slave_compressed_protocol

    命令行格式 --slave-compressed-protocol[={OFF|ON}]
    系统变量 slave_compressed_protocol
    范围 全球的
    动态的 是的
    类型 布尔值
    默认值 OFF

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

  • slave_exec_mode

    命令行格式 --slave-exec-mode=mode
    系统变量 slave_exec_mode
    范围 全球的
    动态的 是的
    类型 枚举
    默认值

    IDEMPOTENT(新开发银行)

    STRICT(其他)

    有效值

    STRICT

    IDEMPOTENT

    控制复制线程如何解决复制期间的冲突和错误。IDEMPOTENT 模式导致抑制重复键和未找到键的错误;STRICT意味着不会发生这种抑制。

    IDEMPOTENTmode 旨在用于 NDB Cluster Replication 的多源复制、循环复制和其他一些特殊复制场景。(有关更多信息,请参阅 第 21.7.10 节,“NDB Cluster 复制:双向和循环复制”第 21.7.11 节,“NDB Cluster 复制冲突解决”。)NDB Cluster 忽略为明确设置的任何值 slave_exec_mode,并始终将其视为作为IDEMPOTENT

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

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

  • slave_load_tmpdir

    命令行格式 --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=#
    系统变量 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=#
    系统变量 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 Performance Schema 表中。请注意,更改值或默认设置 slave_net_timeout不会自动更改心跳间隔,无论是已明确设置还是使用先前计算的默认值。如果更改了连接超时,您还必须CHANGE MASTER TO将心跳间隔调整为适当的值,以便在连接超时之前发生。

  • slave_parallel_type

    命令行格式 --slave-parallel-type=value
    系统变量 slave_parallel_type
    范围 全球的
    动态的 是的
    类型 枚举
    默认值 DATABASE
    有效值

    DATABASE

    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 您可以通过在源上使用来指定在可能的情况下使用写入集而不是时间戳来 减少这种影响 。

  • slave_parallel_workers

    命令行格式 --slave-parallel-workers=#
    系统变量 slave_parallel_workers
    范围 全球的
    动态的 是的
    类型 整数
    默认值 0
    最小值 0
    最大值 1024

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

    笔记

    NDB Cluster 目前不支持多线程副本,它会默默地忽略此变量的设置。有关更多信息,请参阅 第 21.7.3 节,“NDB Cluster 复制中的已知问题”

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

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

    NDB Cluster 当前不支持多线程副本。有关如何 处理此变量设置的 更多信息,请参阅 第 21.7.3 节,“NDB Cluster 复制中的已知问题” 。NDB

  • slave_pending_jobs_size_max

    命令行格式 --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

    命令行格式 --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-updates在副本上启用,并 slave_parallel_type设置为LOGICAL_CLOCK。在更改此变量之前,必须停止所有复制线程(如果您使用多个复制通道,则为所有复制通道)。

    启用后,执行线程会一直等待, slave_preserve_commit_order 直到所有先前的事务都已提交,然后再提交。当线程正在等待其他工作人员提交他们的事务时,它会将其状态报告为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 节,“复制和事务不一致”

  • slave_rows_search_algorithms

    命令行格式 --slave-rows-search-algorithms=value
    系统变量 slave_rows_search_algorithms
    范围 全球的
    动态的 是的
    类型
    默认值 TABLE_SCAN,INDEX_SCAN
    有效值

    TABLE_SCAN,INDEX_SCAN

    INDEX_SCAN,HASH_SCAN

    TABLE_SCAN,HASH_SCAN

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

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

    INDEX_SCAN指定列表, TABLE_SCAN, 中 2 个值的以下组合的逗号分隔列表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

    命令行格式 --slave-skip-errors=name
    系统变量 slave_skip_errors
    范围 全球的
    动态的
    类型 细绳
    默认值 OFF
    有效值

    OFF

    [list of error codes]

    all

    ddl_exist_errors

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

  • slave_sql_verify_checksum

    命令行格式 --slave-sql-verify-checksum[={OFF|ON}]
    系统变量 slave_sql_verify_checksum
    范围 全球的
    动态的 是的
    类型 布尔值
    默认值 ON

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

    笔记

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

  • slave_transaction_retries

    命令行格式 --slave-transaction-retries=#
    系统变量 slave_transaction_retries
    范围 全球的
    动态的 是的
    类型 整数
    默认值 10
    最小值 0
    最大值(64 位平台) 18446744073709551615
    最大值(32 位平台) 4294967295

    InnoDB如果复制 SQL 线程由于死锁或因为事务的执行时间超过 InnoDBs innodb_lock_wait_timeoutNDBs TransactionDeadlockDetectionTimeout 或 而无法执行事务,它会 在因错误而停止之前TransactionInactiveTimeout自动重试 times。slave_transaction_retries不会重试具有非临时错误的事务。

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

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

    Performance Schema 表 在列中replication_applier_status 显示了每个复制通道上发生的重试次数 COUNT_TRANSACTIONS_RETRIES

  • slave_type_conversions

    命令行格式 --slave-type-conversions=set
    系统变量 slave_type_conversions
    范围 全球的
    动态的 是的
    类型
    默认值
    有效值

    ALL_LOSSY

    ALL_NON_LOSSY

    ALL_SIGNED

    ALL_UNSIGNED

    使用基于行的复制时,控制对副本有效的类型转换模式。在 MySQL 5.7.2 及更高版本中,它的值是一个逗号分隔的零个或多个元素的集合,来自列表:ALL_LOSSY, ALL_NON_LOSSY, ALL_SIGNED, ALL_UNSIGNED。将此变量设置为空字符串以禁止源和副本之间的类型转换。设置此变量会立即对所有复制通道生效,包括正在运行的通道。

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

  • sql_slave_skip_counter

    系统变量 sql_slave_skip_counter
    范围 全球的
    动态的 是的
    类型 整数
    默认值 0
    最小值 0
    最大值 4294967295

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

    此选项与基于 GTID 的复制不兼容,并且在 gtid_mode=ON. 如果在使用 GTID 时需要跳过事务,请改用 gtid_executed源代码。请参阅 第 16.1.7.3 节,“跳过事务”

    重要的

    如果跳过通过设置此变量指定的事件数会导致副本从事件组的中间开始,则副本将继续跳过,直到它找到下一个事件组的开头并从该点开始。有关详细信息,请参阅 第 16.1.7.3 节,“跳过事务”

  • sync_master_info

    命令行格式 --sync-master-info=#
    系统变量 sync_master_info
    范围 全球的
    动态的 是的
    类型 整数
    默认值 10000
    最小值 0
    最大值 4294967295

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

    master_info_repository = 文件。  如果 的值sync_master_info大于 0,则副本 在每个 事件后将其master.info文件同步到磁盘(使用 )。如果为0,则MySQL服务器不执行 文件到磁盘的同步;相反,服务器依靠操作系统定期刷新其内容,就像任何其他文件一样。 fdatasync()sync_master_infomaster.info

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

    默认值为sync_master_info10000。设置此变量会立即对所有复制通道生效,包括正在运行的通道。

  • sync_relay_log

    命令行格式 --sync-relay-log=#
    系统变量 sync_relay_log
    范围 全球的
    动态的 是的
    类型 整数
    默认值 10000
    最小值 0
    最大值 4294967295

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

    设置sync_relay_log为 0 会导致不对磁盘进行同步;在这种情况下,服务器依靠操作系统不时刷新中继日志的内容,就像任何其他文件一样。

    值 1 是最安全的选择,因为在意外停止的情况下,您最多会从中继日志中丢失一个事件。然而,它也是最慢的选择(除非磁盘有电池备份缓存,这使得同步非常快)。有关对意外停止最具弹性的副本设置组合的信息,请参阅 第 16.3.2 节,“处理副本的意外停止”

  • sync_relay_log_info

    命令行格式 --sync-relay-log-info=#
    系统变量 sync_relay_log_info
    范围 全球的
    动态的 是的
    类型 整数
    默认值 10000
    最小值 0
    最大值 4294967295

    The default value for sync_relay_log_info is 10000. Setting this variable takes effect for all replication channels immediately, including running channels.

    The effects of this variable on the replica depend on the server's relay_log_info_repository setting (FILE or TABLE). If the setting is TABLE, the effects of the variable also depend on whether the storage engine used by the relay log info table is transactional (such as InnoDB) or not transactional (MyISAM). The effects of these factors on the behavior of the server for sync_relay_log_info values of zero and greater than zero are as follows:

    sync_relay_log_info = 0
    • If relay_log_info_repository is set to FILE, the MySQL server performs no synchronization of the relay-log.info file to disk; instead, the server relies on the operating system to flush its contents periodically as with any other file.

    • If relay_log_info_repository is set to TABLE, and the storage engine for that table is transactional, the table is updated after each transaction. (The sync_relay_log_info setting is effectively ignored in this case.)

    • If relay_log_info_repository is set to TABLE, and the storage engine for that table is not transactional, the table is never updated.

    sync_relay_log_info = N > 0
    • If relay_log_info_repository is set to FILE, the replica synchronizes its relay-log.info file to disk (using fdatasync()) after every N transactions.

    • 如果 relay_log_info_repository 设置为TABLE,并且该表的存储引擎是事务性的,则在每次事务后更新该表。( sync_relay_log_info在这种情况下,该设置实际上被忽略了。)

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