第十七章复制

目录

17.1配置复制
17.1.1二进制日志文件的位置为基础的复制配置概述
17.1.2设置二进制日志文件的位置为基础的复制
下面的复制与全球事务标识符
17.1.4 MySQL多源复制
17.1.5改变复制模式的在线服务器
17.1.6复制和二进制日志记录选项和变量
17.1.7常见复制管理任务
17.2 .复制执行
17.2.1复制格式
17.2.2复制实现的细节
17.2.3复制通道
17.2.4复制继电器状态日志
17.2.5服务器如何评价复制过滤规则
17.3复制解决办法
17.3.1使用复制备份
17.3.2处理复制奴隶意外停止
17.3.3监控基于行的复制
本使用不同的主从复制存储引擎
17.3.5使用规模复制
17.3.6复制不同的数据库,不同的奴隶
17.3.7提高复制性能
17.3.8大师在故障转移切换
17.3.9设置复制使用加密连接
17.3.10半同步复制
17.3.11延迟复制
17.4复制笔记与心得
17.4.1复制的特点和问题
17.4.2复制MySQL版本之间的兼容性
17.4.3升级复制设置
17.4.4排除复制
17.4.5如何报告复制错误或问题

复制使数据从一个MySQL数据库服务器(主)被复制到一个或多个MySQL数据库服务器(奴隶)。默认情况下,复制是异步的;奴隶不需要永久性地连接到从主接收更新。根据配置,你可以复制所有的数据库,选择数据库,甚至选择数据库中的表。

MySQL复制的优点包括:

关于如何在这样的情况下,使用复制,看第17.3节,“复制解决办法”

MySQL 8支持复制的不同方法。传统的方法是基于复制的事件从主人的二进制日志,并要求日志文件和位置,他们是主人和奴隶之间的同步。新的方法的基础上全局事务标识符(gtids)是事务性的,因此不需要在这些文件日志文件或岗位工作,大大简化了许多常见的复制任务。复制使用gtids保证主人和奴隶之间的一致性,只要在主所犯下的所有的交易也被应用在奴隶。关于GTIDs和gtid基于复制MySQL的更多信息,参见部分下面,“复制与全球事务标识符”。对于基于复制二进制日志文件的位置信息,看17.1节,“复制配置”

复制MySQL支持不同类型的同步。同步的原型是单向的,异步复制,在其中一个服务器作为主,而其他一个或多个服务器作为奴隶。在MySQL 8,半同步复制除了内置异步复制支持。半同步复制,提交在主块才回到会话进行交易直到至少一个从确认已经收到并记录交易活动的表演;看第17.3.10,“半同步复制”。MySQL软件还支持延迟复制这样一个从服务器,故意落后于掌握至少一个指定的时间量;看第17.3.11,“延迟复制”。Senaris where同步复制是必需的,使用MySQL集群(参见MySQL NDB集群7.5%和NDB集群7.6

有许多可用的设置服务器之间的复制解决方案,并使用最好的方法取决于数据和你所使用的引擎类型的存在。在可用的选项的更多信息,参见第17.1.2,“建立复制二进制日志文件的位置

有两个核心类型复制格式,基于语句的复制(SBR),复制整个SQL语句,并基于行的复制(RBR),复制只是改变了行。你也可以使用第三多种,混合型复制(MBR)。在不同的复制格式的更多信息,参见17.2.1,“复制格式”

复制是通过一些不同的选择和变量控制。有关更多信息,参见第17.1.6,“复制和二进制日志记录选项和变量”

您可以使用复制来解决不同的问题,包括性能,支持不同数据库的备份,并作为一个更大的解决方案的一部分,以减轻系统故障。关于如何解决这些问题,看看第17.3节,“复制解决办法”

笔记和如何不同的数据类型和报表处理过程中的复制,包括复制功能,细节版本兼容,升级,和潜在的问题及其解决办法,看17.4节,“复制笔记与心得”。对一些问题的回答常问的那些谁是新的MySQL复制,看第a.13,MySQL 8常见问题:复制”

在复制的实现详细信息,如何复制作品的二进制日志的内容和过程,后台线程和规则决定如何陈述的记录和复制,看到第17.2节,“复制执行”

17.1配置复制

本节介绍了如何配置MySQL中可复制的不同类型和包括一个复制的环境所需要的设置和配置,包括创建一个新的复制环境,一步一步的指示。本节的主要成分:

17.1.1二进制日志文件的位置为基础的复制配置概述

本节介绍了MySQL服务器基于二进制日志文件位置的方法之间的复制,在MySQL实例操作为主(数据库的变化源)写的更新和变化事件的二进制日志。在二进制日志信息存储在不同的日志格式,根据数据库变化记录。奴隶被配置为从主读取二进制日志和对奴隶的本地数据库的二进制日志执行事件。

每个从收到的二进制日志中的全部内容。它是奴隶的责任在二进制日志决定哪些语句应该执行。除非另行指定,在主人的二进制日志中所有的事件都在奴隶执行。如果需要,您可以配置的奴隶只处理事件,适用于特定的数据库或表。

重要

你不能配置主日志只有特定的事件。

每个从不断的二进制日志坐标记录:文件名和位置在文件已经阅读并从主处理。这意味着多个奴隶可以连接到主执行相同的二进制日志的不同部分。因为奴隶控制这一过程中,个体的奴隶可以连接和断开与服务器的连接不影响主人的操作。另外,因为每个从记录中的当前位置的二进制日志,要断开的奴隶,这是可能的,重新连接,然后恢复处理。

主人和每一个奴隶都必须配置一个唯一的ID(使用server-id选项)。此外,每个奴隶必须配置的主机名信息,日志文件的名称和位置,在文件。这些细节可以控制在一个会话中使用的MySQLCHANGE MASTER TO在奴隶的声明。详细信息存储在奴隶主的信息库(参见第17.2.4,“复制继电器和状态日志”

17.1.2设置二进制日志文件的位置为基础的复制

本节介绍了如何建立一个MySQL服务器使用二进制日志文件的位置为基础的复制。建立有复制有许多不同的方法,并用精确的方法取决于您设置的复制,你是否已经在你的数据库中的数据。

有一些通用的任务,是所有机构共同:

  • 上主,你必须确保启用了二进制日志,并配置一个唯一的服务器ID。这可能需要重新启动服务器。看到第17.1.2.1,“设置复制主配置”

  • 在每一个奴隶,你想连接到的主人,你必须配置一个唯一的服务器ID。这可能需要重新启动服务器。看到第17.1.2.2,“设置复制从配置”

  • 或者,为您创造奴隶使用认证与掌握阅读复制二进制日志时,在一个单独的用户。看到第17.1.2.3,“创建一个用户复制”

  • 在创建数据快照或启动复制过程中,你应该记录在二进制日志中的当前位置的主人。你需要这个信息当配置的奴隶,奴隶知道在开始执行的二进制日志事件。看到第17.1.2.4,“获取复制二进制日志坐标”

  • 如果你已经在主数据,想用它来同步的奴隶,你需要创建一个数据快照拷贝数据到奴隶。存储引擎你运用你如何创建快照的影响。当你使用MyISAM,你必须停止处理报表在主获得读锁,然后获得其当前的二进制日志坐标和转储数据,之前允许主继续执行语句。如果你不停止执行语句、数据转储和主人的身份信息不匹配,导致不一致或已损坏的数据库上的奴隶。在复制的更多信息MyISAM主人,看第17.1.2.4,“获取复制二进制日志坐标”。如果你使用的是InnoDB,你不需要读锁和事务,是足够长的时间来传输数据快照是足够的。有关更多信息,参见15.18节,“InnoDB和MySQL复制”

  • 配置设置连接到主的奴隶,如主机名、登录凭据,和二进制日志文件的名称和位置。看到第17.1.2.7,“设置主配置上的奴隶”

笔记

在安装过程中的某些步骤要求SUPER特权。如果你没有这个特权,它可能无法启用复制。

配置基本选项后,选择你的场景:

然后使用MySQL复制服务器,阅读整本章中提到的所有报表和尝试13.4.1节,“SQL语句用于控制主服务器”,和第13.4.2,“SQL语句用于控制从服务器”。也熟悉了复制的启动选项第17.1.6,“复制和二进制日志记录选项和变量”

17.1.2.1设置复制主配置

配置主用以复制二进制日志文件的位置,你必须确保启用了二进制日志,并建立一个唯一的服务器ID.如果尚未,服务器需要重新启动。

二进制日志是需要在主因为二进制日志复制从主人的奴隶的基础上。二进制日志是默认启用(的log_bin系统变量设置为ON)。这个--log-bin选择什么基地告诉服务器名称使用二进制日志文件。建议您指定此选项将二进制日志文件的非默认的基本名称,所以如果主机名称的变化,你可以继续使用相同的二进制日志文件的名字(见部分b.5.7”,众所周知的问题,在mysql”

复制拓扑中每台服务器都必须配置一个唯一的服务器ID,您可以指定使用--server-id选项此服务器ID识别复制拓扑在单独的服务器,必须在1和一个正整数(2三十二1)?。如果你设置一个0服务器ID主人,它拒绝从奴隶的任何连接,如果你设置一个0服务器ID是奴隶,它拒绝连接到一个主。除此之外,你如何组织和选取的号码是你的选择,只要每个服务器ID不同,使用的复制拓扑中的任何其他服务器,其他服务器ID。这个server_id系统变量默认设置为1。一个服务器可以开始使用这个默认的服务器ID,但信息是如果你没有指定服务器ID明确发。

笔记

下面的选项也对复制的影响:

  • 为最大可能的耐久性和一致性的复制设置使用InnoDB在交易中,你应该使用innodb_flush_log_at_trx_commit=1sync_binlog=1在复制的my.cnf文件

  • 确保skip-networking在复制没有启用选项。如果网络已被禁用,奴隶不能与主复制失败。

17.1.2.2设置复制从配置

每个复制的奴隶必须如果尚未有一个独特的服务器ID.,这部分从安装程序需要重新启动服务器。

如果从服务器ID没有设置,或者当前的价值冲突与价值,你所选择的主服务器,关闭服务器和编辑[mysqld]在配置文件中指定一个唯一的服务器ID。例如部分:

[mysqld]server-id=2

修改完成后,重新启动服务器。

如果你设置多个奴隶,每个人必须有一个唯一的非零server-id值不同,主、从任何其他的奴隶。

二进制日志的所有服务器上默认启用。奴隶是不需要有二进制日志复制将启用。然而,二进制日志在奴隶意味着奴隶的二进制日志可用于数据备份和故障恢复。

已启用二进制日志的奴隶,也可以作为一个更复杂的复制拓扑的一部分。例如,你可能想要建立复制服务器使用此链接布置:

A -> B -> C

在这里,A作为奴隶的主人B,和B作为奴隶的主人C。这个工作,B必须是主一个奴隶。更新收到A必须记录的B其二进制日志,为了给C。除了二进制日志,这复制拓扑的要求--log-slave-updates选项可启用。使用此选项,奴隶写道,从主服务器接收和奴隶的SQL线程执行的二进制日志更新自己的奴隶。这个--log-slave-updates选项是默认

如果你需要禁用二进制日志或从更新登录服务器,您可以通过指定--skip-log-bin--skip-log-slave-updates斯拉夫语选项

17.1.2.3创建用户复制

每个从连接到使用MySQL用户名和密码的主人,所以必须有主人的奴隶可以使用连接的用户帐户。用户名是由指定的MASTER_USER选择在改变主当你建立一个复制从命令。任何帐户可用于此操作,提供它已获REPLICATION SLAVE特权。您可以选择创建每个从不同的帐户,或连接到使用同一帐户每个奴隶的主人。

虽然你不必创建专门用于复制一个帐户,你应该知道,复制用户名和密码存储在主信息库表的文本mysql.slave_master_info(见第17.2.4.2,“奴隶状态日志”)。因此,你可能需要创建一个单独的账户,只为有特权的复制过程,以尽量减少妥协的可能性其他帐户。

创建一个新帐户,使用CREATE USER。授予该帐户复制所需的权限,使用GRANT声明。如果你仅仅是复制的目的创建一个帐户,这个帐户只需要REPLICATION SLAVE特权。例如,建立一个新的用户,取代,可以连接从任何主机内的复制example.com问题域,这些语句在主:

MySQL的>CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';MySQL的>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';

看到第13.7.1,“账户管理报表”,对用户帐户的操作语句的更多信息。

重要

连接使用的用户帐户进行身份验证和复制大师caching_sha2_password插件,你必须建立一个安全连接所述第17.3.9,“设置复制使用加密连接”,或启用加密连接支持密码交换使用RSA密钥对。这个caching_sha2_password身份验证插件是从MySQL 8中创建新用户的默认值(详情见第6.5.1.3,“缓存SHA-2认证”)。如果你的用户帐户创建或使用复制(指定的MASTER_USER选项)使用该认证插件,你不使用安全连接,您必须启用基于RSA密钥对一个成功的连接密码。

17.1.2.4获得复制二进制对数坐标

配置的奴隶在正确的点开始复制过程中,需要注意掌握的当前坐标在二进制日志。

警告

本程序采用FLUSH TABLES WITH READ LOCK,阻碍COMMIT操作InnoDB

获得硕士双对数坐标,遵循这些步骤:

  1. 通过连接到它的命令行客户端启动一个在主会议,并冲洗所有的表和块写语句的执行FLUSH TABLES WITH READ LOCK声明:

    MySQL的>FLUSH TABLES WITH READ LOCK;
    警告

    让客户从你发布的FLUSH TABLES语句运行以便读锁仍然有效。如果你退出客户端,锁被释放。

  2. 在掌握不同的会话,使用SHOW MASTER STATUS语句来确定当前的二进制日志文件的名称和位置:

    MySQLSHOW MASTER STATUS;------------------ ---------- -------------- ------------------ |文件|位置| binlog_do_db | binlog_ignore_db | ------------------ ---------- -------------- ------------------ | mysql-bin.000003 | 73 |测试|手册,MySQL | ------------------ ---------- -------------- ------------------

    这个File列显示的日志文件的名称和位置列显示在文件中的位置。在这个例子中,二进制日志文件mysql-bin.000003和位置73。记录这些值。你需要他们的时候设置的奴隶。他们所代表的奴隶应该复制坐标处理从主开始新的更新。

    如果主人已禁用先前运行的二进制日志,日志文件的名称和位置值显示SHOW MASTER STATUSmysqldump -硕士-日期将是空的。在这种情况下,这个值,你需要使用后指定奴隶的日志文件和位置时,都是空字符串('')和

你现在要使奴隶从正确的位置开始复制二进制日志开始阅读信息。

下一步取决于你对主的现有数据。选择下列选项之一:

17.1.2.5选择数据快照的方法

如果主数据库中现有的数据需要复制数据到每个奴隶。有不同的方法来把数据从主数据库。以下各节描述了可能的选项。

选择合适的倾销的数据库的方法,在这些选项中选择:

  • 使用mysqldump工具创建一个转储所有你想复制的数据库。这是推荐的方法,尤其是当使用InnoDB

  • 如果你的数据库存储在二进制便携文件,你可以复制原始数据文件到一个奴隶。这可比使用更高效mysqldump在每个从导入的文件,因为它跳过更新索引的开销INSERT报表是重播。存储引擎等InnoDB这是不推荐的

17.1.2.5.1创建数据快照使用mysqldump

创建一个现有数据库中的数据的快照,使用mysqldump工具一旦数据转储已经完成,该数据导入到从开始复制过程。

下面的示例将所有数据库文件命名dbdump.db,包括--master-data选择自动添加CHANGE MASTER TO需要从开始复制过程的声明:

内核>mysqldump --all-databases --master-data > dbdump.db
笔记

如果你不使用--master-data,然后需要锁定所有表在一个单独的会话手动。看到第17.1.2.4,“获取复制二进制日志坐标”

可以排除某些数据库转储使用mysqldump工具如果你想选择哪种数据库,包括在垃圾场,不使用--all-databases。选择其中一个选项:

有关更多信息,参见4.5.4“,”mysqldump一个数据库的备份计划”

数据的导入、复制或转储文件的奴隶,或从主连接时,远程访问文件的奴隶。

17.1.2.5.2创建数据快照使用原始数据文件

本节介绍了如何使用构成数据库的原始文件创建数据快照。采用这种方法用表使用的存储引擎,具有复杂的缓存或测井算法需要额外的步骤来产生一个完美的时间点快照:初始复制命令可以把缓存信息和日志的更新,即使你有一个全局读锁。存储引擎如何回应取决于它的崩溃恢复能力。

如果你使用InnoDB表格,你可以使用mysqlbackup从MySQL企业备份组件产生一个一致的快照命令。这个命令记录日志名和偏移量对应的快照用于奴隶。MySQL企业备份是一个商业产品,包括作为一个MySQL企业认购部分。看到第29,MySQL企业备份概述”详细信息

这种方法也不如果主人和奴隶有不同的值的可靠工作ft_stopword_fileft_min_word_len,或ft_max_word_len你是复制具有全文索引表。

假设上述例外不适用于您的数据库,使用冷备份技术获得可靠的二进制快照InnoDB表:做一个缓慢关闭在MySQL服务器,然后复制数据文件手动。

创建一个原始数据快照MyISAM当你的MySQL数据文件存在于一个单一的文件系统表,你可以使用标准的文件拷贝工具如内容提供商复制远程复制工具,如SCP远程同步归档工具,如拉链焦油,或文件系统快照工具如倾倒。如果你只有一定的数据库复制,只复制那些文件,涉及到那些表。为InnoDB,所有数据库中的所有表都存储在系统表空间文件,除非你有innodb_file_per_table选项

以下文件是不需要复制:

这取决于你使用的是InnoDB表或没有,选择下列之一:

如果你使用的是InnoDB表,并与原始数据快照得到最一致的结果,关闭主服务器的过程中,如下:

  1. 获得读锁,得到主人的地位。看到第17.1.2.4,“获取复制二进制日志坐标”

  2. 在一个单独的会话,关闭主服务器:

    shell> mysqladmin shutdown
    
  3. 复制MySQL数据文件。下面的例子展示了这样的常用方法。你只需选择其中之一:

    shell> tar cf /tmp/db.tar ./data
    shell> zip -r /tmp/db.zip ./data
    shell> rsync --recursive ./data /tmp/dbdata
    
  4. 启动主服务器

如果你不使用InnoDB表,你可以从一个没有关闭服务器在下面描述的步骤掌握得到系统的快照:

  1. 获得读锁,得到主人的地位。看到第17.1.2.4,“获取复制二进制日志坐标”

  2. 复制MySQL数据文件。下面的例子展示了这样的常用方法。你只需选择其中之一:

    shell> tar cf /tmp/db.tar ./data
    shell> zip -r /tmp/db.zip ./data
    shell> rsync --recursive ./data /tmp/dbdata
    
  3. 在你获得的读锁定客户,释放锁:

    mysql> UNLOCK TABLES;
    

一旦你已经创建的数据库文件或复制,复制文件到每个奴隶的奴隶的复制过程开始之前。

17.1.2.6设置复制的奴隶

以下各节描述如何建立奴隶。在你开始之前,确保你已经:

接下来的步骤取决于你现有的数据导入到奴隶或不。看到第17.1.2.5,“选择方法对数据的快照”更多信息。选择下列之一:

17.1.2.6.1设立新的主人和奴隶的复制

当没有快照以前的数据库导入,配置从属从新主人开始复制。

建立一个新的奴隶主之间的复制:

  1. 启动MySQL的奴隶。

  2. 执行CHANGE MASTER TO设置硕士复制服务器配置。See第17.1.2.7,“设置主配置上的奴隶”

在每一个奴隶执行这些奴隶的安装步骤。

这种方法也可以如果你设置新的服务器,但是有一个现有的转储数据库从一个不同的服务器,你想装载到你的复制配置。通过加载数据到一个新的主人,数据自动复制到奴隶。

如果你正在建立一个新的复制环境中使用不同的现有数据库服务器中的数据创建一个新的主人,从服务器上运行产生的新主人的转储文件。该数据库的更新,自动传播的奴隶:

shell> mysql -h master < fulldb.dump
17.1.2.6.2设置复制现有的数据

当设置复制现有数据传输快照主从开始复制。导入数据到奴隶的过程取决于你如何创建在主数据的快照。

选择下列之一:

如果你使用mysqldump

  1. 开始使用奴隶,--skip-slave-start选项,复制不启动

  2. 进口转储文件:

    shell> mysql < fulldb.dump
    

如果你创建了一个快照使用原始数据文件:

  1. 数据文件提取到你的奴隶数据目录。例如:

    shell> tar xvf dbdump.tar
    

    您可能需要设置权限和所有权的文件,从服务器可以访问和修改。

  2. 开始使用奴隶,--skip-slave-start选项,复制不启动

  3. 与复制配置从属坐标从主。这告诉奴隶的二进制日志文件的位置在哪里复制需要的文件。同时,随着登录凭据和主主机名配置从属。上的更多信息CHANGE MASTER TO声明要求,见第17.1.2.7,“设置主配置上的奴隶”

  4. 启动线程的奴隶:

    mysql> START SLAVE;
    

当你完成这个过程,从连接到主和主自拍摄快照后发生的任何更新复制。错误消息发布给奴隶的错误日志,如果是不可以复制的任何理由。

从使用信息记录在其主日志和中继日志信息日志记录有多少大师的二进制日志已处理。从MySQL 8,默认情况下,这些奴隶状态日志库表slave_master_infoslave_relay_log_infomysql数据库可选择的设置--master-info-repository=FILE--relay-log-info-repository=FILE,在库文件命名为master.inforelay-log.info在数据目录,现在已经废弃,并将在未来的版本中删除。

删除或修改这些表(或文件,如果使用)除非你知道你在做什么,充分理解其含义。即使在这种情况下,最好是使用CHANGE MASTER TO语句更改复制参数。从使用的语句来更新奴隶地位的规定值记录自动。看到第17.2.4,“复制继电器和状态日志”为更多的信息

笔记

船长日志的内容覆盖了在命令行或在指定服务器选项my.cnf。看到第17.1.6,“复制和二进制日志记录选项和变量”,更多的细节

大师的一个单一的快照足够多的奴隶。设置额外的奴隶,使用相同的主快照和遵循的程序部分描述的是奴隶。

17.1.2.7设置主配置上的奴隶

建立奴隶与复制的主沟通,有必要的连接信息配置的奴隶。为此,执行以下的奴隶的说法,对你的系统相关的实际值替换选项值:

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='master_host_name',
    ->     MASTER_USER='replication_user_name',
    ->     MASTER_PASSWORD='replication_password',
    ->     MASTER_LOG_FILE='recorded_log_file_name',
    ->     MASTER_LOG_POS=recorded_log_position;
笔记

复制不能使用Unix套接字文件。你必须能够连接到使用TCP / IP主机的MySQL服务器。

这个CHANGE MASTER TO声明中也有其他的选择以及。例如,可以建立安全的复制使用SSL。一个完整的选项列表,和信息的最大允许长度的字符串值的选项,看第13.4.2.1,“变化掌握语法”

重要

正如在第17.1.2.3,“创建一个用户复制”,如果你不使用安全连接和用户帐户中指定MASTER_USER选择认证的caching_sha2_password插件(从MySQL 8的默认值),则必须指定MASTER_PUBLIC_KEY_PATHget_master_public_key选项中的CHANGE MASTER TO语句使RSA密钥对密码交换的基础。

17.1.2.8添加到复制环境的奴隶

你可以到一个现有的复制配置添加另一个奴隶不停的主人。相反,建立新的奴隶通过复制现有的奴隶,除非你配置不同的新的奴隶server-id价值

复制现有的奴隶:

  1. 关闭现有的奴隶:

    shell> mysqladmin shutdown
    
  2. 数据复制目录从现有的奴隶的奴隶。你可以通过创建一个档案利用焦油WinZip,或使用工具,如执行直接复制内容提供商远程同步。确保你的日志文件复制和中继日志文件。

    一个普遍的问题就是遇到增加新复制的奴隶,奴隶没有新一系列这样的警告和错误信息:

    071118 16:44:10 [Warning] Neither --relay-log nor --relay-log-index were used; so
    replication may break when this MySQL server acts as a slave and has his hostname
    changed!! Please use '--relay-log=new_slave_hostname-relay-bin' to avoid this problem.
    071118 16:44:10 [ERROR] Failed to open the relay log './old_slave_hostname-relay-bin.003525'
    (relay_log_pos 22940879)
    071118 16:44:10 [ERROR] Could not find target log during relay log initialization
    071118 16:44:10 [ERROR] Failed to initialize the master info structure
    

    这种情况可以发生如果--relay-log选项,作为中继日志文件包含主机名的文件名的一部分。这也是中继日志索引文件如果--relay-log-index选项不使用。看到第17.1.6,“复制和二进制日志记录选项和变量”有关这些选项的更多信息。

    为了避免这个问题,使用相同的值--relay-log这是用在现有的新奴隶的奴隶。如果这个选项没有显式设置在现有的奴隶,使用existing_slave_hostname中继站。如果这是不可能的,复制现有的奴隶的中继日志索引文件到新的奴隶和设置--relay-log-index选择新的奴隶来匹配所用的奴隶。如果这个选项没有显式设置在现有的奴隶,使用existing_slave_hostname-relay-bin.index。或者,如果你已经尝试开始新的奴隶后剩下的本节中的步骤和遇到的错误就像前面描述的那些,然后执行以下步骤:

    1. 如果你还没有这样做,问题STOP SLAVE在新的奴隶

      如果你已经开始存在的奴隶了,问题STOP SLAVE在现有的奴隶一样

    2. 复制现有的奴隶的中继日志索引文件的内容到新的奴隶的中继日志索引文件,确保覆盖所有内容已经在文件。

    3. 继续在本节剩下的步骤。

  3. 如果文件已被用于主信息和中继日志信息库(参见第17.2.4,“复制继电器和状态日志”),复制这些文件从现有的奴隶的奴隶。这些持有主人的二进制日志和从中继日志当前日志坐标。如果表被用于仓库,现在是默认的,表在已复制的数据目录。

  4. 从现有的奴隶

  5. 在新的奴隶,编辑配置给新从一个独特的server-id由船长或任何现有的奴隶不习惯。

  6. 开始新的奴隶。从使用它的主人的信息库的信息开始复制过程。

下面的复制与全球事务标识符

本节说明了基于事务复制使用全局事务标识符(gtids)。当使用gtids,每笔交易可以被识别,它致力于在源服务器和任何奴隶应用跟踪;这意味着它是没有必要在使用gtids参考日志文件或位置,在这些文件时,开始一个新的奴隶或未移交给新主人,大大简化了这些任务。因为gtid基于复制完全是以交易为基础的,这是简单的判断主人和奴隶是一致的;只要在主提交的所有交易也在从犯,两者之间的一致性是有保证的。你可以使用语句或基于行的复制(见gtids17.2.1,“复制格式”);然而,为了达到最佳效果,我们建议您使用基于行的格式。

gtids总是保护主人和奴隶之间。这意味着你可以确定任何交易应用于任何奴隶从二进制日志源。此外,一旦一个事务被提交给gtid给定服务器上,具有相同的gtid任何随后的交易是由服务器忽略。因此,事务犯的主人可以应用不超过一次的奴隶,这有助于保证一致性。

该部分论述了以下几个问题:

关于MySQL服务器选项和变量有关gtid基于复制的信息,参见第17.1.6.5,“全局事务ID选项和变量”。参见12.17节,“功能使用全局事务ID”它描述了SQL函数,通过MySQL 8用于支持GTIDs。

17.1.3.1 gtid格式和存储

全局事务标识符(gtid)是一个独特的标识符创建与每个事务在源服务器的承诺相关的(主)。这个标识符是唯一的不只是服务器上,它的起源,而且是独特的在所有服务器在一个给定的复制拓扑。

gtid分配客户交易之间的区分,这是对主人的承诺,和复制的事务,这是一个奴隶转载。当一个客户交易是在主人的承诺,这是分配一个新的gtid,提供交易写入二进制日志。客户交易保证有单调递增的gtids没有生成的数字之间的差距。如果客户交易不写入二进制日志(例如,因为交易被过滤掉,或者交易是只读的),不是分配在源服务器的一gtid。

复制的事务保持相同的gtid,被分配到交易对源服务器。复制的事务开始执行之前,gtid是存在的,并坚持即使复制事务不是写在奴隶的二进制日志,或是过滤出来的奴隶。MySQL系统表mysql.gtid_executed是用来保存指定GTIDs所有交易施加在一个MySQL服务器,除了那些被存储在当前的二进制日志文件。

对于gtids自动跳过功能意味着在主提交的事务可以应用不超过一次的奴隶,这有助于保证一致性。一次与一个给定的gtid交易一直致力于在一个给定的服务器,任何试图以同样的gtid执行后续事务是由服务器忽略。没有错误是升高的,并在交易没有执行语句。

如果一个给定的gtid交易已经开始在服务器上执行,但尚未提交或回滚,任何试图在同gtid服务器启动一个并发事务将块。没有开始执行并发事务也将控制返回给客户端服务器。一旦在交易的第一次尝试提交或回滚,并发会话被阻塞在同一gtid可以。如果第一次尝试回滚,一个并发会话继续尝试交易,和任何其他并发会话被阻塞在同一gtid保持封闭。如果第一次尝试的承诺,所有的并发会话停止封锁,并自动跳过所有的交易报表。

一个gtid表示为一对坐标,由冒号分隔(:),如下所示:

GTID =source_idtransaction_id

这个source_id标识源服务器。通常,服务器的server_uuid用于此目的的。这个transaction_id是一个由顺序在交易服务器上的承诺确定的序列数;例如,将第一个交易作为其transaction_id,和第十的交易是在同一个源服务器将被分配一个transaction_id属于。一个事务都是不可能的0作为一个gtid序列号。例如,将原来的UUID服务器二十三交易3e11fa47 - 71ca - 11e1 - 9e33 - c80aa9429562这个GTID:

3E11FA47-71CA-11E1-9E33-C80AA9429562:23

这种格式是用来在诸如输出代表gtidsSHOW SLAVE STATUS以及在二进制日志。他们也可以看到当查看日志文件mysqlbinlog--base64-output=DECODE-ROWS或在输出SHOW BINLOG EVENTS

书面陈述如输出SHOW MASTER STATUS表明奴隶的身份,一系列来自同一服务器gtids可以折叠成一个单一的表达,如下所示。

3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5

上面的例子是第一到第五的交易来自MySQL服务器的server_uuid3e11fa47 - 71ca - 11e1 - 9e33 - c80aa9429562

这种格式也可以用来提供所需的参数START SLAVE选项在SQL _ _ gtidsSQL_AFTER_GTIDS

gtid集

一个gtid套全局事务标识符为如下所示:

gtid_set:
    uuid_set [, uuid_set] ...
    | ''

uuid_set:
    uuid:interval[:interval]...

uuid:
    hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh

h:
    [0-9|A-F]

interval:
    n[-n]

    (n >= 1)

gtid集是用于在几个方面的MySQL服务器。例如,存储的值gtid_executedgtid_purged系统变量为gtid集。此外,功能GTID_SUBSET()GTID_SUBTRACT()需要gtid集作为输入。当gtid集从服务器变量返回,UUID是按字母顺序和数字间隔合并升序。

mysql.gtid_executed表

gtids都存储在一个表名gtid_executed,在MySQL数据库本表中对应一行,每gtid或套gtids表示,对原始服务器的UUID,并开始和结束事务ID的设置;一行引用只有一个单一的gtid,这最后的两个值相同。

这个mysql.gtid_executed创建表(如果它已经不存在了)当MySQL服务器安装或升级,使用CREATE TABLE语句类似,这里显示:

创建表gtid_executed(source_uuid char(36)不为空,interval_start bigint(20)不为空,interval_end bigint(20)不为空,主键(source_uuid,interval_start))
警告

与其他数据库系统表,不要试图创建或修改表自己。

这个mysql.gtid_executed表使奴隶使用gtids当二进制日志是从残疾人,使历史的gtid保留当二进制日志已失去了。

gtids存储在mysql.gtid_executed桌上只有gtid_mode打开(放)ON_PERMISSIVE。在这gtids存储点取决于是否启用或禁用二进制日志:

  • 如果禁用二进制日志(log_bin关闭),或者log_slave_updates是残疾人,服务器存储gtid属于每个交易与表中的交易。此外,该表被压缩在一个用户可配置的周期率;看mysql.gtid_executed表压缩为更多的信息。这种情况只能在复制的奴隶,或奴隶的二进制日志更新禁用日志记录的应用。它不会复制申请,因为主人,二进制日志必须复制将启用。

  • 如果启用了二进制日志(log_bin打开(放)),每当二进制日志旋转或服务器关闭,服务器写GTIDs,写进了以前的二进制日志到交易mysql.gtid_executed表这种情况适用于复制,或复制从二进制日志记录功能。

    在服务器停机意外事件,从当前的二进制日志gtids设置不保存在mysql.gtid_executed表在这种情况下,这些gtids添加到表,在设定的gtidsgtid_executed系统变量在恢复

    当启用了二进制日志,mysql.gtid_executed表不提供所有已执行的交易记录完整的gtids。这些信息是由全球价值提供gtid_executed系统变量

这个mysql.gtid_executed表重置RESET MASTER

mysql.gtid_executed表压缩

在该课程的时间,mysql.gtid_executed表格可以成为充满指个人gtids源自同一服务器上的多行的事务ID,组成一个序列,类似于如下所示:

MySQL的&#62;SELECT * FROM mysql.gtid_executed;-------------------------------------- ---------------- -------------- | source_uuid | interval_start | interval_end | | -------------------------------------- ---------------- -------------- | | 3e11fa47-71ca-11e1-9e33-c80aa9429562 | 37 | 37 | | 3e11fa47-71ca-11e1-9e33-c80aa9429562 | 38 | 38 | | 3e11fa47-71ca-11e1-9e33-c80aa9429562 | 39 | 39 | | 3e11fa47-71ca-11e1-9e33-c80aa9429562 | 40 | 40 | | 3e11fa47-71ca-11e1-9e33-c80aa9429562 | 41 | 41 | | 3e11fa47-71ca-11e1-9e33-c80aa9429562 | 42 | 42 | | 3e11fa47-71ca-11e1-9e33-c80aa9429562 | 43 | 43 |…

相当大的空间可以如果此表通过替换每个组排一行跨事务标识整个区间周期性压缩保存,这样:

+--------------------------------------+----------------+--------------+
| source_uuid                          | interval_start | interval_end |
|--------------------------------------+----------------+--------------|
| 3E11FA47-71CA-11E1-9E33-C80AA9429562 | 37             | 43           |
...

当gtids启用,该服务器执行这种类型的压缩在mysql.gtid_executed表定期。你可以控制,可以经过之前的表被压缩的交易数量,从而压缩率,通过设置gtid_executed_compression_period系统变量。这个变量的默认值是一千;这意味着,默认情况下,表的压缩后,每1000事务执行。设置gtid_executed_compression_period为防止压缩从正在进行的一切;然而,你应该准备对磁盘空间的数量,可能需要通过一个潜在的大量增加gtid _ executed如果你这样做

笔记

当启用了二进制日志,价值gtid_executed_compression_period用和mysql.gtid_executed表压缩每个二进制日志中旋转。

压缩的mysql.gtid_executed表是由一个专门的前台线程命名进行线程/ SQL / compress_gtid_table。这个帖子是不是在输出上市SHOW PROCESSLIST,但它可以被看作是在一排threads表,如下所示:

MySQL的&#62;SELECT * FROM performance_schema.threads WHERE NAME LIKE '%gtid%'\G*************************** 1。行*************************** thread_id:26名称:螺纹/ SQL / compress_gtid_table类型:前景processlist_id:1 processlist_user:空processlist_host:空processlist_db:nullprocesslist_command:守护processlist_time:1509 processlist_state:悬浮processlist_info:空parent_thread_id:1作用:空仪表:是的历史:是的connection_type:空thread_os_id:18677

这个thread/sql/compress_gtid_table线程通常睡到gtid_executed_compression_period交易被执行,然后醒来后进行压缩的mysql.gtid_executed表格描述。然后睡到另一个gtid_executed_compression_period交易已经发生,然后醒来后再进行压缩,重复这个循环下去。将该值设置为0时,二进制日志是残疾人意味着线程总是睡不醒。

17.1.3.2 gtid生命周期

一个gtid生命周期包括以下步骤:

  1. 交易执行和对主人承诺。此客户端事务分配一个由主人的UUID和最小的非零的事务序列号没有在此服务器上使用gtid。的gtid写入到主人的二进制日志(紧接交易本身在日志)。如果客户交易不写入二进制日志(例如,因为交易被过滤掉,或者交易是只读的),它没有指定gtid。

  2. 如果一个gtid被分为交易,坚持的gtid原子在写它的二进制日志在事务开始时提交时间(如Gtid_log_event)。每当二进制日志旋转或服务器关闭,服务器写GTIDs,写进了以前的二进制日志文件到交易mysql.gtid_executed

  3. 如果一个gtid被分为交易的gtid是外化,非原子(交易后不久承诺)添加到在集gtidsgtid_executed系统变量(global.gtid _ executed @)。这gtid集包含所有已提交的事务集的表示gtid。二进制日志功能(如主要求),在设定的gtidsgtid_executed系统变量是一个完整的交易应用的记录,但mysql.gtid_executed表是没有的,因为最近的历史仍在当前的二进制日志文件。

  4. 在二进制日志中的数据传输到存储在奴隶和奴隶的中继日志(使用已建立的机制,这个过程中,看到第17.2节,“复制执行”,详情),从读gtid和设置它的值gtid_next系统变量为这gtid。这告诉奴隶,接下来的交易必须登录使用本gtid。需要注意的是,从集重要gtid _下在会话上下文

  5. 从验证没有线程尚未采取的gtid所有权gtid_next为了处理交易。通过阅读和检查复制事务的gtid首先处理前奴隶交易本身,不仅保证了没有以前的交易有gtid已应用于奴隶,也没有其他的会话已经读过这gtid但尚未提交关联交易。如果多个客户端试图使用相同的交易的同时,服务器解决这个让他们中只有一个执行。这个gtid_owned系统变量(国有global.gtid _ @)为奴隶显示每个gtids目前正在使用和拥有它的线程的ID。如果gtid已经被使用,没有引发错误,并自动跳过功能是用来忽略交易。

  6. 如果gtid尚未使用,奴隶将复制事务。因为gtid_next设置为gtid由主已经分配,奴隶并不试图生成此交易的一个新的gtid,而是使用gtid存储在gtid_next

  7. 如果二进制日志是对奴隶的gtid启用,是坚持原子在写的二进制日志在事务开始时提交时间(如Gtid_log_event)。每当二进制日志旋转或服务器关闭,服务器写GTIDs,写进了以前的二进制日志文件到交易mysql.gtid_executed

  8. 如果二进制日志是从残疾人的gtid坚持写它直接进入原子mysql.gtid_executed表MySQL的附加声明事务插入gtid到表。在MySQL 8中,这个操作是原子的DDL语句以及DML语句。在这种情况下,的mysql.gtid_executed表是一个完整的交易记录于奴隶。

  9. 复制交易后不久在奴隶的承诺,gtid体现非自动添加到在集gtidsgtid_executed系统变量(global.gtid _ executed @)为奴隶。作为主人,这gtid集包含所有已提交的事务集的表示gtid。如果二进制日志是对残疾人的奴隶,mysql.gtid_executed表是一个完整的交易记录于奴隶。如果二进制日志是对奴隶的启用,意味着一些gtids仅记录在二进制日志,在设定的gtidsgtid_executed系统变量是唯一完整的记录。

这是完全过滤掉在掌握客户交易不分配一个gtid,因此他们没有加入到交易中的设置gtid_executed系统变量,或添加到mysql.gtid_executed表然而,复制的事务,完全过滤掉了奴隶是坚持。如果二进制日志是从启用,筛选出交易写入二进制日志作为一个Gtid_log_event其次是只包含一个空的交易开始和COMMIT语句。如果二进制日志被禁用,对筛选出的交易gtid写入mysql.gtid_executed表过滤交易保持gtids保证mysql.gtid_executed表中的组gtidsgtid_executed系统变量可以被压缩。它还确保过滤掉交易不再次检索如果奴隶重新连接到主。

在一个多线程复制的奴隶(与slave_parallel_workers > 0),交易可以应用并行,所以复制的事务可以提交了订单(除非slave_preserve_commit_order=1是集)。当这种情况发生时,在设定的gtidsgtid_executed系统变量将包含多个gtid范围与差距。(在主或单线程复制的奴隶,会有单调递增的gtids没有之间的数字。差距)在最近应用交易只出现在多线程复制奴隶的空白,并填充在复制过程。当复制线程停止清洁利用STOP SLAVE声明中,正在进行的交易的应用使缝隙填满。在一个关闭如服务器故障或使用的事件KILL声明停止复制线程,差距可能依然存在。

客户机通过设置变量模拟复制的交易是可能的@@session.gtid_next一个有效的gtid(由一个UUID和事务序列号,用冒号分隔)执行交易之前。这种技术是用mysqlbinlog生成一个转储,客户端可以重放保护GTIDs的二进制日志。一个模拟的复制事务致力于通过客户端完全等价于一个复制的事务通过复制线程的承诺,他们不能区分事实后。

gtid _ purged

“上大学的gtidsgtid_purged系统变量(“@global.gtid_purged)包含所有的交易已在服务器上提交的GTIDs,但不在服务器上的二进制日志文件存在。下列gtids在本集:

  • 已复制事务,致力于与二进制日志对残疾人gtids奴隶

  • 交易被写入二进制日志文件已经被清除gtids

  • gtids增加了明确的语句集SET @@global.gtid_purged

“上大学的gtidsgtid_purged系统变量被初始化服务器启动时。每一个二进制日志文件开始的事件以前_ gtids _ _事件日志,在历次的二进制日志文件包含gtids设定(在前面的文件的gtids组成Previous_gtids_log_event,和每一个的gtidsgtid _ _事件日志在文件本身)。the contents ofPrevious_gtids_log_event在古老的二进制日志文件来初始化gtid_purged当服务器启动,并保持,当一个二进制日志文件的清除。

17.1.3.3 gtid自动定位

gtids代替以前需要确定的点开始,文件偏移量对停止或恢复主机和从机之间的数据流。当gtids都在使用,所有的信息,从需求与主同步直接从复制数据流获取。

使用基于gtid复制开始的奴隶,你不包括MASTER_LOG_FILEmaster_log_pos选择在CHANGE MASTER TO声明用于直接从复制从一个给定的主。这些选项指定的日志文件的名称和起始位置的文件,但GTIDs的奴隶不需要全局数据。相反,你需要使master_auto_position选项为充分说明配置和启动主人和奴隶使用gtid通过复制,看第17.1.3.4,“设置复制使用gtids”

这个MASTER_AUTO_POSITION选项默认是禁用的。如果多源复制在奴隶的启用,你需要为每个应用复制通道设置选项。禁用master_auto_position期权又让奴隶恢复到基于文件的复制,在这种情况下,您还必须指定一个或两个的MASTER_LOG_FILEmaster_log_pos选项

当一个复制的奴隶已经gtids启用(GTID_MODE=ON一个多月以前评论OFF_PERMISSIVE)和master_auto_position启用选项,自动定位是连接到主活性。船长必须有GTID_MODE=ON设置为连接成功。在初始握手,从发送gtid集包含交易,它已经收到,承诺,或两者。这gtid设置在相等的gtids集的联盟gtid_executed系统变量(global.gtid _ executed @),并记录在性能模式gtids集replication_connection_status表收到交易(语句的结果选择received_transaction_set从performance_schema.replication_connection_status

大师的响应发送的所有交易记录在其二进制日志的gtid是不包括在gtid由奴隶派。这种交流使主人只发送交易与gtid认为奴隶已经不能记录或承诺。如果从多个主机接收到的交易,在金刚石拓扑的情况下,自动跳过功能确保交易不适用两次。(自动跳过功能也保证了主跳在初始握手。奴隶把交易)

如果有,应该是由主机发送的交易已经从主的二进制日志清除,或添加该组gtidsgtid_purged另一个方法的系统变量,主发送错误er_master_has_purged_required_gtids的奴隶,并复制不启动。失踪的GTIDs清除交易识别和警告消息在主人的错误日志上市是_发现_ _ gtids缺失。奴隶不能自动恢复从这个错误是因为交易历史是需要赶上主零件已被清除。尝试重新连接无MASTER_AUTO_POSITION选项启用仅导致清除交易奴隶的损失。正确的方法,从这种情况中恢复是从复制丢失的上市交易的是_发现_ _ gtids缺失从另一个源的信息,或为奴隶被从最近的备份创建了一个新的奴隶取代。考虑修改二进制日志保质期(binlog_expire_logs_seconds)在确保这种情况不会再次发生的主。

如果交易发现奴隶记录或提交的事务在gtid大师的UUID的交换中,但主人本身并没有承诺他们,主发送错误er_slave_has_more_gtids_than_master对奴隶和复制不启动。这种情况如果奴隶供应成为新的大师出现,但是你没有核实,奴隶是更先进的比其他的奴隶。正确的方法,从这种情况中恢复是手动检查是否主从有分歧,并进行个人交易的需要手动解决冲突,或删除或主人或奴隶的复制拓扑。

17.1.3.4设置复制使用gtids

本节介绍了用于配置和启动基于MySQL 8 gtid复制过程。这是一个冷启动程序的假设,你开始第一次的复制,或有可能阻止它;关于配置复制奴隶使用从运行主gtids信息,看第17.1.3.5,“用gtids故障转移和Scaleout”。有关更改服务器上的在线gtid模式的信息,参见第17.1.5,“改变复制模式的在线服务器”

最简单的可能的gtid复制拓扑结构由一个主机和一个奴隶在启动过程中的关键步骤如下:

  1. 如果复制已经运行,同步服务器通过使他们只读。

  2. 停止服务器

  3. 重新启动服务器gtids启用并正确的选项配置。

    这个mysqld启动服务器进行必要的选项进行了下面的例子在本节稍后。

    笔记

    server_uuid必须存在gtids正常。

  4. 指导奴隶使用主作为复制数据源和使用自动定位。要做到这一步的SQL语句进行了下面的例子在本节稍后。

  5. 以一个新的备份。二进制日志包含交易无gtids不能用于服务器,gtids启用,所以才采取这一点不能用你的新配置备份。

  6. 开始的奴隶,然后禁用服务器的只读模式,使他们能够接受更新。

在下面的例子中,两个服务器已经为主人和奴隶,使用MySQL的二进制日志位置的复制协议。如果你开始看到新的服务器,第17.1.2.3,“创建一个用户复制”有关添加复制连接一个特定的用户信息第17.1.2.1,“设置复制主配置”有关设置server_id变量。下面的示例演示如何存储mysqld在服务器选项文件启动选项,看第4.2.6、“使用选项文件”更多信息。或者你可以使用启动选项运行时mysqld

大部分的步骤需要MySQL的使用root帐户或另一个MySQL的用户帐户,有SUPER特权mysqladminshutdown要么需要超级的特权或SHUTDOWN特权

步骤1:同步服务器这一步只需要工作,已经不使用时gtids服务器复制。新的服务器继续进行步骤3。使服务器的只读设置read_only系统变量打开(放)我们每个服务器by the following:发行

mysql> SET @@global.read_only = ON;

等待所有正在进行的事务提交或回滚。然后,让奴隶赶上大师。你让奴隶已经处理了所有的更新在继续之前是非常重要的

如果你使用二进制日志以外的任何复制的,例如做时间点备份和恢复,等到你不需要包含交易的旧的二进制日志没有gtids。理想情况下,等待服务器来清除所有的二进制日志,并等待所有现有的备份过期。

重要

重要的是要明白,日志包含交易无gtids不能用于服务器,gtids启用。在继续之前,您必须确保交易无gtids不在任何地方存在的拓扑结构。

步骤2:停止both服务器。停止每个服务器使用mysqladmin如图所示,在username是一个具有足够的权限来关闭服务器MySQL用户的用户名:

内核&#62;mysqladmin -uusername -p shutdown

然后提供该用户的密码的提示。

第三步:起步舞步舞步舞曲使gtid通过复制,每个服务器必须开始启用gtid模式设置gtid_mode变量打开(放),并与enforce_gtid_consistency变量能够确保只有安全的基础gtid复制报表记录。例如:

gtid_mode=ONenforce-gtid-consistency=true

此外,你应该开始奴隶的--skip-slave-start在配置了奴隶的设置选项。在gtid相关选项和变量的更多信息,参见第17.1.6.5,“全局事务ID选项和变量”

它不是强制性的有二进制日志启用要使用gtids时使用mysql.gtid_executed表。大师总是有二进制日志功能为了能够复制。然而,从服务器可以使用gtids但没有二进制日志。如果你需要禁用一个从属服务器的二进制日志,你可以通过指定--skip-log-bin--skip-log-slave-updates斯拉夫语选项

步骤4:配置从属使用gtid基于自动定位。告诉奴隶使用主gtid交易作为复制的数据源,并使用gtid基于自动定位而不是基于文件的定位。问题CHANGE MASTER TO在奴隶的声明,包括master_auto_position在一份声明中说奴隶主人的交易是通过gtids选项。

您可能还需要提供适当的值为硕士的主机名和端口号以及复制的用户帐户可以由奴隶用于连接到主的用户名和密码;如果这些已经设置为步骤1并没有进一步的需要作出改变之前,相应的选项可以安全地从这里显示的表略。

mysql> CHANGE MASTER TO
     >     MASTER_HOST = host,
     >     MASTER_PORT = port,
     >     MASTER_USER = user,
     >     MASTER_PASSWORD = password,
     >     MASTER_AUTO_POSITION = 1;

无论是MASTER_LOG_FILE选项和master_log_pos选择may be used withMASTER_AUTO_POSITION等于1。试图这么做的原因CHANGE MASTER TO语句失败与错误

第五步:采取一个新的备份。现有的备份,在你启用gtids可以不再使用这些服务器上现在你已经开启了gtids。在这一点上采取一个新的备份,这样你就不会没有一个可用的备份。

例如,您可以执行FLUSH LOGS在服务器上你要备份。然后直接把备份或等待任何周期的备份程序可以设置下一个迭代。

步骤6:开始奴隶和禁用只读模式。从这样开始:

mysql> START SLAVE;

如果你配置服务器在步骤1中是只读的步骤是必要的。允许服务器开始接受更新一次,发表如下声明:

mysql> SET @@global.read_only = OFF;

基于gtid复制现在应该运行,你可以开始(或继续)之前,作为主人的活动。第17.1.3.5,“用gtids故障转移和Scaleout”,讨论新的奴隶创作时使用gtids。

17.1.3.5使用故障转移和Scaleout gtids

还有当使用全局事务标识符MySQL复制技术数(gtids)配置新的奴隶,然后可以用于scaleout,被提拔为掌握必要的故障转移。本节描述了以下技术:

全局事务标识符添加到MySQL复制简化为在复制数据流管理、特别是故障转移活动的目的。每个标识符唯一地标识一组二进制日志事件,共同构成了一个交易。gtids在将更改应用到数据库中扮演一个关键角色:服务器自动跳过任何具有标识符,服务器识别为一个具有加工前的交易。这种行为是至关重要的自动复制的定位和正确的故障转移。

标识符和包含一个给定的事务是在二进制日志中捕获的事件集之间的映射。这带来了一些挑战,当配置一个新的服务器与另一个现有服务器数据。在新的服务器复制的标识符,它是必要的复制标识符从旧服务器到新的一个,并且保持标识符和实际事件之间的关系。这是恢复奴隶,立即为候选人成为故障转移或切换新掌握必要的。

简单的复制复制所有标识符和交易上的一个新的服务器的最简单的方法是使新的服务器为主,整个执行历史的奴隶,使全局事务标识符在服务器。看到第17.1.3.4,“设置复制使用gtids”为更多的信息

一旦复制开始,新的服务器副本从掌握整个二进制日志中,从而获得所有关于GTIDs的所有信息。

该方法简单有效,但需要奴隶从主人读取二进制日志;有时要赶上掌握新的奴隶一个比较长的时间,所以这个方法不适合快速故障转移或从备份还原。本节说明如何避免取所有的执行历史的二进制日志文件复制到新服务器的主。

复制数据和事务的奴隶。执行整个交易历史很耗时,当源服务器处理大量的交易之前,这可以代表一个主要的瓶颈时,建立一个新的复制的奴隶。为了消除这一要求,数据集的一个快照,二进制日志和源服务器包含了全球交易信息可以导入到新的奴隶。源服务器可以是主人还是奴隶,但你必须确保源处理所需的所有交易数据复制。

这种方法有几个变种,所不同的是,在从二进制日志数据仓库和交易转移到奴隶的方式,在这里:

数据集
  1. 创建一个转储文件使用mysqldump在源服务器上。设置mysqldump选项--master-data(用默认值1)包括CHANGE MASTER TO与二进制日志信息的声明。设置--set-gtid-purged选项汽车(默认)或ON,包括执行交易的转储信息。然后使用MySQL客户导入转储文件在目标服务器上。

  2. 另外,创建一个数据快照使用原始数据文件的源服务器,然后将这些文件复制到目标服务器,下面的指令第17.1.2.5,“选择方法对数据的快照”。如果你使用InnoDB表格,你可以使用mysqlbackup从MySQL企业备份组件产生一个一致的快照命令。这个命令记录日志名和偏移量对应的快照用于奴隶。MySQL企业备份是一个商业产品,包括作为一个MySQL企业认购部分。看到第29,MySQL企业备份概述”详细信息

  3. 另外,同时停止源服务器和目标服务器,复制的源数据目录到新的奴隶数据目录的内容,然后重新启动的奴隶。如果你使用这个方法,奴隶必须被配置为基于gtid复制,换句话说,gtid_mode=ON

交易历史

如果源服务器的二进制日志完整的交易历史(即的gtid集@@global.gtid_purged是空的),你可以使用这些方法。

  1. 进口的二进制日志从源服务器使用的新的奴隶mysqlbinlog,与--read-from-remote-server--read-from-remote-master选项

  2. 另外,复制源服务器的二进制日志文件的奴隶。你可以从使用拷贝mysqlbinlog--read-from-remote-server--raw选项这些可以读到从用mysqlbinlog>file(没有--raw选项)导出二进制日志文件的SQL文件,然后将这些文件到MySQL客户端的处理。确保所有的二进制日志文件是使用一个单一的处理MySQL的过程,而不是多个连接。例如:

    shell> mysqlbinlog copied-binlog.000001 copied-binlog.000002 | mysql -u root -p
    

    有关更多信息,参见第4.6.8.3,“用mysqlbinlog备份二进制日志文件”

这种方法的优点是一个新的服务器几乎立即可用;只有那些交易承诺而快照或转储文件被重播仍需从现有获得硕士。这意味着奴隶的可用性不instantanteous,但只有一个相对较短的时间量应为奴隶赶上这些仅存的交易要求。

在二进制日志复制到目标服务器提前通常比从实时掌握阅读整个事务执行历史更快。然而,它并不总是移动这些文件到目标需要时可行的,由于尺寸或其他方面的考虑。剩下的两个方法提供这部分用其他方式传递信息到新的奴隶交易讨论了一个新的奴隶。

注射空交易大师的全球gtid_executed变量包含在主执行的所有事务集。而不是复制二进制日志时采取快照提供一个新的服务器,你可以注意的内容gtid _ executed在服务器上的快照拍摄。在加入新的服务器复制链,只是将一个空的交易在新服务器上为每个事务标识符包含在主人gtid_executed,像这样:

SET GTID_NEXT='aaa-bbb-ccc-ddd:N';BEGIN;COMMIT;SET GTID_NEXT='AUTOMATIC';

一旦所有的事务标识符已恢复,这样使用空的交易,你必须冲洗和清除奴隶的二进制日志,如图所示,在N是当前的二进制日志文件名后缀的零:

刷新日志;清除“master-bin.00000二进制日志N&#39;;

你应该这样做防止服务器复制流洪水的事件,后来晋升为大师的虚假交易。(TheFLUSH LOGS声明一个新的二进制日志文件的力量创造;PURGE BINARY LOGS清洗空交易,但保留了它们的标识符。)

此方法创建一个服务器,基本上是一个快照,但是时间能够成为高手的二进制日志历史收敛,复制流(即,当它赶上硕士或硕士)。这一结果的影响,利用剩余的供应方法得到的是类似的,这是我们讨论接下来的几段。

包括与gtid _ purged交易。大师的全球gtid_purged变量包含所有交易已经从主的二进制日志清除设置。与前面讨论的方法(见注射空交易),你可以记录值gtid_executed在服务器上的快照(在被复制到新服务器的二进制日志的地方)。不同于以往的方法,不需要提交空交易(或发行PURGE BINARY LOGS);相反,你可以设置gtid_purged对奴隶的直接,基于价值gtid_executed在服务器上的备份或快照拍摄。

与使用空的交易方法,此方法创建一个服务器,在功能上是一个快照,但是时间能够成为高手的二进制日志历史收敛的复制或组。

恢复gtid时尚的奴隶。恢复在gtid基于复制安装程序遇到错误的奴隶时,注入一个空的交易不可能解决问题,因为一个事件没有gtid。

使用mysqlbinlog寻找下一个交易,这可能是在事件发生后的下一个日志文件的第一交易。的所有内容复制到COMMIT对于交易,确保包括设置“@session.gtid_next。即使你不使用基于行的复制,你仍然可以运行的二进制日志行事件的命令行客户端。

停止从运行你复制的事务。这个mysqlbinlog输出设置分隔符/*!*/;,所以放回:

MySQL的&#62;DELIMITER ;

从正确的位置复制自动重启:

mysql> SET GTID_NEXT=automatic;
mysql> RESET SLAVE;
mysql> START SLAVE;

17.1.3.6限制复制GTIDs

因为gtid基于复制依赖于交易,否则一些特征可在不使用时支持MySQL。本节提供有关和复制GTIDs的局限性限制的信息。

涉及非事务性存储引擎更新。当使用gtids,使用非事务性存储引擎如表更新MyISAM不能在同一语句或事务作为利用事务存储引擎如表更新InnoDB

这种限制是由于表使用非事务性存储引擎混合表使用事务性存储引擎在同一个事务更新更新可以导致被分配到相同的事务多gtids。

同样的问题也发生在主人与奴隶的使用不同的存储引擎的各自的同一个表的版本,其中一个存储引擎是事务性的,其他的不。注意,触发器是定义在非事务表的操作,可以对这些问题产生的原因。

在任何情况下,刚才提到的,交易和GTIDs之间的一对一对应关系被打破,其结果是基于gtid复制不能正常。

创建表…SELECT语句。CREATE TABLE ... SELECT不安全的基于语句的复制。使用基于行的复制时,这实际上是记录作为两个独立的事件,一个表的创作,另一个用于从源表中的行插入新表刚刚创建的。当这个语句是在一个事务内执行,有可能在某些情况下,这两个事件得到相同的事务标识符,这意味着由奴隶跳过包含插入的交易。因此,创建表…选择不使用时gtid以复制支持。

gtids和ALTER TABLE语句。ALTER TABLE ... ADD,如果列有表达的默认值,使用非确定性函数,声明可能会产生一个警告或错误:

临时表CREATE TEMPORARY TABLEDROP TEMPORARY TABLE语句不支持内部交易时使用的GTIDs(即服务器在启动时用--enforce-gtid-consistency选项)。可以使用这些语句gtids启用,但只有以外的任何交易,只有autocommit=1

防止不支持的语句的执行。防止语句会导致gtid基于复制失败的执行,所有服务器都必须开始与--enforce-gtid-consistency选项时,使GTIDs。这使得任何先前讨论这段失败与错误的类型声明。

请注意,--enforce-gtid-consistency只有生效如果二进制日志发生的声明。如果二进制日志服务器上禁用,或者语句不写入二进制日志,因为它们通过过滤除去,gtid一致性不检查或执行不记录报表。

有关其他要求的启动选项时,使gtids,看第17.1.3.4,“设置复制使用gtids”

跳过的交易sql_slave_skip_counter不使用时gtids支持。如果你需要跳过交易,使用总的价值gtid_executed而不是看到变量;注射空交易为更多的信息

忽略服务器的ignore_server_ids选项CHANGE MASTER TO声明是不推荐使用时gtids,因为已经应用的交易都可以自动忽略。在开始gtid通过复制,检查并清除所有忽视服务器ID列表中已经涉及的服务器设置。这个SHOW_SLAVE_STATUS声明,这可为各个渠道发行,显示忽略服务器ID列表如果有一。如果没有列表的replicate_ignore_server_ids字段是空白

gtid mysqldump和时尚。这可能是进口自用mysqldump一个MySQL服务器启用gtid模式运行,只要有在目标服务器的二进制日志没有gtids。

gtid模式和mysql_upgrade。当服务器与全球事务标识符(gtids启用(运行)gtid_mode=ON),不启用二进制日志的mysql_upgrade(The--write-binlog选项)

17.1.4 MySQL多源复制

本节介绍了MySQL的多源复制,它使您能够复制从多个并行直接大师。本节介绍了多源复制,以及如何配置、监视和解决它。

17.1.4.1 MySQL多源复制概述

MySQL多源复制使复制从接受交易,同时从多个数据源。多源复制可以用来支持多个服务器,一个服务器,合并表碎片,并整合来自多个服务器,一个服务器的数据。多源复制不实施任何冲突检测和解决在交易,这些任务留给应用程序如果需要。在多源复制拓扑,奴隶创造每个主人应该从接收事务复制通道。看到第17.2.3,“复制通道”。以下各节描述如何建立多源复制。

17.1.4.2多源复制教程

本节提供的教程如何配置多源复制主人和奴隶,以及如何启动、停止、复位多源的奴隶。

17.1.4.2.1多源复制配置

本节说明了如何配置一个多源复制拓扑,并提供有关如何配置主人和奴隶。这种拓扑结构需要至少两个主人和一个奴隶的配置。

在多源复制拓扑的主人可以配置全局事务标识符(gtid)为基础的复制,或二进制日志位置为基础的复制。看到第17.1.3.4,“设置复制使用gtids”如何使用gtid通过复制配置主。看到第17.1.2.1,“设置复制主配置”如何配置主使用基于位置的复制文件。

在多源复制拓扑的奴隶要求TABLE库主日志和中继日志信息日志,这是在MySQL 8的默认。多源复制不兼容文件基础信息库,和文件设置为--master-info-repository中继日志信息库选择现在已过时

修改现有的复制的奴隶是用FILE对奴隶的身份库记录使用库,将现有的复制库动态运行下面的命令:

STOP SLAVE;
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';
17.1.4.2.2添加gtid基于多源复制奴隶主

本节假设您已经启用gtid基础交易大师使用gtid_mode=ON,使复制的用户,并保证使用的奴隶基于复制的库。使用CHANGE MASTER TO声明中添加一个新的主用通道通道channel条款.在复制通道的更多信息,参见第17.2.3,“复制通道”

例如,添加主机名的新主人master1使用端口3451一个通道称为master-1


CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='rpl', MASTER_PORT=3451, MASTER_PASSWORD='', \
MASTER_AUTO_POSITION = 1 FOR CHANNEL 'master-1';

多源复制与自动定位兼容。看到第13.4.2.1,“变化掌握语法”更多信息

每个额外的主要添加一个通道重复这一过程,改变主机名、端口和通道适当。

17.1.4.2.3添加二进制日志基于多源复制奴隶主

本节假设二进制日志是在主功能(这是默认的),从使用TABLE基于复制库(这是在MySQL 8的默认值),并已经启用复制用户记录当前的二进制日志位置。你需要知道当前master_log_fileMASTER_LOG_POSITION。使用CHANGE MASTER TO声明中添加一个新的主人通过指定一个通道通道channel条款.例如,添加主机名的新主人master1使用端口3451一个通道称为master-1


CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='rpl', MASTER_PORT=3451, MASTER_PASSWORD='' \
MASTER_LOG_FILE='master1-bin.000006', MASTER_LOG_POS=628 FOR CHANNEL 'master-1';

每个额外的主要添加一个通道重复这一过程,改变主机名、端口和通道适当。

17.1.4.2.4起始多源复制的奴隶

一旦你添加所有你想要使用复制大师的渠道,使用START SLAVE thread_types语句开始复制。当您启用了多渠道的一个奴隶,你可以选择开始的所有渠道,或选择一个特定的信道开始。

  • 开始所有的当前配置的复制通道:

     
    START SLAVE thread_types;
  • 开始只是一个命名的通道,使用FOR CHANNEL channel条款:

    
    START SLAVE thread_types FOR CHANNEL channel;
    

使用thread_types选择你想要的特定线程的上述声明开始的奴隶。看到第13.4.2.6,“开始从语法”更多信息

17.1.4.2.5停止多源复制的奴隶

这个STOP SLAVE语句可用于阻止多源复制从。默认情况下,如果你使用停止奴隶声明一个多源复制从所有渠道都停止了。或者,使用FOR CHANNEL channel条款只是一个特定的通道停止。

  • 停止所有当前配置的复制通道:

    
    STOP SLAVE thread_types;
  • 止命名通道,使用FOR CHANNEL channel条款:

    
    STOP SLAVE thread_types FOR CHANNEL channel;
    

使用thread_types选择你想要的特定线程的上述声明对奴隶停止。看到第13.4.2.7“停止从语法”更多信息

17.1.4.2.6复位多源复制的奴隶

这个RESET SLAVE语句可用于重置多源复制从。默认情况下,如果你使用复位的奴隶声明一个多源复制从各种渠道复位。或者,使用FOR CHANNEL channel条款重置只是一个特定的通道。

  • 重置所有的当前配置的复制通道:

     
    RESET SLAVE;
  • 重置只命名通道,使用FOR CHANNEL channel条款:

    
    RESET SLAVE FOR CHANNEL channel;
    

看到第13.4.2.4,“重置从语法”更多信息

17.1.4.3多源监测复制

监控状态复制通道下列选项的存在:

  • 使用复制性能模式表。这些表的第一列Channel_Name。这使您可以编写基于复杂查询channel_name作为一个关键的。看到第25.11.11,绩效模式复制表”

  • 使用SHOW SLAVE STATUS FOR CHANNEL channel。默认情况下,如果通道channel条款是不能用的,这说明所有通道的奴隶地位每通道一行。标识符channel_name作为一个结果集中的列。如果一个FOR CHANNEL channel设置条款,结果表明只有指定复制渠道现状。

笔记

这个SHOW VARIABLES语句不多复制通道。这是可以通过这些变量的信息已经迁移到复制性能表。使用SHOW VARIABLES在一个多通道的拓扑表显示只有默认的渠道现状。

17.1.4.3.1监测使用性能模式表通道

本节说明如何使用复制性能监控的渠道模式表。你可以选择监控所有渠道,或一个子集的现有渠道。

监视所有通道的连接状态:

mysql> SELECT * FROM replication_connection_status\G;
*************************** 1. row ***************************
CHANNEL_NAME: master1
GROUP_NAME:
SOURCE_UUID: 046e41f8-a223-11e4-a975-0811960cc264
THREAD_ID: 24
SERVICE_STATE: ON
COUNT_RECEIVED_HEARTBEATS: 0
LAST_HEARTBEAT_TIMESTAMP: 0000-00-00 00:00:00
RECEIVED_TRANSACTION_SET: 046e41f8-a223-11e4-a975-0811960cc264:4-37
LAST_ERROR_NUMBER: 0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00
*************************** 2. row ***************************
CHANNEL_NAME: master2
GROUP_NAME:
SOURCE_UUID: 7475e474-a223-11e4-a978-0811960cc264
THREAD_ID: 26
SERVICE_STATE: ON
COUNT_RECEIVED_HEARTBEATS: 0
LAST_HEARTBEAT_TIMESTAMP: 0000-00-00 00:00:00
RECEIVED_TRANSACTION_SET: 7475e474-a223-11e4-a978-0811960cc264:4-6
LAST_ERROR_NUMBER: 0
LAST_ERROR_MESSAGE:
LAST_ERROR_TIMESTAMP: 0000-00-00 00:00:00
2 rows in set (0.00 sec)
	    

在上面的输出中有两通道启用,和所CHANNEL_NAME它们被称为Master1master2

增加了CHANNEL_NAME场允许你为一个特定的信道的性能模式表查询。监控指定通道的连接状态,使用WHERE CHANNEL_NAME=channel条款:

MySQL的&#62;SELECT * FROM replication_connection_status WHERE CHANNEL_NAME='master1'\G*************************** 1。行*************************** channel_name:master1group_name:source_uuid:046e41f8-a223-11e4-a975-0811960cc264thread_id:24service_state:oncount_received_heartbeats:0last_heartbeat_timestamp:0000-00-00 00:00:00received_transaction_set:046e41f8-a223-11e4-a975-0811960cc264:4-37last_error_number:0last_error_message:last_error_timestamp:0000-00-00 00:00:001行集(0秒)

同样,该WHERE CHANNEL_NAME=channel条款可以用来监视其他复制性能模式表为一个特定的通道。有关更多信息,参见第25.11.11,绩效模式复制表”

17.1.4.4多源复制错误消息

错误代码和消息提供关于多源复制拓扑中遇到错误信息。这些错误代码和消息只时发出的多源复制启用,并提供所产生的误差通道的相关信息。例如:

从已经运行从已停止已被替换复制线程(S)通道channel_name已经运行复制线程(S)通道channel_name已经停止了分别

服务器日志消息也已经改变,表明通道的日志消息有关。这使得更容易调试和跟踪。

17.1.5改变复制模式的在线服务器

本节描述如何更改复制使用无需服务器离线模式。

17.1.5.1复制模式的概念

能够安全地配置网络服务器它是理解复制一些关键概念重要的复制模式。本节说明这些概念是在试图修改一个在线服务器的复制模式,阅读是必要的。

在MySQL复制可用的模式依赖于识别登录交易不同的技术。复制所使用的交易类型如下:

  • gtid交易是通过全局事务标识符(gtid)的形式UUID:NUMBER。日志中的每gtid交易之前总有gtid _ _事件日志。gtid交易可以解决使用的gtid或使用文件的名称和位置。

  • 匿名交易没有gtid分配,并保证每个MySQL日志匿名交易之前Anonymous_gtid_log_event。在以前的版本中,匿名交易之前没有任何特别的事件。匿名交易只能使用文件名和位置寻址。

当使用gtids可以利用自动定位和自动故障切换,以及使用WAIT_FOR_EXECUTED_GTID_SET()session_track_gtids,和监视复制的事务使用性能模式表。与gtids使您无法使用sql_slave_skip_counter,而用空的交易

在中继日志是从掌握运行MySQL的以前的版本收到的交易可能无法在任何特定的事件,但在被重放和记录在奴隶的二进制日志,他们都有一个Anonymous_gtid_log_event

配置复制模式在线的能力意味着gtid_modeenforce_gtid_consistency变量是现在动态和可设置的账户有顶层声明SYSTEM_VARIABLES_ADMINSUPER特权。在MySQL 5.6及以下,这两个变量只能被配置在服务器开始使用相应的选项,这意味着复制模式需要重启服务器的变化。在所有版本gtid_mode可以设置为打开(放)OFF,这与gtids是否进行交易或不。什么时候gtid_mode=ON这是不可能复制的匿名交易,当gtid_mode=OFF只有匿名交易可以复制。什么时候gtid_mode=OFF_PERMISSIVE然后交易是匿名的,允许复制的事务是gtid或匿名交易。什么时候gtid_mode=ON_PERMISSIVE然后交易中使用gtids同时允许复制的事务是gtid或匿名交易。这意味着它有可能复制拓扑中,服务器使用匿名和gtid交易。例如一个主人gtid_mode=ON可以复制一个奴隶gtid_mode=ON_PERMISSIVE。有效值为gtid_mode如下,在这个阶:

  • OFF

  • OFF_PERMISSIVE

  • ON_PERMISSIVE

  • ON

需要注意的是,国家重要的gtid_mode只能改变由一步一个脚印,基于上述订单。例如,如果gtid_mode目前将off_permissive,它是可能的变化OFFon_permissive但不ON。这是为了确保从匿名交易gtid在线交易是由服务器正确处理过程。当您切换gtid_mode=ONgtid_mode=OFF的状态,gtid(换句话说,价值gtid_executed)是持久的。这确保了gtid集已由服务器应用可以一直保留,无论类型之间的变化gtid_mode

相关gtids字段显示正确的信息,无论当前选择gtid_mode。这意味着领域显示gtid集,如gtid_executedgtid_purgedreceived_transaction_setreplication_connection_status性能模式表,和gtid相关结果SHOW SLAVE STATUS现在,返回空字符串时,没有gtids目前。字段显示一个gtid,如current_transactionreplication_applier_status_by_worker 性能模式表,现在显示匿名当gtid交易不被使用。

复制从主使用gtid_mode=ON提供了使用自动定位的能力,配置使用CHANGE MASTER TO MASTER_AUTO_POSITION = 1;声明。复制拓扑是是否启用自动定位或没有影响,这个特性依赖于gtids和不兼容的匿名交易。一个错误是如果自动定位的启用和遇到一个匿名交易的产生。它是强烈建议,以确保不存在匿名交易中剩余的拓扑启用自动定位,看第17.1.5.2,“使gtid在线交易”

的有效组合gtid_mode自动定位在主从如下表所示,其中硕士gtid_mode在水平和奴隶的证明gtid_mode在垂直。每一项的含义如下:

  • Y: thegtid_mode主人与奴隶是兼容的

  • N: thegtid_mode主从不兼容

  • *:自动定位可以用这个组合

表17.1有效组合的主人和奴隶gtid_mode

gtid_mode

硕士OFF

硕士OFF_PERMISSIVE

硕士ON_PERMISSIVE

硕士ON

奴隶OFF

Y

Y

N

N

奴隶OFF_PERMISSIVE

Y

Y

Y

Y *

奴隶ON_PERMISSIVE

Y

Y

Y

Y *

奴隶ON

N

N

Y

Y *


当前选定的gtid_mode这也影响gtid_next变量。下表显示了不同服务器的行为gtid_modegtid_next。每一项的含义如下:

  • ANONYMOUS:生成一个匿名交易

  • Error:生成一个错误,无法执行集gtid_next

  • UUID:NUMBER:生成具有指定UUID gtid:数。

  • New GTID:生成一个自动生成的数量gtid。

表17.2有效的gtid_mode和gtid_next组合

gtid_next自动

二进制日志

gtid_next自动

二进制日志了

gtid_next匿名

gtid_nextUUID:数

gtid_mode关闭

匿名

匿名

匿名

误差

gtid_modeoff_permissive

匿名

匿名

匿名

UUID:数

gtid_modeon_permissive

新的gtid

匿名

匿名

UUID:数

gtid_mode打开(放)

新的gtid

匿名

误差

UUID:数


当二进制日志是关闭的,gtid_next是集自动,然后没有产生gtid。这是与以前版本的行为一致。

17.1.5.2使gtid网上交易

本节介绍了如何使gtid交易,和可选的自动定位,对已经在线和使用匿名交易服务器。本程序不需要让服务器离线,适合在生产中的应用。然而,如果你有可能把服务器脱机时,使gtid交易过程更容易。

在你开始之前,确保服务器满足以下条件:

  • 全部在拓扑结构,服务器必须使用MySQL 5.7.6或后。你不能使gtid网上交易对任何单一服务器除非全部这是拓扑中的服务器使用的是这个版本。

  • 所有服务器都gtid_mode设置为默认值关闭

下面的程序可以在任何时候暂停后恢复了它在哪里,或反跳到相应的步骤第17.1.5.3,“禁用gtid在线交易”在线程序,禁用GTIDs。这使得程序容错因为可能出现在程序中任何无关的问题可以照常办理,然后程序继续在那里离开。

笔记

它是你完成每一步之前,继续下一步骤是至关重要的。

使gtid交易:

  1. 在每个服务器上,执行:

    SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

    让你的正常工作一段时间服务器运行和监控日志。如果这一步的原因,日志中的任何警告,调整你的应用程序,它仅使用gtid兼容的功能不产生任何警告。

    重要

    这是重要的第一步。你必须确保没有警告是在错误产生的日志进行下一步之前。

  2. 在每个服务器上,执行:

    SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
  3. 在每个服务器上,执行:

    SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

    不要紧,服务器执行此语句,但重要的是,所有的服务器完成此步骤的任何服务器开始下一步之前。

  4. 在每个服务器上,执行:

    SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

    不要紧,服务器执行此语句的第一。

  5. 在每个服务器上,等到状态变量ONGOING_ANONYMOUS_TRANSACTION_COUNT是零。这可以检查使用:

    显示状态“ongoing_anonymous_transaction_count”;
    笔记

    在一个复制的奴隶,这在理论上是可能的,这表明零和非零再然后。这是没有问题的,这就够了,这表明零次。

  6. 等所有的交易产生了第五步复制到所有服务器。你可以不停的更新:唯一重要的事是,所有匿名交易得到复制。

    看到第17.1.5.4,“验证复制匿名交易”一检查所有的匿名交易已复制到所有服务器的方法。

  7. 如果你使用二进制日志以外的任何复制,在备份和恢复时间的例子,等到你不需要旧的二进制日志具有交易无gtids。

    例如,在第6步完成后,您可以执行FLUSH LOGS在服务器上你要备份。然后直接把备份或等待任何周期的备份程序可以设置下一个迭代。

    理想情况下,等待服务器来清除所有的二进制日志时存在步骤6完成。还等在步骤6之前到期采取任何备份。

    重要

    这是第二重要点。理解二进制日志包含匿名交易是至关重要的,没有gtids无法使用后的下一步。在这一步中,您必须确保交易无gtids不在任何地方存在的拓扑结构。

  8. 在每个服务器上,执行:

    SET @@GLOBAL.GTID_MODE = ON;
  9. 在每个服务器,添加gtid-mode=ONmy.cnf

    你现在是保证所有的交易都有一个gtid(除交易产生在步骤5或更早,已经处理过的)。开始使用gtid协议以便以后可以执行自动故障切换,每个奴隶执行以下。或者,如果你使用多源复制,这样每个通道包括FOR CHANNEL channel条款:

    STOP SLAVE [FOR CHANNEL 'channel'];CHANGE MASTER TO MASTER_AUTO_POSITION = 1 [FOR CHANNEL 'channel'];START SLAVE [FOR CHANNEL 'channel'];

17.1.5.3禁用gtid网上交易

本节介绍了如何禁用gtid交易服务器已经在线。本程序不需要让服务器离线,适合在生产中的应用。然而,如果你有可能把服务器脱机时禁用gtids模式,过程更容易。

该过程类似于使gtid交易服务器同时在线,但倒车的步骤。惟一的区别就是在这一点上你等待记录的事务复制。

在你开始之前,确保服务器满足以下条件:

  • 全部在拓扑结构,服务器必须使用MySQL 5.7.6或后。你不能禁用gtid网上交易对任何单一服务器除非全部这是拓扑中的服务器使用的是这个版本。

  • 所有服务器都gtid_mode设置打开(放)

  1. 在每一个奴隶执行下面的,如果你使用多源复制,做为每个通道包括FOR CHANNEL通道条款:

    STOP SLAVE [FOR CHANNEL 'channel'];CHANGE MASTER TO MASTER_AUTO_POSITION = 0, MASTER_LOG_FILE = file, \MASTER_LOG_POS = position [FOR CHANNEL 'channel'];START SLAVE [FOR CHANNEL 'channel'];
  2. 在每个服务器上,执行:

    SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
  3. 在每个服务器上,执行:

    SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
  4. 在每个服务器上,等到变“@global.gtid_owned等于空字符串。这可以检查使用:

    SELECT @@GLOBAL.GTID_OWNED;

    在一个复制的奴隶,这在理论上是可能的,这是空的,那么空了。这是没有问题的,这就够了,这一次是空的。

  5. 等所有的交易目前存在于任何二进制日志复制到所有的奴隶。看到第17.1.5.4,“验证复制匿名交易”一检查所有的匿名交易已复制到所有服务器的方法。

  6. 如果你使用二进制日志为别的比复制,例如做备份或恢复时间点:等到你不需要旧的二进制日志有gtid交易。

    例如,在5步完成后,您可以执行FLUSH LOGS在服务器上你要备份。然后直接把备份或等待任何周期的备份程序可以设置下一个迭代。

    理想情况下,等待服务器来清除所有的二进制日志时存在步骤5完成。还等在第五步到期采取任何备份。

    重要

    这是很重要的一点是在这个过程中。这是了解含gtid事务日志不能用于下一步的重要。继续之前您必须确保gtid交易不在任何地方存在的拓扑结构。

  7. 在每个服务器上,执行:

    SET @@GLOBAL.GTID_MODE = OFF;
  8. 在每个服务器设置gtid-mode=OFF进入my.cnf

    如果你想设置enforce_gtid_consistency=OFF现在,你可以这样做。设置完成后,你应该添加enforce_gtid_consistency=OFF您的配置文件

如果你想安装较早版本的MySQL,你现在可以这样做,使用正常的降级程序。

17.1.5.4验证匿名交易复制

本节说明如何监视复制拓扑和验证所有匿名交易被复制。这是有助于改变复制模式在线你可以确认它是安全的gtid交易变化。

有等待事务复制的几种可能方式:

最简单的方法,它不管你的拓扑结构,但依赖于时间如下:如果你确信奴隶也从来没有落后超过N秒,只是等待比N秒多一点。或等待一天,或任何你认为安全的时间为您的部署。

在某种意义上更安全的方法,它不依赖于时间:如果你只有一个主与一个或更多的奴隶,做以下:

  1. 在主,执行:

    SHOW MASTER STATUS;

    记下的价值File位置专栏

  2. 在每一个奴隶,使用从主执行文件和位置信息:

    SELECT MASTER_POS_WAIT(file, position);

如果你有一个主和奴隶,多层次的,或者说你有奴隶的奴隶,重复步骤2,在每一个层面上,从主人,那么直接的奴隶,然后奴隶的奴隶,等等。

如果你使用一个圆形的复制拓扑的多个服务器上可能写的客户,执行步骤2每个主从连接,直到你已经完成了一圈。重复整个过程让你做全圆两次

For example, suppose you have three servers A, B, and C, replicating in a circle so that A -> B -> C -> A. The procedure is then:

  • 做步骤1和步骤2在B上

  • 做第一步和第二步C对B

  • 做步骤1和步骤2 A,C

  • 做步骤1和步骤2在B上

  • 做第一步和第二步C对B

  • 做步骤1和步骤2 A,C

17.1.6复制和二进制日志记录选项和变量

以下各节包含有关信息mysqld选择和服务器变量,用于复制和控制二进制日志。选项和变量用于复制和复制的奴隶被主人分开,如选择和有关二进制日志和全局事务标识符变量(gtids)。一套快速参考表提供有关这些选项和变量的基本信息也包括在内。

尤其重要的是--server-id选项

财产价值
命令行格式--server-id=#
系统变量server_id
范围全球
动态
看到的是_提示应用
类型整数
默认值(>= 8.0.3)1
默认值(<= 8.0.2)0
最小值0
最大值4294967295

指定服务器IDserver_id系统变量默认设置为1。服务器可以从默认的ID,但当二进制日志启用,信息性消息发出后如果没有指定服务器ID显式使用--server-id选项

所使用的复制拓扑中的服务器,你必须指定每个复制服务器唯一的服务器ID,在范围从1到2三十二?1独特意味着每个ID必须不同于使用其他任何复制主或从其他每个ID。更多信息,参见第17.1.6.2,“复制选项和变量”,和第17.1.6.3,“复制从选项和变量”

如果服务器ID是0,二进制日志的发生,但有0的服务器ID从奴隶主拒绝任何连接,和一个0服务器ID拒绝连接到一个主的奴隶。请注意,虽然您可以更改服务器ID动态地为一个非零值,这样做不会使复制立即开始。您必须更改服务器ID,然后重新启动服务器初始化复制从。

有关更多信息,参见第17.1.2.2,“设置复制从配置”

server_uuid

MySQL服务器除了默认的或用户提供的服务器ID设置在产生一个真正的UUIDserver_id系统变量。这是全球性的,只读变量server_uuid

笔记

的存在server_uuid系统变量的变化不需要设置一个独特的--server-id每个MySQL服务器作为制备运行MySQL复制的部分,如本节前面介绍的。

财产价值
系统变量server_uuid
范围全球
动态
看到的是_提示应用
类型字符串

启动时,MySQL服务器会自动获得一个UUID如下:

  1. 尝试阅读和使用UUID书面文件data_dir/auto.cnf(在哪里data_dir是服务器的数据目录)。

  2. 如果data_dir/auto.cnf没有找到,产生一个新的UUID和保存这个文件,如果需要创建文件。

这个auto.cnf文件有一个类似的格式,用于my.cnfmy.ini文件auto.cnf只有一个[auto]包含一个单独的部分server_uuid设定值;文件的内容出现类似于如下所示:

[auto]server_uuid=8a94f357-aab4-11df-86ab-c80aa9429562
重要

这个auto.cnf文件是自动生成的;不要尝试写入或修改该文件。

使用MySQL复制时,主人和奴隶知道对方的UUID。一个奴隶的UUID值可以在输出中看到SHOW SLAVE HOSTS。一旦START SLAVE已经执行,对主人的UUID值可在输出中的奴隶SHOW SLAVE STATUS

笔记

发行STOP SLAVERESET SLAVE声明并重置主人的UUID使用奴隶。

服务器的server_uuid也用于GTIDs源服务器上的交易。有关更多信息,参见部分下面,“复制与全球事务标识符”

启动时,从I/O线程生成错误并中止如果主人的UUID是等于自己除非--replicate-same-server-id选择已定。此外,如果下面是真正的奴隶的I/O线程生成一个警告:

17.1.6.1复制和二进制日志记录选项和变量引用

以下列表提供关于MySQL的命令行选项和系统变量适用于复制和二进制日志基本信息。

命令行选项和系统变量在下面的列表与复制大师和复制的奴隶。第17.1.6.2,“复制选项和变量”,提供有关复制主服务器的选择和变量的更多详细信息。有关复制奴隶的选择和变量的更多信息,参见第17.1.6.3,“复制从选项和变量”

以下列表中的命令行选项和系统变量涉及到二进制日志。第17.1.6.4,二进制日志记录选项和变量”,提供的选项和有关的二进制日志变的更详细的信息。关于二进制日志的其他信息,看5.4.4节,“二进制日志”

对于一个上市全部命令行选项,用于系统状态变量mysqld,看到第,“服务器选项,系统变量和状态变量的引用”

17.1.6.2.3.2复制主选项和变数

本节描述服务器选项和系统变量,你可以使用复制主服务器。您可以指定的选项是对的命令行或在选项文件。您可以指定使用系统变量的值SET

在主和每一个奴隶,你必须使用server-id选择建立一个独特的复制ID.的每个服务器,你应该选择一个独特的正整数的范围从1到2三十二?1,每个ID必须不同于使用其他任何复制主或从其他每个ID。例子:server-id=3

用于主控制二进制日志记录选项,看第17.1.6.4,二进制日志记录选项和变量”

复制大师的启动选项

下面的列表描述控制复制主服务器启动选项。复制相关的系统变量在后面讨论。

复制大师使用系统变量

下面的系统变量用于控制复制大师:

  • auto_increment_increment

    财产价值
    系统变量auto_increment_increment
    范围全球会议
    动态
    看到的是_提示应用
    类型整数
    默认值1
    最小值1
    最大值65535

    auto_increment_incrementauto_increment_offset是用于掌握复制,可用于控制操作汽车专栏两变量的全局和会话值,每个可以假设1和65535之间的整数的包容。设置两变量的值为0的原因是设置为1,而其价值。试图设置两变量的值为整数,大于65535或小于0的原因是设置为65535,而其价值。试图设置值auto_increment_incrementauto_increment_offset一个非整数的值产生误差,以及变量的实际值不变。

    笔记

    auto_increment_increment目的是为使用MySQL集群,这是目前不支持MySQL 5.0。

    这两个变量的影响AUTO_INCREMENT列行为如下:

    • auto_increment_increment控制连续列值之间的时间间隔。例如:

      MySQL的&#62;SHOW VARIABLES LIKE 'auto_inc%';-------------------------- ------- | variable_name |价值| -------------------------- ------- | auto_increment_increment | 1 | | auto_increment_offset | 1 | -------------------------- ------- 2行集(0秒)MySQL &#62;CREATE TABLE autoinc1-&#62;(col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);查询行,0行受影响(0.04秒)MySQL &#62;SET @@auto_increment_increment=10;查询好,为受影响的行(0.001秒)MySQL &#62;SHOW VARIABLES LIKE 'auto_inc%';-------------------------- ------- | variable_name |价值| -------------------------- ------- | auto_increment_increment | 10 | | auto_increment_offset | 1 | -------------------------- ------- 2行集(0.01秒)MySQL &#62;INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);查询行,4行受影响(0秒)记录:4份:0警告:0mysql &#62;SELECT col FROM autoinc1;----- | Col | ----- | 1 | | 11 | | 21 | | 31 | ----- 4行集(0秒)
    • auto_increment_offset确定为出发点汽车列值。考虑以下,假设这些语句被执行在同一会议上给出的描述为例auto_increment_increment

      MySQL的&#62;SET @@auto_increment_offset=5;查询好,为受影响的行(0.001秒)MySQL &#62;SHOW VARIABLES LIKE 'auto_inc%';-------------------------- ------- | variable_name |价值| -------------------------- ------- | auto_increment_increment | 10 | | auto_increment_offset | 5 | -------------------------- ------- 2行集(0秒)MySQL &#62;CREATE TABLE autoinc2-&#62;(col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);查询行,0行受影响(0.06秒)MySQL &#62;INSERT INTO autoinc2 VALUES (NULL), (NULL), (NULL), (NULL);查询行,4行受影响(0秒)记录:4份:0警告:0mysql &#62;SELECT col FROM autoinc2;----- | Col | ----- | 5 | | 15 | | 25 | | 35 | ----- 4行集(0.02秒)

      当价值auto_increment_offset大于auto_increment_increment,价值auto_increment_offset被忽略

    如果这些变量的变化,然后新的行插入到表中包含一个AUTO_INCREMENT柱,结果可能似乎有悖常理,因为系列汽车价值观是不考虑任何价值已经在柱计算,然后插入值系列中,大于最大值最小值存在的AUTO_INCREMENT专栏该系列是这样计算的:

    auto_increment_offset N×【解释】:自我维持

    哪里N在系列[ 1,一个正整数2,3,…]。例如:

    MySQL的&#62;SHOW VARIABLES LIKE 'auto_inc%';-------------------------- ------- | variable_name |价值| -------------------------- ------- | auto_increment_increment | 10 | | auto_increment_offset | 5 | -------------------------- ------- 2行集(0秒)MySQL &#62;SELECT col FROM autoinc1;----- | Col | ----- | 1 | | 11 | | 21 | | 31 | -----四行集(0.001秒)MySQL &#62;INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);查询行,4行受影响(0秒)记录:4份:0警告:0mysql &#62;SELECT col FROM autoinc1;----- | Col | ----- | 1 | | 11 | | 21 | | 31 | | 35 | | 45 | | 55 | | 65 | ----- 8行集(0秒)

    的幻觉auto_increment_incrementauto_increment_offset生成系列5N×10,即[ 5, 15, 25,35, 45 ],。目前价值最高Col前柱INSERT是日,和下一个可用的价值在汽车系列35,所以插入的值col开始在这一点上,结果显示为SELECT查询

    这是不可能的限制这两个变量的影响,一个表;这些变量控制所有的行为AUTO_INCREMENT全部在MySQL服务器表。如果任一变量的全局值设定,其影响持续到全球价值变化或通过设置会话值重写,直到mysqld重新启动。如果本地值设置,新的价值观的影响AUTO_INCREMENT所有表,新的行由电流在会话期间用户插入的列的值,除非是在会话改变。

    默认值auto_increment_increment在1。这第17.4.1.1,“复制和auto_increment”

  • auto_increment_offset

    财产价值
    系统变量auto_increment_offset
    范围全球会议
    动态
    看到的是_提示应用
    类型整数
    默认值1
    最小值1
    最大值65535

    这个变量的默认值为1。更多信息,见描述auto_increment_increment

    笔记

    auto_increment_offset目的是为使用MySQL集群,这是目前不支持MySQL 5.0。

  • rpl_semi_sync_master_enabled

    财产价值
    系统变量rpl_semi_sync_master_enabled
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值OFF

    控制半同步复制是否在主机启用。启用或禁用插件,设置这个变量ON关闭(or 1 or 0),respectively .默认的是OFF

    这个变量是只有安装主侧半同步复制可用的插件。

  • rpl_semi_sync_master_timeout

    财产价值
    系统变量rpl_semi_sync_master_timeout
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值10000

    以毫秒为单位控制多久主机等待一个提交从奴隶确认超时并恢复异步复制前一个值。默认值是10000(10秒)。

    这个变量是只有安装主侧半同步复制可用的插件。

  • rpl_semi_sync_master_trace_level

    财产价值
    系统变量rpl_semi_sync_master_trace_level
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值32

    半同步复制在痕量水平的掌握。定义了四个层次:

    • 1 = general level (for example, time function failures)

    • 16 = detail level (more verbose information)

    • 32 = net wait level (more information about network waits)

    • 64 = function level (information about function entry and exit)

    这个变量是只有安装主侧半同步复制可用的插件。

  • rpl_semi_sync_master_wait_for_slave_count

    财产价值
    系统变量rpl_semi_sync_master_wait_for_slave_count
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1
    最小值1
    最大值65535

    奴隶主的数量确认每笔交易之前必须接受。默认情况下rpl_semi_sync_master_wait_for_slave_count半同步复制,即收益接收一个奴隶的确认后。表现最好的是,这个变量的值小。

    例如,如果rpl_semi_sync_master_wait_for_slave_count,然后两奴隶必须在配置的超时时间承认交易收据rpl_semi_sync_master_timeout对于半同步复制继续进行。如果不承认奴隶交易收据超时期间,主机恢复到正常复制。

    笔记

    这种行为也取决于rpl_semi_sync_master_wait_no_slave

    这个变量是只有安装主侧半同步复制可用的插件。

  • rpl_semi_sync_master_wait_no_slave

    财产价值
    系统变量rpl_semi_sync_master_wait_no_slave
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值ON

    控制主机是否在等待配置的超时时间rpl_semi_sync_master_timeout到期,即使从计数下降到少于奴隶配置数量rpl_semi_sync_master_wait_for_slave_count在超时期间

    当价值rpl_semi_sync_master_wait_no_slave打开(放)(默认),对奴隶的数量下降到低于它是允许的rpl_semi_sync_master_wait_for_slave_count在超时期间。只要有足够的奴隶的超时时间到期之前确认交易,半同步复制下去。

    当价值rpl_semi_sync_master_wait_no_slave关闭,如果从计数下降到低于数量配置rpl_semi_sync_master_wait_for_slave_count在任何时间配置的超时期间rpl_semi_sync_master_timeout,主机恢复到正常复制。

    这个变量是只有安装主侧半同步复制可用的插件。

  • rpl_semi_sync_master_wait_point

    财产价值
    系统变量rpl_semi_sync_master_wait_point
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值AFTER_SYNC
    有效值

    AFTER_SYNC

    AFTER_COMMIT

    这个变量控制点半同步复制等交易收据从确认之前返回一个状态到客户端提交事务。这些值是允许的:

    • AFTER_SYNC(默认):大师写的每一笔交易的二进制日志和奴隶,并同步二进制日志到磁盘。主等待收到确认后同步奴隶交易。在收到确认,主提交事务的存储引擎并返回结果给客户端,然后才能进行。

    • AFTER_COMMIT:主写每个事务的二进制日志和奴隶,同步二进制日志,并提交事务的存储引擎。主等待交易收据确认提交后的奴隶。在收到确认,主人将结果返回给客户端,然后才能进行。

    如下这些设置的复制特性不同:

    • AFTER_SYNC看,所有客户承诺同时交易:在它被承认的奴隶和致力于存储引擎在主。因此,所有的客户看到主人相同的数据。

      在主失败的事件,在主所犯下的所有交易都复制到奴隶(保存到其中继日志)。一个崩溃的奴隶主和故障转移是无损因为奴隶是最新的。注意,然而,这总不能在这种情况下重新启动,必须丢弃,因为它的二进制日志可能包含未提交的事务,会导致奴隶冲突时表现的二进制日志恢复后。

    • AFTER_COMMIT,客户发行交易只在服务器向存储引擎和接收从确认得到的返回状态。提交之前,从确认后,客户可以在客户端看到的已提交的事务提交。

      如果做错了事情,奴隶不处理事务,然后在主碰撞和故障转移事件的奴隶,这是可能的,这样的客户将看到的损失相对于他们所看到的在主数据。

    这个变量是只有安装主侧半同步复制可用的插件。

    与另外的rpl_semi_sync_master_wait_point在MySQL 5.7版本相容约束的产生是由于它增加半同步接口版本:MySQL 5.7和更高的不半同步复制插件从旧版本的服务器,也没有从旧版本的服务器和MySQL 5.7和更高的半同步复制插件工作。

17.1.6.3复制从选项和变量

本节说明服务器选项和系统变量,适用于从复制服务器和包含以下:

指定的选项是对的命令行或在选项文件。有许多选项可设置在服务器正在运行的应用CHANGE MASTER TO声明。指定系统变量值的使用SET

服务器ID在主和每一个奴隶,你必须使用server-id选择建立一个独特的复制ID的范围从1到2三十二?1独特意味着每个ID必须不同于使用其他任何复制主或从其他每个ID。例子my.cnf文件:

[mysqld]server-id=3
复制奴隶的启动选项

本节说明控制复制从服务器启动选项。这些选项可以设置在服务器正在运行的应用CHANGE MASTER TO声明。其他人,如-复制…选项,可以设置只有当从服务器开始。复制相关的系统变量在后面讨论。

  • --log-slave-updates

    财产价值
    命令行格式--log-slave-updates
    系统变量log_slave_updates
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值(>= 8.0.3)ON
    默认值(<= 8.0.2)OFF

    此选项使奴隶写的,从主服务器接收和奴隶的SQL线程执行的二进制日志更新自己的奴隶。二进制日志,由--log-bin默认启用的是选项,还必须启用奴隶要记录更新。--log-slave-updates默认是启用的,除非你指定--skip-log-bin禁用二进制日志,在这种情况下,MySQL也禁用默认奴隶更新日志。如果你需要禁用从更新日志时启用二进制日志,指定--skip-log-slave-updates

    --log-slave-updates使复制服务器被。例如,您可能想要建立复制服务器使用这样的安排:

    A -> B -> C

    在这里,A作为奴隶的主人B,和B作为奴隶的主人C。这个工作,B必须是主一个奴隶。二进制日志和--log-slave-updates启用选项,这是默认设置,更新收到记录的B其二进制日志,因此可以通过对C

  • --master-info-file=file_name

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

    为掌握信息日志的名称,如--master-info-repository=FILE是集。默认名称是master.info在数据目录--master-info-repository=FILE现在已不再使用。关于掌握信息的日志信息,看第17.2.4.2,“奴隶状态日志”

  • --master-retry-count=count

    财产价值
    命令行格式--master-retry-count=#
    过时的
    类型整数
    默认值86400
    最小值0
    最大值(64位平台)18446744073709551615
    最大值(32位平台)4294967295

    次奴隶试图放弃之前连接到主数。尝试重新连接时间间隔设定的MASTER_CONNECT_RETRY期权的CHANGE MASTER TO声明(默认为60)。能够被触发时,读取数据的时间根据奴隶--slave-net-timeout选项默认值是86400。值为0表示无限的;奴隶试图连接永远

    这个选项是过时的、将在未来的MySQL版本中删除。应用程序应该更新使用MASTER_RETRY_COUNT期权的CHANGE MASTER TO语句

  • --max-relay-log-size=size

    财产价值
    命令行格式--max-relay-log-size=#
    系统变量max_relay_log_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值0
    最小值0
    最大值1073741824

    大小的服务器中继日志文件自动旋转。如果该值为零,继电器的日志是自动旋转时它的大小超过此值。如果这个值是零(默认),大小在中继日志旋转是由价值决定的max_binlog_size。有关更多信息,参见第17.2.4.1,“从中继日志”

  • --relay-log=file_name

    财产价值
    命令行格式--relay-log=file_name
    系统变量relay_log
    范围全球
    动态
    看到的是_提示应用
    类型文件名

    对于中继日志的基本名称。服务器上添加一个数字后缀的基本名称创建日志文件序列继电器。

    对于默认复制通道,中继日志的默认名称是基础host_name-relay-bin,使用的主机名。对于非默认复制通道,中继日志的默认名称是基础host_name中继站—channel,在那里channel是记录在这个中继日志复制通道的名称。

    中继日志文件的默认位置是数据目录。你可以使用--relay-log选项指定一个替代的位置,通过对基地的名字加入领先的绝对路径名来指定一个不同的目录。

    中继日志和继电器在复制服务器不能登录指数被给予相同的名称作为二进制日志和二进制日志索引,他们的名字是由指定的--log-bin--log-bin-index选项服务器发出一个错误消息和不启动如果二进制日志和中继日志文件库名称将是相同的。

    由于以何种方式MySQL解析服务器选项,如果指定此选项,您必须提供一个值;默认的库名字只是如果期权实际上没有指定使用。如果你使用--relay-log如果没有指定值的选择,可能会导致意外的行为;这种行为取决于其他选项的应用,它们指定的顺序,以及他们是否是在命令行或在一个选项指定的文件。更多信息关于MySQL如何处理服务器选项,看4.2.3节”指定程序选项”

    如果指定此选项,指定的值也可以用来作为中继日志索引文件的基名称。你可以重写此行为,通过指定不同的中继日志索引文件的基名称的使用--relay-log-index选项

    当服务器读取索引文件的一个条目,它检查条目是否包含相对路径。如果是这样,该路径的相对与绝对路径替换设置使用--relay-log选项一个绝对路径保持不变;在这种情况下,索引必须手动编辑启用新的路径被使用。此前,人工干预是必要时将二进制日志或中继日志文件。(错误# 11745230,错误# 12133)

    你可能会发现--relay-log用于执行以下任务的选择:

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

    • 如果你需要把中继日志在一些地区以外的数据目录,因为你的中继日志往往是非常大的,你不想减少max_relay_log_size

    • 通过使用磁盘间负载均衡的增长速度。

    你可以获得中继日志文件名(路径)从relay_log_basename系统变量

  • --relay-log-index=file_name

    财产价值
    命令行格式--relay-log-index=file_name
    系统变量relay_log_index
    范围全球
    动态
    看到的是_提示应用
    类型文件名

    为中继日志索引文件的名称。如果你不指定--relay-log-index选项,但--relay-log选项指定的值作为中继日志索引文件的默认名称。如果中继日志选项也没有指定,则默认复制通道,默认名称是host_name-relay-bin.index,使用的主机名。对于非默认复制通道,默认名称是host_name中继站—channel指数,在那里channel是记录在这个中继日志索引复制通道的名称。

    中继日志文件的默认位置是数据目录,或任何其他位置,被指定使用--relay-log选项你可以使用中继日志索引选项指定一个替代的位置,通过对基地的名字加入领先的绝对路径名来指定一个不同的目录。

    中继日志和继电器在复制服务器不能登录指数被给予相同的名称作为二进制日志和二进制日志索引,他们的名字是由指定的--log-bin--log-bin-index选项服务器发出一个错误消息和不启动如果二进制日志和中继日志文件库名称将是相同的。

    由于以何种方式MySQL解析服务器选项,如果指定此选项,您必须提供一个值;默认的库名字只是如果期权实际上没有指定使用。如果你使用--relay-log-index如果没有指定值的选择,可能会导致意外的行为;这种行为取决于其他选项的应用,它们指定的顺序,以及他们是否是在命令行或在一个选项指定的文件。更多信息关于MySQL如何处理服务器选项,看4.2.3节”指定程序选项”

  • --relay-log-info-file=file_name

    财产价值
    命令行格式--relay-log-info-file=file_name
    类型文件名
    默认值relay-log.info

    对于中继日志文件的名称,如果--relay-log-info-repository设置文件。默认名称是relay-log.info在数据目录--relay-log-info-repository=FILE现在已不再使用。关于中继日志信息的日志信息,看第17.2.4.2,“奴隶状态日志”

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

    财产价值
    命令行格式--relay-log-purge
    系统变量relay_log_purge
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值TRUE

    禁用或启用自动清除中继日志就不再需要。默认值是1(启用)。这是一个全局变量,可以动态改变与SET GLOBAL relay_log_purge = N。禁用中继日志清除时使用--relay-log-recovery期权的风险数据的一致性,因此不安全。

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

    财产价值
    命令行格式--relay-log-recovery
    类型布尔
    默认值FALSE

    使自动中继日志恢复后立即启动服务器。恢复过程将创建一个新的中继日志文件、初始化SQL线程位置这一新的中继日志,并初始化I/O线程SQL线程位置。从主然后继续中继日志阅读。这应该是用在复制从崩溃确保不可能损坏继电器日志处理。默认值是0(禁用)。

    提供一个安全的奴隶,此选项必须启用(设置为1),--relay-log-info-repository必须设置为,和relay-log-purge必须启用。使--relay-log-recovery选择relay-log-purge是残疾的风险,不被清除的文件读取中继日志,导致数据的不一致性,因此是不安全。看到制作复制弹性意外停止为更多的信息

    使用多线程的奴隶时(换句话说slave_parallel_workers大于0),如能在不一致的差距已从中继日志执行交易的发生顺序。使--relay-log-recovery选项时有不一致导致错误的选项不起作用。在这种情况下,解决方案是问题START SLAVE UNTIL SQL_AFTER_MTS_GAPS,以更一致的状态带来的服务器,然后发出RESET SLAVE删除中继日志。看到第17.4.1.34,“复制和事务不一致”更多信息

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

    财产价值
    命令行格式--relay-log-space-limit=#
    系统变量relay_log_space_limit
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值0
    最小值0
    最大值(64位平台)18446744073709551615
    最大值(32位平台)4294967295

    此选项将在总规模上的限制在所有继电器字节的奴隶的日志。值为0表示没有限制。这对于一个从服务器主机,具有有限的磁盘空间是有用的。当达到极限时,I/O线程停止读取二进制日志事件从主服务器到SQL线程已经赶上并删除一些不用的中继日志。注意,这个限制不是绝对的:在有些情况下,SQL线程需要更多的事件才可以删除中继日志。在这种情况下,I/O线程超过限制直到它变成可能的SQL线程删除一些中继日志,因为不这样做会导致死锁。你不应该--relay-log-space-limit不到两倍的价值--max-relay-log-size(或--max-binlog-size如果--max-relay-log-size0)。在这种情况下,有一个机会,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

    此选项支持通道特异性复制的过滤器,使多源复制奴隶使用特定的滤波器对不同来源。配置一个特定渠道复制过滤通道命名channel_1使用-复制- DOB:channel_1db_name。在这种情况下,第一个冒号被解释为一个分离器和随后的文字冒号冒号。看到第17.2.5.4,“复制通道滤波器”更多信息

    笔记

    全球复制器不能用在一个MySQL服务器实例配置为组复制,因为有些服务器过滤交易将使集团无法达成一致的状态协议。通道特定复制过滤器可用于复制的通道没有直接参与组的复制,如其中一组成员也作为一个奴隶主,是一个复制组外。他们不能用对group_replication_appliergroup_replication_recovery频道

    这种复制筛选精确的效果取决于是否基于或基于行的复制是使用语句。

    基于语句的复制告诉从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表中特价在从数据库改变按照UPDATE声明;这是否USE声明发表。然而,发行以下在主报表已经使用基于行的复制,当奴隶没有影响--replicate-do-db=sales

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

    即使是停滞不前USE prices改变了使用销售,的UPDATE声明的作用仍然不可复制。

    在另一个重要的区别--replicate-do-db处理基于语句的复制而不是基于行的复制发生在语句引用多个数据库。假设从开始--replicate-do-db=db1,和下面的语句是在主执行:

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

    如果您使用的是基于语句的复制,然后从更新表。然而,使用基于行的复制时,只table1在奴隶的影响;由于表2是在一个不同的数据库,table2在奴隶是没有改变的UPDATE。现在假设,相反的使用db1声明一个USE db4声明已被使用:

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

    在这种情况下,的UPDATE语句会使用基于语句的复制当奴隶没有影响。然而,如果您使用的是基于行的复制,UPDATE会改变表1对奴隶,但不table2换句话说,只有在指定的数据库表--replicate-do-db改变默认的数据库的选择和对这种行为没有影响。

    如果你需要跨数据库的更新工作,使用--replicate-wild-do-table=db_name.%相反。看到第17.2.5,“服务器如何评价复制过滤规则”

    笔记

    这个选项会影响复制在相同的方式,--binlog-do-db对二进制日志、效果以及如何复制格式--replicate-do-db影响复制行为与记录格式的行为相同--binlog-do-db

    此选项不影响BEGINCOMMIT,或ROLLBACK声明.

  • --replicate-ignore-db=db_name

    财产价值
    命令行格式--replicate-ignore-db=name
    类型字符串

    创建一个使用数据库的名称复制器。这样的过滤器也可以使用创建CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB

    此选项支持通道特异性复制的过滤器,使多源复制奴隶使用特定的滤波器对不同来源。配置一个特定渠道复制过滤通道命名channel_1使用-先生-复制- DB:channel_1db_name。在这种情况下,第一个冒号被解释为一个分离器和随后的文字冒号冒号。看到第17.2.5.4,“复制通道滤波器”更多信息

    笔记

    全球复制器不能用在一个MySQL服务器实例配置为组复制,因为有些服务器过滤交易将使集团无法达成一致的状态协议。通道特定复制过滤器可用于复制的通道没有直接参与组的复制,如其中一组成员也作为一个奴隶主,是一个复制组外。他们不能用对group_replication_appliergroup_replication_recovery频道

    指定要忽略多个数据库,多次使用此选项,一次为每个数据库。因为数据库名称不能包含逗号,如果你提供一个以逗号分隔的列表然后列表将被视为一个单一的数据库的名称。

    --replicate-do-db,这过滤精确的效果取决于基或基于行的复制是使用语句,并在接下来的几个段落描述。

    基于语句的复制告诉从SQL线程不复制任何声明,默认的数据库(即,一个选择USE)是db_name

    基于行的复制告诉从SQL线程不更新数据库中的任何表db_name。默认的数据库没有影响。

    当使用基于语句的复制,下面的例子不工作,你可能期望。假设从开始--replicate-ignore-db=sales你的问题在主报表:

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

    这个UPDATE陈述在这种情况下,因为复制--replicate-ignore-db仅适用于默认数据库(由USE声明)。因为特价数据库在声明中明确规定,声明未被过滤。然而,使用基于行的复制时,UPDATE语句的作用传播到奴隶的奴隶的副本sales.january表是不变的;在这种情况,--replicate-ignore-db=sales起因全部使在师父的复制表的变化sales数据库是由从忽视

    你不应该如果你使用跨数据库的更新,你不希望这些更新被复制,使用此选项。看到第17.2.5,“服务器如何评价复制过滤规则”

    如果你需要跨数据库的更新工作,使用--replicate-wild-ignore-table=db_name.%相反。看到第17.2.5,“服务器如何评价复制过滤规则”

    笔记

    这个选项会影响复制在相同的方式,--binlog-ignore-db对二进制日志、效果以及如何复制格式--replicate-ignore-db影响复制行为与记录格式的行为相同--binlog-ignore-db

    此选项不影响BEGINCOMMIT,或ROLLBACK声明.

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

    财产价值
    命令行格式--replicate-do-table=name
    类型字符串

    通过讲述从SQL线程限制复制到一个给定的表创建一个复制器。指定多个表,多次使用此选项,一次为每个表。本工程为跨数据库的更新和默认数据库的更新,在对比--replicate-do-db。看到第17.2.5,“服务器如何评价复制过滤规则”。你也可以通过发布创建一个过滤器CHANGE REPLICATION FILTER REPLICATE_DO_TABLE声明

    此选项支持通道特异性复制的过滤器,使多源复制奴隶使用特定的滤波器对不同来源。配置一个特定渠道复制过滤通道命名channel_1使用——复制表:channel_1db_name.tbl_name。在这种情况下,第一个冒号被解释为一个分离器和随后的文字冒号冒号。看到第17.2.5.4,“复制通道滤波器”更多信息

    笔记

    全球复制器不能用在一个MySQL服务器实例配置为组复制,因为有些服务器过滤交易将使集团无法达成一致的状态协议。通道特定复制过滤器可用于复制的通道没有直接参与组的复制,如其中一组成员也作为一个奴隶主,是一个复制组外。他们不能用对group_replication_appliergroup_replication_recovery频道

    此选项只影响报表,申请表。它不影响语句只适用于其他数据库对象,如存储过程。筛选报表存储程序操作,使用一个或一个以上的--replicate-*-db选项

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

    财产价值
    命令行格式--replicate-ignore-table=name
    类型字符串

    通过讲述从SQL线程不复制任何声明,更新指定表创建一个复制器,即使任何其他表可能由同一语句更新。指定要忽略多个表,多次使用此选项,一次为每个表。本工程为跨数据库的更新,在对比--replicate-ignore-db。看到第17.2.5,“服务器如何评价复制过滤规则”。你也可以通过发布创建一个过滤器CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE声明

    此选项支持通道特异性复制的过滤器,使多源复制奴隶使用特定的滤波器对不同来源。配置一个特定渠道复制过滤通道命名channel_1使用——复制忽略表:channel_1db_name.tbl_name。在这种情况下,第一个冒号被解释为一个分离器和随后的文字冒号冒号。看到第17.2.5.4,“复制通道滤波器”更多信息

    笔记

    全球复制器不能用在一个MySQL服务器实例配置为组复制,因为有些服务器过滤交易将使集团无法达成一致的状态协议。通道特定复制过滤器可用于复制的通道没有直接参与组的复制,如其中一组成员也作为一个奴隶主,是一个复制组外。他们不能用对group_replication_appliergroup_replication_recovery频道

    此选项只影响报表,申请表。它不影响语句只适用于其他数据库对象,如存储过程。筛选报表存储程序操作,使用一个或一个以上的--replicate-*-db选项

  • --replicate-rewrite-db=from_name->to_name

    财产价值
    命令行格式--replicate-rewrite-db=old_name->new_name
    类型字符串

    告诉奴隶创造一个复制的过滤器,将默认的数据库(即,一个选择USE)来to_name如果它是from_name在主。只有报表涉及到数据表的影响(不象CREATE DATABASEDROP DATABASE,和ALTER DATABASE),and only iffrom_name在主人的默认数据库。指定多个重写,多次使用这个选项。服务器使用一个from_name价值匹配。数据库名称的翻译是之前这个--replicate-*规则测试。你也可以通过发布创建一个过滤器CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB声明

    如果你使用这个选项在命令行和>性格是特别给你的命令解释器,报价的期权价值。例如:

    内核&#62;mysqld --replicate-rewrite-db="olddb->newdb"

    此选项支持通道特异性复制的过滤器,使多源复制奴隶使用特定的滤波器对不同来源。指定频道名称后跟一个冒号,然后通过过滤器规格。第一个冒号被解释为一个分离器,任何后续的冒号被解释为文本的颜色。例如,配置信道滤波器对信道指定特定复制channel_1,使用:

    内核&#62;mysqld --replicate-rewrite-db=channel_1:db_name1->db_name2

    如果你用冒号而不指定通道名称选项配置为默认的复制通道复制器。看到第17.2.5.4,“复制通道滤波器”更多信息

    笔记

    全球复制器不能用在一个MySQL服务器实例配置为组复制,因为有些服务器过滤交易将使集团无法达成一致的状态协议。通道特定复制过滤器可用于复制的通道没有直接参与组的复制,如其中一组成员也作为一个奴隶主,是一个复制组外。他们不能用对group_replication_appliergroup_replication_recovery频道

    语句中表名符合数据库名称使用此选项时不使用表级复制过滤选项,如工作--replicate-do-table。假设我们有一个数据库命名在主,一个名为b对奴隶,每一个表T,并已开始掌握--replicate-rewrite-db='a->b'。在稍后的时间点,我们执行DELETE FROM a.t。在这种情况下,没有相关的过滤规则的作品,在这里显示的原因:

    1. --replicate-do-table=a.t没有工作,因为从表T在数据库b

    2. --replicate-do-table=b.t不匹配的原始报表等被忽略。

    3. --replicate-do-table=*.t处理相同--replicate-do-table=a.t,从而不工作,要么

    同样,该--replication-rewrite-db选项不跨数据库更新工作。

  • --replicate-same-server-id

    财产价值
    命令行格式--replicate-same-server-id
    类型布尔
    默认值FALSE

    用于从服务器。通常你应该使用设置为默认值,以防止无限循环的循环复制造成的。如果设置为-1,奴隶不跳过有自己的服务器ID。正常的事件,这是只有在罕见的配置有用。该选项不能设置为1时--log-slave-updates启用,这是默认的

    默认情况下,从I/O线程不写入二进制日志事件的中继日志如果他们有奴隶的服务器ID(这种优化有助于节省磁盘使用)。如果你想使用--replicate-same-server-id,一定要开始从这个选项在您做出从读自己的事件,你要从SQL线程执行。

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

    财产价值
    命令行格式--replicate-wild-do-table=name
    类型字符串

    创建一个复制筛选告诉奴隶线程限制复制语句在任何更新的表匹配指定的数据库和表名模式。模式可以包含%_通配符,具有同样的含义LIKE模式匹配算子。指定多个表,多次使用此选项,一次为每个表。本工程为跨数据库的更新。看到第17.2.5,“服务器如何评价复制过滤规则”。你也可以通过发布创建一个过滤器CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE声明

    此选项支持通道特异性复制的过滤器,使多源复制奴隶使用特定的滤波器对不同来源。配置一个特定渠道复制过滤通道命名channel_1使用——复制野生做表:channel_1db_name.tbl_name。在这种情况下,第一个冒号被解释为一个分离器和随后的文字冒号冒号。看到第17.2.5.4,“复制通道滤波器”更多信息

    笔记

    全球复制器不能用在一个MySQL服务器实例配置为组复制,因为有些服务器过滤交易将使集团无法达成一致的状态协议。通道特定复制过滤器可用于复制的通道没有直接参与组的复制,如其中一组成员也作为一个奴隶主,是一个复制组外。他们不能用对group_replication_appliergroup_replication_recovery频道

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

    作为一个例子,--replicate-wild-do-table=foo%.bar%只复制更新,使用表所在的数据库名称的开始Foo和表的名字开始bar

    如果表名模式%,它匹配任何表名和选项同样适用于数据库级的语句(CREATE DATABASEDROP DATABASE,和ALTER DATABASE)。例如,如果你使用--replicate-wild-do-table=foo%.%数据库级的语句,如果数据库名称相匹配的模式复制foo %

    包括在数据库或表名称图案文字的通配符,逃避加上一个反斜杠。例如,复制所有的数据库表名my_own%db,但不可复制的表的my1ownaabcdb数据库,You should Escape the_%像这样的角色:--replicate-wild-do-table=my\_own\%db。如果你使用这个选项在命令行上,您可能需要双反斜杠或报价的期权价值,取决于你的命令解释器。例如,与猛击内核,你需要的类型--replicate-wild-do-table=my\\_own\\%db

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

    财产价值
    命令行格式--replicate-wild-ignore-table=name
    类型字符串

    创建一个复制器使从属线程复制了一份声明,任何表匹配给定的通配符。指定要忽略多个表,多次使用此选项,一次为每个表。本工程为跨数据库的更新。看到第17.2.5,“服务器如何评价复制过滤规则”。你也可以通过发布创建一个过滤器CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE声明

    此选项支持通道特异性复制的过滤器,使多源复制奴隶使用特定的滤波器对不同来源。配置一个特定渠道复制过滤通道命名channel_1使用——复制野生忽略:channel_1db_name.tbl_name。在这种情况下,第一个冒号被解释为一个分离器和随后的文字冒号冒号。看到第17.2.5.4,“复制通道滤波器”更多信息

    笔记

    全球复制器不能用在一个MySQL服务器实例配置为组复制,因为有些服务器过滤交易将使集团无法达成一致的状态协议。通道特定复制过滤器可用于复制的通道没有直接参与组的复制,如其中一组成员也作为一个奴隶主,是一个复制组外。他们不能用对group_replication_appliergroup_replication_recovery频道

    作为一个例子,--replicate-wild-ignore-table=foo%.bar%不会复制更新,使用表所在的数据库名称的开始Foo和表的名字开始bar。有关如何匹配的工作信息,看到的描述--replicate-wild-do-table选项的规则,包括选择价值字面的通配符是相同的--replicate-wild-ignore-table也.

  • --report-host=host_name

    财产价值
    命令行格式--report-host=host_name
    系统变量report_host
    范围全球
    动态
    看到的是_提示应用
    类型字符串

    主机名称或IP地址的奴隶是奴隶主在注册报告。这个值出现在输出SHOW SLAVE HOSTS在主服务器上。如果你不想做奴隶与主人登记本身把值设置。

    笔记

    充分掌握简单地阅读从IP地址的TCP/IP套接字连接后是不是奴隶。由于NAT和路由问题,IP可能不能从主或其他主机连接到奴隶。

  • --report-password=password

    财产价值
    命令行格式--report-password=name
    系统变量report_password
    范围全球
    动态
    看到的是_提示应用
    类型字符串

    奴隶的账号密码被报道在奴隶主登记。这个值出现在输出SHOW SLAVE HOSTS在主服务器上,如果主人是开始--show-slave-auth-info

    虽然这可能意味着其他选项的名称,--report-password没有连接到MySQL用户权限系统,所以不一定是(或可能)为MySQL复制用户帐户的密码相同。

  • --report-port=slave_port_num

    财产价值
    命令行格式--report-port=#
    系统变量report_port
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值[slave_port]
    最小值0
    最大值65535

    TCP/IP端口号连接到奴隶,是奴隶主在注册报告。这只有当奴隶是听非默认端口或如果你有从主或其他客户从一个特殊的隧道。如果你不确定,不要使用此选项。

    此选项的默认值是实际使用的奴隶的端口号(bug # 13333431)。这也显示默认值SHOW SLAVE HOSTS

  • --report-user=user_name

    财产价值
    命令行格式--report-user=name
    系统变量report_user
    范围全球
    动态
    看到的是_提示应用
    类型字符串

    奴隶的帐户的用户名被报道在奴隶主登记。这个值出现在输出SHOW SLAVE HOSTS在主服务器上,如果主人是开始--show-slave-auth-info

    虽然这可能意味着其他选项的名称,--report-user没有连接到MySQL用户权限系统,所以不一定是(或可能)作为MySQL复制的用户帐户名称相同。

  • --slave-checkpoint-group=#

    财产价值
    命令行格式--slave-checkpoint-group=#
    类型整数
    默认值512
    最小值32
    最大值524280
    块的大小8

    套成交,可以检查点操作之前的一个多线程处理的最大数量的奴隶来显示其状态更新SHOW SLAVE STATUS。设置此选项对奴隶的多线程是不影响功能。

    这个选项结合作品--slave-checkpoint-period在这样一个选项,当超过极限,检查站执行计数器跟踪交易数量从上一个检查点复位时间。

    允许的最小值,这个选项是32,除非服务器建成使用-DWITH_DEBUG在这种情况下,最小值为1。有效值是8的倍数;你可以将它设置为一个值,是不是这么多,但是服务器发到下一个8之前储存的价值。(例外:没有这样的舍入的调试服务器执行。)无论服务器如何建,默认值是512,和最大允许值为524280。

  • --slave-checkpoint-period=#

    财产价值
    命令行格式--slave-checkpoint-period=#
    类型整数
    默认值300
    最小值1
    最大值4G

    设置最大时间(以毫秒为单位)是允许一个检查点操作之前,通过被称为显示更新的一个多线程的奴隶的地位SHOW SLAVE STATUS。设置此选项对奴隶的多线程是不影响功能。

    这个选项结合作品--slave-checkpoint-group在这样一个选项,当超过极限,检查站执行计数器跟踪交易数量从上一个检查点复位时间。

    允许的最小值,这个选项是1,除非服务器建成使用-DWITH_DEBUG,在这种情况下,最小值为0。无论服务器如何建,默认值是300,和可能的最大值是4294967296(4GB)。

  • --slave-parallel-workers

    财产价值
    命令行格式--slave-parallel-workers=#
    类型整数
    默认值0
    最小值0
    最大值1024

    使奴隶和多线程并行执行的复制事务集奴隶施放的线程数。当该值是一个大于0的数,奴隶是一个多线程的奴隶与指定数量的应用线程,再加上一个协调线程管理。如果你正在使用多个复制的通道,每个通道都有这个线程数。

    重试交易支持多线程是一个奴隶启用时。什么时候slave_preserve_commit_order=1在奴隶交易,外化在同一命令奴隶一样出现在奴隶的中继日志。在交易分配线程的方式配置的应用--slave-parallel-type

    禁用并行执行,将此选项设置为0,这给奴隶一个应用线程没有协调线程。使用此设置的--slave-parallel-typeslave_preserve_commit_order选项没有效果而被忽略。

  • --slave-pending-jobs-size-max=#

    财产价值
    命令行格式--slave-pending-jobs-size-max=#
    类型整数
    默认值(>= 8.0.12)128M
    默认值(<= 8.0.11)16M
    最小值1024
    最大值16EiB
    块的大小1024

    多线程的奴隶,这个选项设置的最大内存量(以字节为单位)提供给奴隶工人队列举行活动尚未应用。设置此选项对奴隶的多线程是不影响功能。

    此选项的最小可能值是1024字节;默认为128MB。可能的最大值是18446744073709551615(16 exbibytes)。是不是1024字节的倍数的值向下舍入到下一个1024字节的数据被存储之前。

    这个变量的值是一个软限位,可以设置匹配的正常工作。如果一个非常大的事件超过这一规模,交易直到所有奴隶工人有空队列,然后处理。所有后续的交易才举行大型的交易已经完成。

  • --skip-slave-start

    财产价值
    命令行格式--skip-slave-start
    类型布尔
    默认值FALSE

    告诉从服务器没有启动从属线程服务器启动时。在线程开始后,使用START SLAVE声明

  • --slave_compressed_protocol={0|1}

    财产价值
    命令行格式--slave-compressed-protocol
    系统变量slave_compressed_protocol
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值OFF

    如果此选项设置为-1,如果奴隶和主人的支持为奴隶/主协议使用压缩。默认值是0(不压缩)。

  • --slave-load-tmpdir=dir_name

    财产价值
    命令行格式--slave-load-tmpdir=dir_name
    系统变量slave_load_tmpdir
    范围全球
    动态
    看到的是_提示应用
    类型目录名称
    默认值/tmp

    在奴隶创建临时文件的目录的名称。这个选项默认是相等的价值tmpdir系统变量。当从SQL线程复制LOAD DATA INFILE声明,它提取的文件可从中继日志到临时文件加载,然后加载到表。如果文件装在主是巨大的,对奴隶的临时文件是巨大的,太。因此,最好用这个选项告诉奴隶把临时文件目录中的一些位于文件系统,有很多可用的空间。在这种情况下,中继日志是巨大的,所以你可能也要使用--relay-log日志文件系统选项,将继电器。

    这个选项指定的目录必须位于一个基于磁盘的文件系统(不是基于内存的文件系统)因为临时文件用于复制LOAD DATA INFILE必须在机器重新启动。目录也不应该是一个被操作系统的启动过程。

  • slave-max-allowed-packet=bytes

    财产价值
    命令行格式--slave-max-allowed-packet=#
    类型整数
    默认值1073741824
    最小值1024
    最大值1073741824

    这个选项设置最大包大小以字节为单位,从SQL和I/O线程可以处理。它是可能的复制写入二进制日志事件的时间比其max_allowed_packet设置一旦添加事件标头。设置slave_max_allowed_packet必须大于max_allowed_packet设置在主,因此采用基于行的复制大更新而不导致复制失败。

    相应的服务器变量slave_max_allowed_packet总是有一个值,是一个正整数的1024倍;如果你将它设置为一定值,不这么多,该值将自动向下舍入到下一个最高的1024的倍数。(例如,如果你启动服务器--slave-max-allowed-packet=10000,使用的值是9216;以0为值使1024用于截断。)就是在这样的情况下发出警告。

    最大值(默认)值为1073741824(1 GB);最低的是1024。

  • --slave-net-timeout=seconds

    财产价值
    命令行格式--slave-net-timeout=#
    系统变量slave_net_timeout
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值60
    最小值1

    等待更多的数据从奴隶认为连接断开的前主人的秒数,中止阅读,并尝试重新连接。第一重试超时后立即发生。重试之间的间隔是由MASTER_CONNECT_RETRY选择的CHANGE MASTER TO声明,并尝试重新连接的数量是有限的--master-retry-count选项默认值是60秒(一分钟)。

  • --slave-parallel-type=type

    财产价值
    命令行格式--slave-parallel-type=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-rows-search-algorithms=list

    财产价值
    命令行格式--slave-rows-search-algorithms=list
    类型配置
    默认值(>= 8.0.2)INDEX_SCAN,HASH_SCAN
    默认值(<= 8.0.1)TABLE_SCAN,INDEX_SCAN
    有效值

    TABLE_SCAN,INDEX_SCAN

    INDEX_SCAN,HASH_SCAN

    TABLE_SCAN,HASH_SCAN

    TABLE_SCAN,INDEX_SCAN,HASH_SCAN(等值的索引扫描,Hash San Scan)

    当制备批次行基于行的记录和复制,这个选项控制如何行搜索匹配,是否使用散列使用主键或唯一键搜索,其他一些关键的,或没有在所有的关键。这个选项设置为初始值slave_rows_search_algorithms系统变量

    指定一个以逗号分隔的列表中有2(或3)从列表中的值INDEX_SCANtable_scanHASH_SCAN。列表不需要引用,但不能包含空格,是否用引号。可能的组合(列表)和它们的影响如下表所示:

    使用索引值/选项INDEX_SCAN,HASH_SCANindex_scan,table_scan,hash_scanINDEX_SCAN,TABLE_SCANTABLE_SCAN,HASH_SCAN
    primary key或独特的关键索引扫描索引扫描哈希索引扫描
    (其他)的密钥哈希索引扫描索引扫描哈希索引扫描
    没有索引哈希扫描表扫描哈希扫描

    该算法是在列表中指定的顺序并不使它们显示的顺序有什么不同SELECTSHOW VARIABLES声明(如用于表只是证明以前相同)。

    • 默认值是INDEX_SCAN,HASH_SCAN。在这种设置下,哈希是用于任何搜索不使用主键或唯一键。指定index_scan,table_scan,hash_scan具有相同的效果作为指定INDEX_SCAN,HASH_SCAN

    • 给力的散列全部搜索,设置这个选项TABLE_SCAN,HASH_SCAN

    • 删除散列,设置这个选项TABLE_SCAN,INDEX_SCAN。这样设置后,所有的搜索,可以使用索引要使用它们,没有任何指标使用表搜索扫描。

    有可能这个选项指定单个值,但这并不是最优的,因为设置一个值,算法只使用限制搜索。特别是,设置INDEX_SCAN一个人是不推荐的,因为,如果没有指数是目前的情况下,搜索是根本无法找到的行。

    笔记

    只有一个性能上的优势INDEX_SCANhash_scan如果行事件足够大。行事件的大小配置使用--binlog-row-event-max-size。例如,假设一个DELETE声明中删除25000行生成大delete_row_event事件在这种情况下,如果slave_rows_search_algorithms是集index_scanHASH_SCAN有一个性能的改善。然而,如果有25000DELETE报表,每一个都是在独立的事件,然后设置为代表slave_rows_search_algorithmsindex_scanHASH_SCAN没有提供性能改进在执行这些单独的事件。

  • --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相当于错误代码列表1007100810501051105410601061106810941146

    你也可以(但不应擅自使用的价值)all使奴隶忽略所有的错误信息和保持下去不管发生什么。不用说,如果你使用全部,有关于数据的完整性没有保证。请不要抱怨(或文件错误报告)在这种情况下,如果奴隶的数据是不接近它的主人。你已经被警告

    实例:

    --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=value
    类型布尔
    默认值1
    有效值

    0

    1

    当启用此选项,从检查校验和从中继日志阅读,在不匹配的事件,从停止错误。

下面的选项是通过复制测试MySQL测试和调试内部使用。他们不打算用于生产环境。

  • --abort-slave-event-count

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

    当这个选项被设置为一个正整数value除了0(默认值)对复制行为如下:当奴隶的SQL线程已启动,value事件日志可以执行;之后,从SQL线程不接收任何事件,就像从主网络连接被切断。从线程继续运行,并输出SHOW SLAVE STATUS显示器在两Slave_IO_Runningslave_sql_running列,但没有进一步的事件是从中继日志读取。

  • --disconnect-slave-event-count

    财产价值
    命令行格式--disconnect-slave-event-count=#
    类型整数
    默认值0
伐木奴隶的身份到Tables的选择

复制的奴隶状态信息记录到InnoDB表中mysql数据库在MySQL 8.0,这个信息也可以记录在数据目录下的文件,但使用这种格式现在已过时。船长日志和中继日志日志写作可以使用两个服务器选项列在这里分别配置:

  • --master-info-repository={TABLE|FILE}

    财产价值
    命令行格式--master-info-repository=FILE|TABLE
    类型字符串
    默认值(>= 8.0.2)TABLE
    默认值(<= 8.0.1)FILE
    有效值

    FILE

    TABLE

    此选项决定从服务器日志的主人翁地位和连接信息,InnoDB表中mysql数据库,或者在数据目录中的文件。

    默认设置是TABLE。作为一个InnoDB表,主日志命名mysql.slave_master_info。这个TABLE设置时需要多个复制通道配置。

    这个FILE设置是过时的,并将在未来的版本中删除。作为一个文件,主日志命名master.info默认情况下,你可以改变这个名字的使用--master-info-file选项

    对于这个奴隶状态日志的位置设置的设置对效果有直接的影响sync_master_info系统变量。你只能改变设置时没有复制线程执行。

  • --relay-log-info-repository={TABLE|FILE}

    财产价值
    命令行格式--relay-log-info-repository=FILE|TABLE
    类型字符串
    默认值(>= 8.0.2)TABLE
    默认值(<= 8.0.1)FILE
    有效值

    FILE

    TABLE

    此选项决定从服务器日志中记录一个中继位置,InnoDB表中mysql数据库,或者在数据目录中的文件。

    默认设置是TABLE。作为一个InnoDB表,中继日志信息日志命名mysql.slave_relay_log_info。这个TABLE设置时需要多个复制通道配置。这个对于中继日志信息的日志设置也需要复制弹性意外停止,这--relay-log-recovery必须启用。看到制作复制弹性意外停止更多信息

    这个FILE设置是过时的,并将在未来的版本中删除。作为一个文件,中继日志日志命名relay-log.info默认情况下,你可以改变这个名字的使用--relay-log-info-file选项

    对于这个奴隶状态日志的位置设置的设置对效果有直接的影响sync_relay_log_info系统变量。你只能改变设置时没有复制线程执行。

奴隶状态日志表和他们的内容被认为是本地的一个给定的MySQL服务器。他们是不可复制的,以及改变他们不写入二进制日志。

有关更多信息,参见第17.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.6,“开始从语法”为更多的信息

  • log_slow_slave_statements

    财产价值
    系统变量log_slow_slave_statements
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值OFF

    当慢查询日志启用,这个变量使得已经超过查询日志long_query_time秒的奴隶执行。设置这个变量没有直接的影响。该变量的状态适用于所有后续START SLAVE声明.

    注意:所有报表登录在主行格式将不会被记录在奴隶的慢日志,即使log_slow_slave_statements启用

  • master_info_repository

    财产价值
    命令行格式--master-info-repository=FILE|TABLE
    系统变量master_info_repository
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值(>= 8.0.2)TABLE
    默认值(<= 8.0.1)FILE
    有效值

    FILE

    TABLE

    这一变量的设置决定是否从服务器日志的主人翁地位和连接信息,InnoDB表中mysql数据库,或者在数据目录中的文件。

    默认设置是TABLE。作为一个InnoDB表,主日志命名mysql.slave_master_info。这个TABLE设置时需要多个复制通道配置。

    这个FILE设置是过时的,并将在未来的版本中删除。作为一个文件,主日志命名master.info默认情况下,你可以改变这个名字的使用--master-info-file选项

    对于这个奴隶状态日志的位置设置的设置对效果有直接的影响sync_master_info系统变量。你只能改变设置时没有复制线程执行。

  • max_relay_log_size

    财产价值
    命令行格式--max-relay-log-size=#
    系统变量max_relay_log_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值0
    最小值0
    最大值1073741824

    如果用复制的奴隶的中继日志导致当前日志文件的大小超过此变量的值,从旋转的中继日志(关闭当前文件并打开下一个)。如果max_relay_log_size0、服务器使用max_binlog_size对于二进制日志和中继日志。如果max_relay_log_size大于0,这限制了中继日志的大小,使你的日志有不同的尺寸。你必须设置max_relay_log_size4096个字节和1GB之间(含),或0。默认值是0。看到第17.2.2,“复制的实施细则》

  • relay_log

    财产价值
    命令行格式--relay-log=file_name
    系统变量relay_log
    范围全球
    动态
    看到的是_提示应用
    类型文件名

    中继日志文件的基名称,没有路径,没有文件扩展名。对于默认复制通道,中继日志的默认名称是基础host_name-relay-bin。对于非默认复制通道,中继日志的默认名称是基础host_name中继站—channel,在那里channel是记录在这个中继日志复制通道的名称。

  • relay_log_basename

    财产价值
    系统变量relay_log_basename
    范围全球
    动态
    看到的是_提示应用
    类型文件名
    默认值datadir + '/' + hostname + '-relay-bin'

    持名和完整路径中继日志文件。

  • relay_log_index

    财产价值
    命令行格式--relay-log-index
    系统变量relay_log_index
    范围全球
    动态
    看到的是_提示应用
    类型文件名
    默认值*host_name*-relay-bin.index

    对于默认复制通道的中继日志索引文件的名称。默认名称是host_name-relay-bin.index

  • 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在数据目录relay_log_info_repository=FILE现在已不再使用

  • relay_log_info_repository

    财产价值
    系统变量relay_log_info_repository
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值(>= 8.0.2)TABLE
    默认值(<= 8.0.1)FILE
    有效值

    FILE

    TABLE

    这一变量的设置决定是否从服务器日志中记录一个中继位置,InnoDB表中mysql数据库,或者在数据目录中的文件。

    默认设置是TABLE。作为一个InnoDB表,中继日志信息日志命名mysql.slave_relay_log_info。这个TABLE设置时需要多个复制通道配置。这个对于中继日志信息的日志设置也需要复制弹性意外停止,这--relay-log-recovery必须启用。看到制作复制弹性意外停止更多信息

    这个FILE设置是过时的,并将在未来的版本中删除。作为一个文件,中继日志日志命名relay-log.info默认情况下,你可以改变这个名字的使用--relay-log-info-file选项

    对于这个奴隶状态日志的位置设置的设置对效果有直接的影响sync_relay_log_info系统变量。你只能改变设置时没有复制线程执行。

  • relay_log_purge

    财产价值
    命令行格式--relay-log-purge
    系统变量relay_log_purge
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值TRUE

    禁用或启用自动清除中继日志文件就不再需要。默认值是1(ON

  • relay_log_recovery

    财产价值
    命令行格式--relay-log-recovery
    系统变量relay_log_recovery
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值FALSE

    使自动中继日志恢复后立即启动服务器。恢复过程将创建一个新的中继日志文件、初始化SQL线程位置这一新的中继日志,并初始化I/O线程SQL线程位置。从主然后继续中继日志阅读。这个全局变量是只读的;它的价值可以从奴隶与改变--relay-log-recovery选项,可在复制从崩溃确保不可能损坏继电器的日志进行处理后,必须用以保证安全的奴隶。默认值是0(禁用)。

    这个变量也与relay-log-purge控制清除日志,当他们不再需要。使--relay-log-recovery选择relay-log-purge是残疾的风险,不被清除的文件读取中继日志,导致数据的不一致性,因此是不安全。

    什么时候relay_log_recovery启用和奴隶已经停止,由于在多线程模式下运行时遇到错误,你可以使用START SLAVE UNTIL SQL_AFTER_MTS_GAPS确保所有缝隙处理后,切换到单线程模式或执行改变主声明

  • relay_log_space_limit

    财产价值
    命令行格式--relay-log-space-limit=#
    系统变量relay_log_space_limit
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值0
    最小值0
    最大值(64位平台)18446744073709551615
    最大值(32位平台)4294967295

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

  • report_host

    财产价值
    命令行格式--report-host=host_name
    系统变量report_host
    范围全球
    动态
    看到的是_提示应用
    类型字符串

    的价值--report-host选项

  • report_password

    财产价值
    命令行格式--report-password=name
    系统变量report_password
    范围全球
    动态
    看到的是_提示应用
    类型字符串

    的价值--report-password选项不一样的使用MySQL复制的用户帐户的密码。

  • report_port

    财产价值
    命令行格式--report-port=#
    系统变量report_port
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值[slave_port]
    最小值0
    最大值65535

    的价值--report-port选项

  • report_user

    财产价值
    命令行格式--report-user=name
    系统变量report_user
    范围全球
    动态
    看到的是_提示应用
    类型字符串

    的价值--report-user选项不一样的MySQL复制的用户帐户的名称。

  • rpl_read_size

    财产价值
    命令行格式--rpl-read-size=#
    介绍8.0.11
    系统变量rpl_read_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值8192
    最小值8192
    最大值4294967295

    这个rpl_read_size系统变量控制的最小数据量的字节读取二进制日志文件和中继日志文件。如果重磁盘I/O活动,这些文件是阻碍对数据库的性能,增加了阅读的大小可以减少文件读取和I / O档当文件数据不被操作系统缓存。

    最小值和默认值rpl_read_size是8192字节。该值必须是4KB的多。注意,这个值的大小的缓冲区分配给每个线程读取二进制日志和中继日志文件,包括转储线程对奴隶主人和协调线程。设置较大的值,因此可能有对于服务器内存消耗的影响。

  • rpl_semi_sync_slave_enabled

    财产价值
    系统变量rpl_semi_sync_slave_enabled
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值OFF

    控制是否启用半同步复制是奴隶。启用或禁用插件,设置这个变量ON关闭(or 1 or 0),respectively .默认的是OFF

    这个变量是只有安装从侧半同步复制可用的插件。

  • rpl_semi_sync_slave_trace_level

    财产价值
    系统变量rpl_semi_sync_slave_trace_level
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值32

    半同步复制在痕量水平的奴隶。看到rpl_semi_sync_master_trace_level《permissible值。

    这个变量是只有安装从侧半同步复制可用的插件。

  • rpl_stop_slave_timeout

    财产价值
    命令行格式--rpl-stop-slave-timeout=seconds
    系统变量rpl_stop_slave_timeout
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值31536000
    最小值2
    最大值31536000

    你可以控制的时间长度(秒),STOP SLAVE等待超时设置此变量之前。这可以用来避免死锁之间停止奴隶和其他奴隶的SQL语句中使用不同的客户端连接到奴隶。

    最大值和默认值rpl_stop_slave_timeout是31536000秒(1年)。最小为2秒。更改此变量生效以后STOP SLAVE声明.

    这个变量只影响客户端的问题STOP SLAVE声明。当超时达成,发行客户端返回一个错误消息,说明命令的执行是不完整的。然后客户端停止等待线程停止奴隶,但奴隶线程继续停止,和停止奴隶教学效果仍在。一旦从线程不再忙碌的STOP SLAVE执行语句和从站

  • slave_allow_batching

    财产价值
    命令行格式--slave-allow-batching
    系统变量slave_allow_batching
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值off

    是否启用批量更新复制的奴隶。

    设置这个变量的影响只有当使用复制的NDB存储引擎;在MySQL服务器8,这是目前并没有。有关更多信息,参见从NDB集群复制(单复制通道)

  • slave_checkpoint_group

    财产价值
    命令行格式--slave-checkpoint-group=#
    系统变量slave_checkpoint_group=#
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值512
    最小值32
    最大值524280
    块的大小8

    套成交,可以检查点操作之前的一个多线程处理的最大数量的奴隶来显示其状态更新SHOW SLAVE STATUS。设置这个变量对奴隶的多线程是不影响功能。设置这个变量没有直接的影响。该变量的状态适用于所有后续START SLAVE命令

    这个变量结合的作品slave_checkpoint_period在这样一个系统变量,当超过极限,检查站执行计数器跟踪交易数量从上一个检查点复位时间。

    允许的最小值,这个变量是32,除非服务器建成使用-DWITH_DEBUG在这种情况下,最小值为1。有效值是8的倍数;你可以将它设置为一个值,是不是这么多,但是服务器发到下一个8之前储存的价值。(例外:没有这样的舍入的调试服务器执行。)无论服务器如何建,默认值是512,和最大允许值为524280。

  • slave_checkpoint_period

    财产价值
    命令行格式--slave-checkpoint-period=#
    系统变量slave_checkpoint_period=#
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值300
    最小值1
    最大值4G

    设置最大时间(以毫秒为单位)是允许一个检查点操作之前,通过被称为显示更新的一个多线程的奴隶的地位SHOW SLAVE STATUS。设置这个变量对奴隶的多线程是不影响功能。这个变量设置立即生效,所有复制的渠道,包括运行通道。

    这个变量结合的作品slave_checkpoint_group在这样一个系统变量,当超过极限,检查站执行计数器跟踪交易数量从上一个检查点复位时间。

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

  • slave_compressed_protocol

    财产价值
    命令行格式--slave-compressed-protocol
    系统变量slave_compressed_protocol
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值OFF

    是否当奴隶和主人都支持使用奴隶/主协议压缩。更改此变量采取后续连接尝试的效果;这包括发卡后START SLAVE 声明,以及由运行的I/O线程重新连接(例如发卡后改变主master_retry_countstatement)。

  • slave_exec_mode

    财产价值
    命令行格式--slave-exec-mode=mode
    系统变量slave_exec_mode
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值

    IDEMPOTENT(NDB)

    STRICT(其他)

    有效值

    IDEMPOTENT

    STRICT

    控制如何从线程解决冲突和错误在复制。IDEMPOTENT模式使得重复关键的抑制和无钥匙上发现的错误;严格没有这种抑制的发生

    IDEMPOTENT模式是用在多主复制,循环复制,和其他一些特殊的复制方案。这种模式只能用于当你绝对肯定,重复键错误和未找到密钥错误可以安全地忽略。这意味着使用多主复制失败的情况下,或采用循环复制,不推荐使用在其他情况下。

    这个变量设置立即生效,所有复制的渠道,包括运行通道。

  • slave_load_tmpdir

    财产价值
    命令行格式--slave-load-tmpdir=dir_name
    系统变量slave_load_tmpdir
    范围全球
    动态
    看到的是_提示应用
    类型目录名称
    默认值/tmp

    复制在奴隶创建临时文件的目录的名称LOAD DATA INFILE声明.这个变量设置立即生效,所有复制的渠道,包括运行通道。

  • slave_max_allowed_packet

    财产价值
    系统变量slave_max_allowed_packet
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1073741824
    最小值1024
    最大值1073741824

    这个选项设置最大包大小以字节为单位,从SQL和I/O线程可以处理。这个变量设置立即生效,所有复制的渠道,包括运行通道。它是可能的复制写入二进制日志事件的时间比其max_allowed_packet设置一旦添加事件标头。设置slave_max_allowed_packet必须大于max_allowed_packet设置在主,因此采用基于行的复制大更新而不导致复制失败。

    这个全局变量总是有价值的,是一个正整数倍数为1024;如果你把它的一些价值,不是价值向下舍入到下一个最高的1024的倍数是存放或使用;设置slave_max_allowed_packet0个原因来使用1024。(截断警告是在这种情况下,发行)默认最大值为1073741824(1GB);最小的是1024。

    slave_max_allowed_packet也可以设置在启动时,使用--slave-max-allowed-packet选项

  • slave_net_timeout

    财产价值
    命令行格式--slave-net-timeout=#
    系统变量slave_net_timeout
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值60
    最小值1

    数秒等待更多的数据从主/从之前中止阅读连接。设置这个变量没有直接的影响。该变量的状态适用于所有后续START SLAVE命令

  • slave_parallel_type=type

    财产价值
    命令行格式--slave-parallel-type=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的数,奴隶是一个多线程的奴隶与指定数量的应用线程,再加上一个协调线程管理。如果你正在使用多个复制的通道,每个通道都有这个线程数。

    重试交易支持多线程是一个奴隶启用时。什么时候slave_preserve_commit_order=1在奴隶交易,外化在同一命令奴隶一样出现在奴隶的中继日志。在交易分配线程的方式配置的应用--slave-parallel-type

    禁用并行执行,将此选项设置为0,这给奴隶一个应用线程没有协调线程。使用此设置的--slave-parallel-typeslave_preserve_commit_order选项没有效果而被忽略。

    设置slave_parallel_workers没有直接的影响。该变量的状态适用于所有后续START SLAVE声明.

  • slave_pending_jobs_size_max

    财产价值
    命令行格式--slave-pending-jobs-size-max=#
    系统变量slave_pending_jobs_size_max
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值(>= 8.0.12)128M
    默认值(<= 8.0.11)16M
    最小值1024
    最大值16EiB
    块的大小1024

    多线程的奴隶,这个变量设置的最大内存量(以字节为单位)提供给奴隶工人队列举行活动尚未应用。设置这个变量对奴隶的多线程是不影响功能。设置这个变量没有直接的影响。该变量的状态适用于所有后续START SLAVE命令

    此变量的最小可能值是1024字节;默认为128MB。可能的最大值是18446744073709551615(16 exbibytes)。这不是1024字节的整数倍值向下舍入到下一个1024字节存储之前。

    这个变量的值是一个软限位,可以设置匹配的正常工作。如果一个非常大的事件超过这一规模,交易直到所有奴隶工人有空队列,然后处理。所有后续的交易才举行大型的交易已经完成。

  • slave_preserve_commit_order

    财产价值
    命令行格式--slave-preserve-commit-order=value
    系统变量slave_preserve_commit_order
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值0
    有效值

    0

    1

    多线程的奴隶,设置1此变量确保交易是体现在同一命令奴隶一样出现在奴隶的中继日志,并在已经从中继日志执行的交易顺序防止间隙。这个变量对奴隶的多线程是不影响功能。

    slave_preserve_commit_order=1要求--log-bin--log-slave-updates在奴隶的启用,和——从平行式将logical_clock。

    slave_preserve_commit_order启用,执行线程等待直到所有以前的交易承诺之前。而从属线程等待其他工人把他们的交易报告其状态为等待前要提交事务。在这种模式下,一个多线程的奴隶从来没有进入状态,主人不在。这支持了阅读规模复制使用。看到第17.3.5,使用复制的规模”

    改变这个变量之前,所有复制线程(所有复制的渠道,如果你正在使用多个复制通道)必须停止。如果slave_preserve_commit_order=0是集交易,从适用于并行可能会失灵。因此,检查最近执行的交易并不能保证从主以前所有的交易已经从执行。在已经从奴隶的中继日志执行事务的序列机会差距。这对日志和恢复的影响时,使用多线程的奴隶。注意,设置slave_preserve_commit_order=1防止间隙,但是间隙不预防无低水印位置(在exec_master_log_pos由交易已执行后面的位置)。看到第17.4.1.34,“复制和事务不一致”更多信息

  • slave_rows_search_algorithms

    财产价值
    系统变量slave_rows_search_algorithms=list
    范围全球
    动态
    看到的是_提示应用
    类型配置
    默认值(>= 8.0.2)INDEX_SCAN,HASH_SCAN
    默认值(<= 8.0.1)TABLE_SCAN,INDEX_SCAN
    有效值

    TABLE_SCAN,INDEX_SCAN

    INDEX_SCAN,HASH_SCAN

    TABLE_SCAN,HASH_SCAN

    TABLE_SCAN,INDEX_SCAN,HASH_SCAN(等值的索引扫描,Hash San Scan)

    当制备批次行基于行的记录和复制,这个变量控制如何行搜索匹配,是否使用散列使用主键或唯一键搜索,其他键,或使用任何键都。这个变量设置立即生效,所有复制的渠道,包括运行通道。对系统变量的初始设置,可以指定使用的--slave-rows-search-algorithms选项

    指定一个以逗号分隔的列表中有2(或3)从列表中的值INDEX_SCANtable_scanHASH_SCAN。预计值为字符串,那么该值必须引用。此外,该值必须不包含任何空格。可能的组合(列表)和它们的影响如下表所示:

    使用索引值/选项INDEX_SCAN,HASH_SCANindex_scan,table_scan,hash_scanINDEX_SCAN,TABLE_SCANTABLE_SCAN,HASH_SCAN
    primary key或独特的关键索引扫描索引扫描哈希索引扫描
    (其他)的密钥哈希索引扫描索引扫描哈希索引扫描
    没有索引哈希扫描表扫描哈希扫描

    该算法是在列表中指定的顺序并不使它们显示的顺序有什么不同SELECTSHOW VARIABLES声明(如用于表只是证明以前相同)。

    • 默认值是INDEX_SCAN,HASH_SCAN。在这种设置下,哈希是用于任何搜索不使用主键或唯一键。指定index_scan,table_scan,hash_scan具有相同的效果作为指定INDEX_SCAN,HASH_SCAN

    • 给力的散列全部搜索,设置这个选项TABLE_SCAN,HASH_SCAN

    • 删除散列,设置这个选项TABLE_SCAN,INDEX_SCAN。这样设置后,所有的搜索,可以使用索引要使用它们,没有任何指标使用表搜索扫描。

    有可能这个选项指定单个值,但这并不是最优的,因为设置一个值,算法只使用限制搜索。特别是,设置INDEX_SCAN一个人是不推荐的,因为,如果没有指数是目前的情况下,搜索是根本无法找到的行。

    笔记

    只有一个性能上的优势INDEX_SCANhash_scan如果行事件足够大。行事件的大小配置使用--binlog-row-event-max-size。例如,假设一个DELETE声明中删除25000行生成大delete_row_event事件在这种情况下,如果slave_rows_search_algorithms是集index_scanHASH_SCAN有一个性能的改善。然而,如果有25000DELETE报表,每一个都是在独立的事件,然后设置为代表slave_rows_search_algorithmsindex_scanHASH_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
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值1
    有效值

    0

    1

    因为从SQL线程使用校验和验证数据从中继日志读取。在不匹配的事件,从停止错误。这个变量设置立即生效,所有复制的渠道,包括运行通道。

    笔记

    从I/O线程读取校验和,如果可能的话,总是在接受来自网络上的事件。

  • slave_transaction_retries

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

    设置复制从SQL线程在单线程或多线程从自动重试失败的交易停止前的最大时间数。这个变量设置立即生效,所有复制的渠道,包括运行通道。默认值是10。将该变量设置为0,禁用自动重试交易。

    如果一个SLAVE端未执行的交易因为一个InnoDB死锁或因为事务的执行时间超过InnoDBinnodb_lock_wait_timeout,它会自动重试slave_transaction_retries在停止一个错误的时候。与非暂时的错误交易不重试。性能模式表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

    控件的类型转换方式对使用基于行的复制当奴隶。它的值是一个逗号分隔的列表中的零个或多个元素:ALL_LOSSY所有非lossy _ _ALL_SIGNEDall_unsigned。这个变量设置为不允许类型转换的主人与奴隶之间的空字符串。这个变量设置立即生效,所有复制的渠道,包括运行通道。

    有关类型转换的模式适用于基于行的复制的升级和降级属性的更多信息,参见基于行的复制:属性升级和降级

  • sql_slave_skip_counter

    财产价值
    系统变量sql_slave_skip_counter
    范围全球
    动态
    看到的是_提示应用
    类型整数

    从掌握的从属服务器应该跳过事件的数目。设置选项没有直接的影响。变量适用于下一个START SLAVE下一个语句;START SLAVE声明同时变化值回零。当这个变量设置为非零值,有多个复制通道的配置,START SLAVE声明只能用通道channel条款.

    此选项是基于gtid复制不兼容,不能设置为非零值时,--gtid-mode=ON。如果你需要跳过交易时采用的gtids,使用gtid_executed从主而。看到注射空交易,有关如何做这个

    重要

    如果不设置此变量指定事件的数量会导致奴隶在事件组中开始,奴隶继续跳直到它找到下一个事件组开始,从这一点开始。有关更多信息,参见第13.4.2.5,“全球sql_slave_skip_counter语法”

  • sync_master_info

    财产价值
    命令行格式--sync-master-info=#
    系统变量sync_master_info
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值10000
    最小值0
    最大值(64位平台)18446744073709551615
    最大值(32位平台)4294967295

    这个变量复制奴隶的影响取决于奴隶的master_info_repository是集文件TABLE,在下面解释

    master_info_repository = FILE.如果价值sync_master_info大于0,主从同步master.info文件到磁盘(使用fdatasync())在每信息技术硕士事件如果是0,MySQL服务器不同步的master.info文件服务器磁盘;相反,依赖于操作系统将其内容定期与任何其他文件。

    master_info_repository = TABLE.如果价值sync_master_info大于0,奴隶主信息库表更新后每信息技术硕士事件如果它是零,表不更新。

    默认值为sync_master_info10000。这个变量设置立即生效,所有复制的渠道,包括运行通道。

  • sync_relay_log

    财产价值
    命令行格式--sync-relay-log=#
    系统变量sync_relay_log
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值10000
    最小值0
    最大值(64位平台)18446744073709551615
    最大值(32位平台)4294967295

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

    设置sync_relay_log0不同步做盘;在这种情况下,服务器依赖于操作系统冲洗中继日志的内容以时间为任何其他文件。

    价值是最安全的选择,因为在发生崩溃,你失去最多一个事件从中继日志。然而,它也是最慢的选择(除非盘面有电池支持的高速缓存,使同步速度非常快)。

  • sync_relay_log_info

    财产价值
    命令行格式--sync-relay-log-info=#
    系统变量sync_relay_log_info
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值10000
    最小值0
    最大值(64位平台)18446744073709551615
    最大值(32位平台)4294967295

    默认值为sync_relay_log_info10000。这个变量设置立即生效,所有复制的渠道,包括运行通道。

    这个变量对复制的奴隶的影响取决于服务器的relay_log_info_repository设置(文件TABLE)。if the setting is,该变量的影响还取决于由中继日志信息表用于存储引擎是事务性的(如InnoDB)或不交易(MyISAM)。这些因素的影响服务器的性能sync_relay_log_info值为零,大于零,如下:

    sync_relay_log_info = 0
    • 如果relay_log_info_repository是集文件,MySQL服务器不同步的relay-log.info文件服务器磁盘;相反,依赖于操作系统将其内容定期与任何其他文件。

    • 如果relay_log_info_repository是集,和该表的存储引擎是事务性的,桌子是每次交易后更新。(Thesync_relay_log_info设置在这种情况下有效地忽略。)

    • 如果relay_log_info_repository是集,和该表的存储引擎不是事务性的,桌子是从不更新。

    sync_relay_log_info = N > 0
    • 如果relay_log_info_repository是集文件,从同步relay-log.info文件到磁盘(使用fdatasync())在每N交易

    • 如果relay_log_info_repository是集,和该表的存储引擎是事务性的,桌子是每次交易后更新。(Thesync_relay_log_info设置在这种情况下有效地忽略。)

    • 如果relay_log_info_repository是集,和该表的存储引擎不是事务性的,更新的表后每N事件

17.1.6.4二进制日志记录选项和变量

你可以使用mysqld选项和系统变量,本章阐述了影响二进制日志的操作以及控制语句写入二进制日志。关于二进制日志的更多信息,参见5.4.4节,“二进制日志”。更多信息关于使用MySQL服务器选项和系统变量,看第5.1.6、“服务器选项”,和第5.1.7,服务器“系统变量”

使用二进制日志启动选项

下面的列表描述了启用和配置的二进制日志启动选项。系统变量使用二进制日志在后面讨论。

  • --binlog-row-event-max-size=N

    财产价值
    命令行格式--binlog-row-event-max-size=#
    类型整数
    默认值8192
    最小值256
    最大值(64位平台)18446744073709551615
    最大值(32位平台)4294967295

    指定基于二进制日志事件一行的最大大小,以字节为单位。行分为事件小于这个尺寸如果可能的话。该值应该是256的倍数。默认值是8192。看到17.2.1,“复制格式”

  • --binlog-rows-query-log-events

    财产价值
    命令行格式--binlog-rows-query-log-events
    类型布尔
    默认值FALSE

    此选项使binlog_rows_query_log_events,使MySQL服务器写信息日志事件如行查询日志事件为其二进制日志。

  • --log-bin[=base_name]

    财产价值
    命令行格式--log-bin
    系统变量log_bin
    范围全球
    动态
    看到的是_提示应用
    类型文件名

    指定用于二进制日志文件的基名称。二进制日志功能,服务器记录所有语句更改数据的二进制日志,这是用于备份和复制。二进制日志是一个序列文件的基本名称和数字扩展。这个--log-bin期权价值的日志序列的基本名称。服务器上添加一个数字后缀的基本名称创建序列的二进制日志文件。

    如果你不提供--log-bin选项,MySQL的使用二进制日志作为默认的二进制日志文件的基名称。与早期版本兼容,如果你的供应--log-bin没有字符串或空字符串的选择,基名称默认为host_name,使用的主机名

    二进制日志文件的默认位置是数据目录。你可以使用--log-bin选项指定一个替代的位置,通过对基地的名字加入领先的绝对路径名来指定一个不同的目录。当服务器读取二进制日志索引文件的录入,跟踪二进制日志文件已被使用,它检查条目是否包含相对路径。如果是这样,该路径的相对与绝对路径替换设置使用——日志本选项一个绝对路径记录在二进制日志索引文件保持不变;在这种情况下,索引文件必须手动编辑,使一个新的路径或路径被使用。二进制日志文件的基名称和任何指定的路径是可用的log_bin_basename系统变量

    二进制日志是默认启用(的log_bin系统变量设置为ON)。唯一的例外是如果你使用mysqld初始化数据目录手动调用它的--initialize-初始化不安全选项,在默认情况下禁用二进制日志。它有可能使二进制日志在这种情况下,通过指定--log-bin选项

    禁用二进制日志,你可以指定--skip-log-bin--disable-log-bin在启动选项。如果这些选项指定——日志本还规定,指定的选项后优先。

    这个--log-slave-updates--slave-preserve-commit-order选择需要的二进制日志。如果您禁用二进制日志,要么忽略这些选项,或指定--skip-log-slave-updates--skip-slave-preserve-commit-order。MySQL默认禁用这些选项时--skip-log-bin--disable-log-bin指定。如果你指定--log-slave-updates--slave-preserve-commit-order在一起--skip-log-bin--disable-log-bin、警告或发出错误信息。

    在MySQL 5.7,服务器ID必须指定当二进制日志被启用,或服务器启动不了。在MySQL 8的server_id系统变量默认设置为1。服务器现在可以开始使用这个默认的服务器ID二进制日志时启用,但信息性消息发出后如果不指定服务器ID显式使用--server-id选项所使用的复制拓扑中的服务器,你必须指定一个唯一的非零服务器ID为每个服务器。

    在二进制日志格式和管理信息,看5.4.4节,“二进制日志”

  • --log-bin-index[=file_name]

    财产价值
    命令行格式--log-bin-index=file_name
    类型文件名

    对于二进制日志索引文件的名称。二进制日志索引文件包含所有使用的二进制日志文件的名字。默认情况下,它具有相同的位置和基本名称为您指定的二进制日志文件的使用--log-bin选择,扩大指数。如果你没有提供--log-bin选项,用于二进制日志索引文件的默认名称为binlog.index。如果你提供的--log-bin没有字符串或空字符串的选择,对于二进制日志索引文件的默认名称为host_name-二.索引,使用的主机名

    在二进制日志格式和管理信息,看5.4.4节,“二进制日志”

  • --log-bin-trust-function-creators[={0|1}]

    财产价值
    命令行格式--log-bin-trust-function-creators
    系统变量log_bin_trust_function_creators
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值FALSE

    此选项设置相应的log_bin_trust_function_creators系统变量。如果没有给出参数,选项设置变量1。log_bin_trust_function_creators影响MySQL如何执行限制存储函数和触发器的创建。看到23.7节,“二进制日志存储程序”

  • --log-bin-use-v1-row-events[={0|1}]

    财产价值
    命令行格式--log-bin-use-v1-row-events[={0|1}]
    系统变量log_bin_use_v1_row_events
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值0

    MySQL 8使用2版本的二进制日志行事件,它不能用MySQL服务器读稿到MySQL 5.6.6之前。将此选项设置为1的原因mysqld写使用1版本的二进制日志记录事件,这是二进制日志事件中释放的唯一版本,并由此产生的二进制日志,可以读取在释放这些奴隶。设置--log-bin-use-v1-row-events0(默认)的原因mysqld使用2版本的二进制日志事件。

    使用这个选项的值可以从只读了log_bin_use_v1_row_events系统变量

选择选择选项选择以下列表中影响语句写入二进制日志,并通过复制主服务器发送这样的奴隶。还有,从主报表控制应执行或忽略从服务器选项。详情见第17.1.6.3,“复制从选项和变量”

  • --binlog-do-db=db_name

    财产价值
    命令行格式--binlog-do-db=name
    类型字符串

    这个选项影响的方式类似于这样的二进制日志--replicate-do-db影响复制

    这个选项的效果取决于基于语句或基于行的记录格式使用,效果一样--replicate-do-db取决于基础或基于行的复制是使用语句。你应该记住,格式用来记录某一言论未必相同,所表示的值binlog_format。例如,DDL语句,如CREATE TABLEALTER TABLE经常登录的陈述,不考虑日志格式的效果,所以下面的语句基础规则- Binlog - do-DB总是将决定是否记录表。

    基于语句的日志只有那些语句写入二进制日志在默认的数据库(即,一个选择USE)是db_name。要指定多个数据库,多次使用此选项,一次为每个数据库;然而,这样做因为跨数据库的报表等UPDATE some_db.some_table SET foo='bar'被记录在一个不同的数据库(或数据库)的选择。

    警告

    指定多个数据库的你必须使用此选项的多个实例。因为数据库名称不能包含逗号,名单将被视为一个单一的数据库的名称如果你提供一个以逗号分隔的列表。

    什么不工作,你可能希望使用基于语句的记录的一个例子:如果服务器开始--binlog-do-db=sales你发出以下声明,该UPDATE语句记录:

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

    这其中的主要原因只是检查默认数据库行为是它知道它应该被复制的是仅从陈述困难(例如,如果你正在使用多个表DELETE表或多个表UPDATE陈述行为跨越多个数据库)。它也越来越快,而不是所有的数据库都没有需要检查只有默认的数据库。

    另一种情况可能不是不言而喻的发生在一个给定的数据库复制,尽管它没有指定设置选项时。如果服务器开始--binlog-do-db=sales,以下UPDATE尽管声明记录价格不包括在设置--binlog-do-db

    USE sales;UPDATE prices.discounts SET percentage = percentage + 10;

    因为sales是默认的数据库时,UPDATE声明发出后,该UPDATE登录

    基于行的日志测井是限制数据库db_name。表属于唯一的变化db_name登录的默认数据库;有无影响。假设服务器开始--binlog-do-db=sales与基于行的记录是有效的,然后下面的语句被执行:

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

    的变化february表中特价数据库记录按照UPDATE声明;这是否USE声明发表。然而,当使用基于日志格式的行--binlog-do-db=sales,继受取得的变化UPDATE没有登录:

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

    即使USE prices语句改变了使用销售,的UPDATE语句的效果还没有被写入二进制日志。

    另一个重要的区别在--binlog-do-db处理报表的记录相对于基于行的记录发生在语句引用多个数据库。假设服务器开始--binlog-do-db=db1,和下面的语句被执行:

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

    如果您使用的是基于语句的记录,既表更新写入二进制日志。然而,基于格式的行时,只有改变table1登录;表2是在一个不同的数据库,所以它是不会改变的UPDATE。现在假设,相反的使用db1声明一个USE db4声明已被使用:

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

    在这种情况下,的UPDATE声明中没有写入二进制日志,当使用基于语句的日志。然而,使用基于行的记录时,改变表1登录,但不知道table2换句话说,在指定的数据库表的变化--binlog-do-db登录的默认数据库的选择,以及对这种行为没有影响。

  • --binlog-ignore-db=db_name

    财产价值
    命令行格式--binlog-ignore-db=name
    类型字符串

    这个选项影响的方式类似于这样的二进制日志--replicate-ignore-db影响复制

    这个选项的效果取决于基于语句或基于行的记录格式使用,效果一样--replicate-ignore-db取决于基础或基于行的复制是使用语句。你应该记住,格式用来记录某一言论未必相同,所表示的值binlog_format。例如,DDL语句,如CREATE TABLEALTER TABLE经常登录的陈述,不考虑日志格式的效果,所以下面的语句基础规则——binlog-ignore-db总是将决定是否记录表。

    基于语句的日志告诉服务器不记录任何语句,默认的数据库(即,一个选择USE)是db_name

    如果没有默认的数据库,没有--binlog-ignore-db期权的应用,这样的陈述是经常登录。(错误# 11829838,错误# 60188)

    基于行的格式告诉服务器不要日志更新数据库中的任何表db_name。目前的数据库没有影响。

    采用基于语句的记录时,下面的例子不工作,你可能期望。假设服务器开始--binlog-ignore-db=sales你发出以下声明:

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

    这个UPDATE陈述在这种情况下,由于登录--binlog-ignore-db仅适用于默认数据库(由USE声明)。因为特价数据库在声明中明确规定,声明未被过滤。然而,使用基于行的日志时,UPDATE语句的作用写入二进制日志,这意味着没有变化的sales.january表格记录;在这种情况,--binlog-ignore-db=sales起因全部使在师父的复制表的变化sales数据库是对二进制日志的目的忽视。

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

    你不应该如果你使用跨数据库的更新,你不希望这些更新会记录使用此选项。

校验选项MySQL支持读写二进制日志校验和。这些都是使用这两个选项列出启用:

  • --binlog-checksum={NONE|CRC32}

    财产价值
    命令行格式--binlog-checksum=type
    类型字符串
    默认值CRC32
    有效值

    NONE

    CRC32

    启用此选项使主人写写入二进制日志事件校验。设置NONE禁用,或名称的算法用于生成校验;目前,只有crc32校验的支持,和CRC32是默认的。你不能在一个事务中更改此选项的设置。

  • --master-verify-checksum={0|1}

    财产价值
    命令行格式--master-verify-checksum=name
    类型布尔
    默认值OFF

    启用此选项主验证事件使用校验和的二进制日志,并停止在不匹配的事件错误。默认情况下禁用。

控制由从读校验(从继电器)的日志,使用--slave-sql-verify-checksum选项

测试和调试选项下面的二进制日志选项复制中使用的测试和调试。他们不打算用于正常操作。

  • --max-binlog-dump-events=N

    财产价值
    命令行格式--max-binlog-dump-events=#
    类型整数
    默认值0

    这个选项是通过复制测试MySQL测试和调试内部使用。

  • --sporadic-binlog-dump-fail

    财产价值
    命令行格式--sporadic-binlog-dump-fail
    类型布尔
    默认值FALSE

    这个选项是通过复制测试MySQL测试和调试内部使用。

与二进制日志使用系统变量

下面的列表描述控制二进制日志系统变量。他们可以在服务器启动,其中一些可以在运行时改变使用SET。控制二进制日志应用服务器选项都列在本节前面。

  • binlog_cache_size

    财产价值
    命令行格式--binlog-cache-size=#
    系统变量binlog_cache_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值32768
    最小值4096
    最大值(64位平台)18446744073709551615
    最大值(32位平台)4294967295

    缓存的大小来把握变化的二进制日志中的事务。当二进制日志服务器上启用(与log_bin系统变量设置为on),二进制日志缓存分配给每个客户如果服务器支持任何事务性存储引擎。如果你经常使用大量的交易,你可以增加缓存大小以获得更好的性能。这个Binlog_cache_useBinlog_cache_disk_use在这一变数中,情况可变。See5.4.4节,“二进制日志”

    binlog_cache_size集只为交易的缓存大小;语句缓存的大小是由binlog_stmt_cache_size系统变量

  • binlog_checksum

    财产价值
    系统变量binlog_checksum
    范围全球
    动态
    看到的是_提示应用
    类型字符串
    默认值CRC32
    有效值

    NONE

    CRC32

    当启用时,此变量的原因主在二进制日志写的每一个事件的校验。binlog_checksum支持的值(禁用)和CRC32。默认值是CRC32。你不能改变的价值binlog_checksum在一个事务

    什么时候binlog_checksum被剥夺(价值)),服务器验证,这是写作的唯一完整的事件写检查事件长度的二进制日志(而不是一个校验和)为每个事件。

    改变这个变量的值使二进制日志可以旋转;校验总是写给一个二进制日志文件,而不只是一部分人。

    在主一个值由从未知的原因从设定自己设置这个变量binlog_checksum价值,和一个错误停止复制。(错误# 13553750,错误# 61096)如果老奴隶的向后兼容性是一个问题,你可能需要明确设定值NONE

  • binlog_direct_non_transactional_updates

    财产价值
    命令行格式--binlog-direct-non-transactional-updates[=value]
    系统变量binlog_direct_non_transactional_updates
    范围全球会议
    动态
    看到的是_提示应用
    类型布尔
    默认值OFF

    由于并发问题,奴隶可以不一致时,一个事务中包含更新的事务性和非事务表。MySQL试图通过写作非事务性事务的语句缓存保存在这些陈述的因果关系,这是在犯冲。然而,出现问题时进行修改,非事务表代表的交易成为其他连接立即可见,因为这些变化可能不会立即写入到二进制日志。

    这个binlog_direct_non_transactional_updates变量提供了一个可能的解决这个问题。默认情况下,这个变量被禁用。有可能binlog_direct_non_transactional_updates导致更新非事务性表被直接写入二进制日志,而不是交易缓存。

    binlog_direct_non_transactional_updates只为陈述,重复使用基于二进制日志格式的语句;那是,它只能在价值binlog_format声明,或当binlog_format混合的与一个给定的声明被复制使用的格式声明。这个变量没有影响二进制日志格式时ROW,或当binlog_format是集混合的与一个给定的陈述是基于行的复制格式。

    重要

    在启用这个变量,你必须确保有事务和非事务表之间没有依赖关系;这种依赖的一个例子是声明INSERT INTO myisam_table SELECT * FROM innodb_table。否则,这样的说法可能导致奴隶偏离主。

    这个变量没有影响二进制日志格式时ROW混合的

  • binlog_error_action

    财产价值
    命令行格式--binlog-error-action[=value]
    系统变量binlog_error_action
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值ABORT_SERVER
    有效值

    IGNORE_ERROR

    ABORT_SERVER

    控制当服务器遇到错误,例如:无法写入,冲洗或同步二进制日志,可以使主人的日志变得不一致和复制失去同步的奴隶。

    这个变量的默认值ABORT_SERVER,使服务器停止采伐和关闭它遇到一个这样的错误时,二进制日志。在服务器重启,所有先前的准备和二进制记录交易的承诺,而任何交易都准备好但不是二进制日志由于错误被中止。

    什么时候binlog_error_action是集主_误差,如果服务器遇到这样的错误继续正在进行的事务,记录错误并停止采伐,并继续执行更新。恢复的二进制日志log_bin必须再次启用。这提供了向后兼容旧版本的MySQL。

  • binlog_expire_logs_seconds

    财产价值
    命令行格式--binlog-expire-logs-seconds=#
    介绍8.0.1
    系统变量binlog_expire_logs_seconds
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值(>= 8.0.11)2592000
    默认值(<= 8.0.4)0
    最小值0
    最大值4294967295

    集的二进制日志保质期秒。有效期结束后,二进制日志文件可以被自动删除。可能清除发生在启动时的二进制日志刷新。日志冲洗时如最后,“MySQL服务器日志”

    默认的二进制日志的保质期是2592000秒,这相当于30天(30×24×60*60秒)。如果没有默认的应用binlog_expire_logs_seconds也不过时的系统变量expire_logs_days已经在启动一个值。如果一个变量不为零的值binlog_expire_logs_secondsexpire_logs_days设置在启动时,此值作为二进制日志的截止日期。如果对这些变量的一个非零的值设置为在启动时,该值为binlog_expire_logs_seconds作为二进制日志的保质期,和值expire_logs_days被忽略的警告消息

    禁用自动的二进制日志清除,指定值0明确binlog_expire_logs_seconds,而不指定值expire_logs_days。与早期版本的兼容性,自动清除也是残疾人如果你指定一个值0明确expire_logs_days不指定一个值binlog_expire_logs_seconds。在这种情况下,默认为binlog_expire_logs_seconds不适用

    删除二进制日志文件手动,使用PURGE BINARY LOGS声明。看到第13.4.1.1,“清除二进制日志语法”

  • binlog_format

    财产价值
    命令行格式--binlog-format=format
    系统变量binlog_format
    范围全球会议
    动态
    看到的是_提示应用
    类型枚举
    默认值ROW
    有效值

    ROW

    STATEMENT

    MIXED

    这组变量的二进制日志格式,可以是任何一个STATEMENT,或MIXED。看到17.2.1,“复制格式”binlog_format是由--binlog-format选择在启动时,或由binlog_format变量在运行时

    笔记

    虽然你可以在运行时更改日志格式,它是建议你改变它而复制正在进行。这部分是由于这样的事实,不尊重主人的奴隶binlog_format设置;一个给定的MySQL服务器只能改变自己的日志格式。

    默认值是ROW

    你必须有SYSTEM_VARIABLES_ADMINSUPER权限设置全局或会话binlog_format价值

    规则的更改时,这个变量的作用和影响会持续多久是作为其他MySQL服务器系统变量相同。有关更多信息,参见第13.7.5.1,”句法变量赋值”

    什么时候MIXED指定基于复制技术的声明,除的情况下,只有基于行的复制是保证导致正确的结果。例如,当报表包含用户定义函数(UDF)或UUID()功能

    对于存储程序的细节(存储过程和函数、触发器和事件)处理时,每个二进制日志格式设置,看23.7节,“二进制日志存储程序”

    也有例外的时候,你不能在运行时切换复制格式:

    • 从在存储函数或触发器。

    • 如果会话是目前基于行的复制模式,具有开放的临时表。

    • 在一个事务内

    试图转换格式在这种情况下导致错误。

    二进制日志格式影响以下服务器选项的行为:

    在个人选项的描述中详细讨论这些影响。

  • binlog_group_commit_sync_delay

    财产价值
    命令行格式--binlog-group-commit-sync-delay=#
    系统变量binlog_group_commit_sync_delay
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值0
    最小值0
    最大值1000000

    控制多少微秒的二进制日志提交之前等待的二进制日志文件同步到磁盘。默认情况下binlog_group_commit_sync_delay设置为0,也就是说没有延迟。设置binlog_group_commit_sync_delay一微秒的延迟使得更多的交易可同步到磁盘时,降低整体的时间提交一组交易因为较大的群体需要更少的时间单位组。

    什么时候sync_binlog=0sync_binlog=1设置指定的延迟binlog_group_commit_sync_delay适用于每一个二进制日志提交集团之前同步(或在案件sync_binlog=0在程序之前当sync_binlog设置的值N大于1,延迟应用后每N二进制日志提交组

    设置binlog_group_commit_sync_delay可以增加任何服务器上具有并行进行的交易数量(或可能在故障转移后)复制的奴隶,因此可以增加并行执行复制的奴隶。从这个效应中获益,从服务器必须有slave_parallel_type=LOGICAL_CLOCK集,而效果更为显著,binlog_transaction_dependency_tracking=COMMIT_ORDER也是集。重要的是要考虑到主人的吞吐量和奴隶的吞吐量,当你调整设置binlog_group_commit_sync_delay

    设置binlog_group_commit_sync_delay也可以减少一些fsync()调用服务器上的二进制日志(主从)具有一个二进制日志。

    注意设置binlog_group_commit_sync_delay增加交易服务器上的延迟,这可能会影响客户端应用程序。同时,在高度并行的工作负载,它是可能的延迟增加竞争和降低吞吐量。通常情况下,设置一个延迟大于弊的好处,但调整都要进行确定最佳设置。

  • binlog_group_commit_sync_no_delay_count

    财产价值
    命令行格式--binlog-group-commit-sync-no-delay-count=#
    系统变量binlog_group_commit_sync_no_delay_count
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值0
    最小值0
    最大值1000000

    等待终止当前延迟指定的最大交易数binlog_group_commit_sync_delay。如果binlog_group_commit_sync_delay设置为0,那么这个选项不起作用。

  • binlog_max_flush_queue_time

    财产价值
    过时的
    系统变量binlog_max_flush_queue_time
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值0
    最小值0
    最大值100000

    binlog_max_flush_queue_time是过时的,是在未来的MySQL释放最终去除。以前,这个系统变量控制在微秒的时间继续阅读交易从冲洗队列之前,集团承诺。它不再有任何作用。

  • binlog_order_commits

    财产价值
    系统变量binlog_order_commits
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值ON

    当这个变量是在一个主启用(默认),交易体现在相同的命令,他们都写入二进制日志。如果禁用,交易可能会致力于并行。在某些情况下,禁用此变量可能产生的业绩增量。

  • binlog_row_image

    财产价值
    命令行格式--binlog-row-image=image_type
    系统变量binlog_row_image=image_type
    范围全球会议
    动态
    看到的是_提示应用
    类型枚举
    默认值full
    有效值

    full(日志的所有列)

    minimal(只记录更改的列,并需要确定排列)

    noblob(日志的所有列,除不必要的BLOB和文本字段)

    MySQL的基于行的复制,这个变量决定如何行图像写入二进制日志。运行时更改此变量的要求SYSTEM_VARIABLES_ADMINSUPER特权,甚至在会议上的价值。

    基于MySQL的行复制,每行更改事件包含两个图像,一个之前图像的列匹配搜索时的行被更新,和之后包含变化的图像。通常情况下,MySQL日志整行(即所有列)对之前和之后的图像。然而,它没有必要包括在图像每一列,我们往往可以节省磁盘,内存,和记录只有那些列实际上是要求网络使用。

    笔记

    删除行时,只有在记录的图像,因为没有改变价值观传播的缺失。插入一行时,只有在记录的图像,因为没有现有的行相匹配。只有当更新一排都是之前和之后的图像,并写入二进制日志。

    对于之前的形象,它是只需要登录所需的唯一标识列的最小集合。如果包含行的表有一个主键,那么只有主键列或列写入二进制日志。否则,如果表中有一个独特的密钥的所有列NOT NULL,那么只有列在独特的关键需要登录。(如果表没有主键或唯一键没有任何无效的列,然后所有列必须使用以前的图像,并记录图像。)在后,这是必要的日志仅列事实上改变了。

    你可以导致服务器日志或最小行使用binlog_row_image系统变量。这个变量实际上需要一个可能的值,如下面的表所示:

    • full:记录所有的列都在图像和图像后。

    • minimal:日志仅在前图像,需要确定行要改变那些列;只记录这些列中的值是由图像后,SQL语句中指定,或由自动增量的产生。

    • noblob:记录所有的列(同全部)我BLOBTEXT需要确定行不列,或者说没有改变。

    默认值是full

    当使用minimalnoblob删除和更新,保证正确的工作对于一个给定的表,当且仅当下列条件的源和目标表是真的:

    • 所有列必须出现在同一顺序;每一列必须使用相同的数据类型为在其他表中的对应。

    • 该表必须有相同的主键定义。

    (换句话说,该表必须索引的可能的例外是不表的主键的一部分是相同的。)

    如果这些条件不满足,这是可能的,目标表中的主键列的值可能不足以用于删除或更新提供了一个独特的比赛。在这种情况下,没有任何警告或错误发出;主从默默发散,从而打破一致性。

    设置这个变量没有影响的二进制日志格式时STATEMENT。什么时候binlog_format混合的,设置binlog_row_image适用于登录使用基于行的格式的变化,但这种变化记录为报表设置无影响。

    设置binlog_row_image在全球或会话水平不会导致一个隐含的承诺;这意味着,该变量可以改变而不影响交易过程中的交易。

  • binlog_row_metadata

    财产价值
    命令行格式--binlog-row-metadata=metadata_type
    介绍8.0.1
    系统变量binlog_row_metadata=metadata_type
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值MINIMAL
    有效值

    FULL(所有的元数据都包括在内。)

    MINIMAL(限制包括元数据。)

    配置表的元数据量添加到二进制日志记录时,使用基于行的。当设置为MINIMAL,默认情况下,只有元数据相关签署旗帜,列的字符集和几何类型记录。当设置为FULL记录表完整的元数据,如柱的名字,ENUM配置字符串值,PRIMARY KEY信息,等等

    扩展的元数据用于以下目的:

    • 奴隶使用元数据来传递数据时,其表结构不同于硕士学位。

    • 外部软件可以使用元数据来解码行事件和数据保存到外部数据库,如数据仓库。

  • binlog_row_value_options

    财产价值
    命令行格式--binlog-row-value-options=#
    介绍8.0.3
    系统变量binlog_row_value_options
    范围全球会议
    动态
    看到的是_提示应用
    类型配置
    默认值''
    有效值PARTIAL_JSON

    当设置为PARTIAL_JSON,这使得利用空间高效的二进制日志格式更新,只修改一个JSON文档的一小部分,使基于行的复制只写修改部分的JSON文件后在二进制日志更新图像(而不是写完整的文件)。本工程为一个UPDATE语句修改JSON列使用任何序列JSON_SET()JSON_REPLACE(),和JSON_REMOVE()。如果修改需要比完整的文件更多的空间,或者服务器无法生成一个局部更新,完整的文件代替。

    你必须有SYSTEM_VARIABLES_ADMINSUPER权限设置全局或会话的值。片名:杰森是唯一支持的值来设置;binlog_row_value_options,设置它的值为空字符串。

    binlog_row_value_options=PARTIAL_JSON只有生效时启用和二进制日志binlog_format是集MIXED。基于语句的复制总是只记录修改部分的JSON文档,无论设置为任何值binlog_row_value_options。最大限度的节省了空间,使用binlog_row_image=NOBLOBbinlog_row_image=MINIMAL加上这个选项binlog_row_image=FULL节省比这更少的空间,因为完整的JSON文档存储在以前的图像,和局部更新只存储在图像。

    binlog_row_value_options=PARTIAL_JSON覆盖的任何设置log_bin_use_v1_row_events变量。如果该选项被启用,需要由事件格式binlog_row_value_options=PARTIAL_JSON仍在使用

    mysqlbinlog输出包括部分json更新的形式事件编码为Base-64字符串BINLOG声明。if the--verbose指定选项,mysqlbinlog显示部分JSON更新JSON使用伪SQL语句的可读性。

    如果修改不适用于对奴隶的JSON文档MySQL复制产生一个错误。这包括未能找到路径。要知道,即使这个和其他的安全检查,如果在从JSON文件有偏离,在主和部分更新应用,它仍然是理论上可能产生一个有效的但意想不到的JSON文档的奴隶。

    复制到老版本当复制一个奴隶使用MySQL 8.0.2或从主运行MySQL 8.0.3或晚以前的版本,binlog_row_value_options必须禁用(即设置&#39; &#39;)。这是因为JSON部分更新记录使用二进制日志事件类型介绍MySQL 8.0.3;该事件类型不是由MySQL以前版本的认可。

  • binlog_rows_query_log_events

    财产价值
    命令行格式--binlog-rows-query-log-events
    系统变量binlog_rows_query_log_events
    范围全球会议
    动态
    看到的是_提示应用
    类型布尔
    默认值FALSE

    这个binlog_rows_query_log_events系统变量影响的基于行的记录只有。当启用时,它会导致MySQL服务器写信息日志事件如行查询日志事件为其二进制日志。此信息可用于调试和相关用途;如获得原始查询发布的主人就不能从行更新改造。运行时更改此变量的要求SYSTEM_VARIABLES_ADMINSUPER特权,甚至在会议上的价值。

    这些事件通常是由MySQL程序读取二进制日志,所以没有问题时,复制或从备份还原忽略。看他们,用mysqlbinlog详细级别的增加--verbose选择两次,无论是为- VV--verbose --verbose

  • binlog_stmt_cache_size

    财产价值
    命令行格式--binlog-stmt-cache-size=#
    系统变量binlog_stmt_cache_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值32768
    最小值4096
    最大值(64位平台)18446744073709551615
    最大值(32位平台)4294967295

    这个变量决定举行非事务语句在事务期间发布的二进制日志缓存的大小。当二进制日志服务器上启用(与log_bin系统变量设置为on),单独的二进制日志事务和语句缓存分配给每个客户端,如果服务器支持任何事务性存储引擎。如果你经常使用大型非事务语句在交易过程中,你可以增加缓存大小以获得更好的性能。这个Binlog_stmt_cache_useBinlog_stmt_cache_disk_use在这一变数中,情况可变。See5.4.4节,“二进制日志”

    这个binlog_cache_size系统变量设置的缓存大小的交易。

  • binlog_transaction_dependency_tracking

    财产价值
    命令行格式--binlog-transaction-dependency-tracking=value
    介绍8.0.1
    系统变量binlog_transaction_dependency_tracking
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值COMMIT_ORDER
    有效值

    COMMIT_ORDER

    WRITESET

    WRITESET_SESSION

    源依赖信息,主用于确定哪些交易可以并行执行的奴隶的多线程应用。这个变量可以取三个值,在下面的列表描述:

    • COMMIT_ORDER:依赖信息产生于主人的提交时间戳。这是默认的。这种模式也可用于任何交易没有写集,即使这是可变的writesetWRITESET_SESSION;这也是为交易更新没有主键的表和事务更新有外键约束的表。

    • WRITESET:依赖信息是从主人的写集生成的,和任何交易写不同的元组可以并行。

    • WRITESET_SESSION:依赖信息是从主人的写集产生的,但没有两更新相同的会话可以被重新排序。

    WRITESETwriteset_session模式不提供,比那些已经返回更新的任何交易的依赖COMMIT_ORDER模式

    这个变量的值不能设置任何其他比COMMIT_ORDER如果transaction_write_set_extraction关闭。你也应该注意,价值transaction_write_set_extraction如果不能改变目前的价值binlog_transaction_dependency_trackingWRITESETwriteset_session

    排数值保持和检查已经改变给定行是由价值决定的最新交易binlog_transaction_dependency_history_size

  • binlog_transaction_dependency_history_size

    财产价值
    命令行格式--binlog-transaction-dependency-history-size=#
    介绍8.0.1
    系统变量binlog_transaction_dependency_history_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值25000
    最小值1
    最大值1000000

    集排数的哈希值,保存在内存中,用于寻找交易,最后修改给定行的上限。一旦这样的哈希值已经达到,历史被清除。

  • expire_logs_days

    财产价值
    命令行格式--expire-logs-days=#
    过时的8.0.3
    系统变量expire_logs_days
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值(>= 8.0.11)0
    默认值(>= 8.0.2, <= 8.0.4)30
    默认值(<= 8.0.1)0
    最小值0
    最大值99

    指定的二进制日志文件自动清除之前的天数。expire_logs_days是过时的,并将在未来的版本中删除。相反,使用binlog_expire_logs_seconds,在秒集的二进制日志保质期。如果你不设置为系统变量的值,默认的有效期是30天。可能清除发生在启动时的二进制日志刷新。日志冲洗时如最后,“MySQL服务器日志”

    任何非零的值,可以指定expire_logs_days如果是忽略binlog_expire_logs_seconds还规定,与价值binlog_expire_logs_seconds而不是作为二进制日志的截止日期。一个警告信息,就是在这种情况下发行。一个非零的值expire_logs_days仅仅作为二进制日志保质期如果binlog_expire_logs_seconds没有指定或指定为0

    禁用自动的二进制日志清除,指定值0明确binlog_expire_logs_seconds,而不指定值expire_logs_days。与早期版本的兼容性,自动清除也是残疾人如果你指定一个值0明确expire_logs_days不指定一个值binlog_expire_logs_seconds。在这种情况下,默认为binlog_expire_logs_seconds不适用

    删除二进制日志文件手动,使用PURGE BINARY LOGS声明。看到第13.4.1.1,“清除二进制日志语法”

  • log_bin

    财产价值
    系统变量log_bin
    范围全球
    动态
    看到的是_提示应用

    是否启用或禁用二进制日志。二进制日志功能,服务器记录所有语句更改数据的二进制日志,这是用于备份和复制。ON意味着二进制日志可用,关闭这意味着在不使用

    二进制日志是默认启用的,与log_bin在线看两个系统变量。《--log-bin选项用于对二进制日志指定一个基地的名称和位置。

    如果--skip-log-bin--disable-log-bin选项指定在启动时,二进制日志被禁用,与log_bin系统变量设置为OFF。

    在二进制日志格式和管理信息,看5.4.4节,“二进制日志”

  • log_bin_basename

    财产价值
    系统变量log_bin_basename
    范围全球
    动态
    看到的是_提示应用
    类型文件名

    持有的基名称和路径的二进制日志文件,并可以设置与--log-bin服务器的选择。在MySQL 8.0,if the——日志本不提供选项,默认的库名称binlog。对于MySQL 5.7的兼容性,如果——日志本选择不提供任何字符串或空字符串,默认的库名称host_name-bin,使用的主机名。默认位置是数据目录。

  • log_bin_index

    财产价值
    系统变量log_bin_index
    范围全球
    动态
    看到的是_提示应用
    类型文件名

    持有的基名称和路径的二进制日志索引文件,可设置与--log-bin-index服务器选项

  • log_bin_trust_function_creators

    财产价值
    命令行格式--log-bin-trust-function-creators
    系统变量log_bin_trust_function_creators
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值FALSE

    这个变量适用于二进制日志功能。它控制存储功能的创建者是否可以信任不创建存储功能,将导致不安全的事件被写入二进制日志。如果设置为0(默认),不允许用户创建或更改存储功能,除非他们有SUPER除了特权CREATE ROUTINEALTER ROUTINE特权。0的设置也执行一个函数必须声明的约束确定性特征,或与READS SQL DATA没有SQL特征。如果变量设置为1,MySQL不执行这些限制存储功能创新。这个变量也适用于触发创作。看到23.7节,“二进制日志存储程序”

  • log_bin_use_v1_row_events

    财产价值
    命令行格式--log-bin-use-v1-row-events[={0|1}]
    系统变量log_bin_use_v1_row_events
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值0

    显示是否在使用2版本的二进制日志。值1表明服务器是使用1版本写日志记录事件的二进制日志(二进制日志事件中使用以前版本的版本),从而产生一个二进制日志可以通过读老奴隶。0表明第2版二进制日志事件都在使用。

    这个变量是只读的。1版和2版的二进制事件的二进制日志切换,需要重新开始mysqld--log-bin-use-v1-row-events选项

  • log_builtin_as_identified_by_password

    财产价值
    命令行格式--log-builtin-as-identified-by-password[={OFF|ON}]
    远离的8.0.11
    系统变量log_builtin_as_identified_by_password
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值OFF

    这是8.0.11删除MySQL系统变量。

  • log_slave_updates

    财产价值
    命令行格式--log-slave-updates
    系统变量log_slave_updates
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值(>= 8.0.3)TRUE
    默认值(<= 8.0.2)FALSE

    无论是从主服务器从服务器接收更新应记录到自己的二进制日志的奴隶。二进制日志一定要为这个变量有什么影响奴隶启用。看到第17.1.6,“复制和二进制日志记录选项和变量”

    本系统变量设置为默认,并且是只读的。如果你需要防止从服务器日志更新,指定--skip-log-slave-updates当你的奴隶,或指定log_slave_updates=OFF在从配置文件中

  • log_statements_unsafe_for_binlog

    财产价值
    系统变量log_statements_unsafe_for_binlog
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值ON

    如果遇到错误1592,控制是否产生警告添加到错误日志或不。

  • master_verify_checksum

    财产价值
    系统变量master_verify_checksum
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值OFF

    使这个变量会导致主检查校验当读取二进制日志。master_verify_checksum默认是禁用的;在这种情况下,主使用二进制日志事件长度验证事件,所以只有完整的事件是从二进制日志读取。

  • max_binlog_cache_size

    财产价值
    命令行格式--max-binlog-cache-size=#
    系统变量max_binlog_cache_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值18446744073709551615
    最小值4096
    最大值18446744073709551615

    如果一个交易需要比这多个字节的内存,服务器产生一个多语句事务需要超过“max_binlog_cache_size的字节的存储误差。最小值是4096。可能的最大值是16eib(exbibytes)。建议的最大价值是4GB;这是由于MySQL目前无法使用二进制日志位置超过4GB。

    max_binlog_cache_size集只为交易的缓存大小;对于语句缓存的上限是由max_binlog_stmt_cache_size系统变量

    能见度的会议max_binlog_cache_size匹配的binlog_cache_size系统变量;换句话说,改变它的值只会影响新的会话,该值后开始改变。

  • max_binlog_size

    财产价值
    命令行格式--max-binlog-size=#
    系统变量max_binlog_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1073741824
    最小值4096
    最大值1073741824

    如果写入二进制日志导致当前日志文件的大小超过此变量的值时,服务器的二进制日志(关闭当前文件并打开下一个)。最小值是4096字节。最大值和默认值为1GB。

    一个事务是写在一块的二进制日志,因此几个二进制日志之间没有分裂。因此,如果你有大的交易,你可能会看到二进制日志文件大于max_binlog_size

    如果max_relay_log_size0,价值max_binlog_size适用于中继日志以及

  • max_binlog_stmt_cache_size

    财产价值
    命令行格式--max-binlog-stmt-cache-size=#
    系统变量max_binlog_stmt_cache_size
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值18446744073709547520
    最小值4096
    最大值18446744073709547520

    如果非事务语句在事务需要超过多少字节的内存,服务器会生成一个错误。最小值是4096。最大值和默认值32位平台上和16eb 4GB容量(字节)在64位平台。

    max_binlog_stmt_cache_size集只有语句缓存的大小;对交易缓存上限是遵守max_binlog_cache_size系统变量

  • original_commit_timestamp

    财产价值
    介绍8.0.1
    状态变量original_commit_timestamp
    范围会话
    动态
    类型数字

    通过复制内部使用。当你执行一个事务上的奴隶,这是设置的时候,交易是在原来的主人承诺,以微秒计算新纪元后的。这让原本承诺的时间戳被传播到复制拓扑。

  • sql_log_bin

    财产价值
    系统变量sql_log_bin
    范围会话
    动态
    看到的是_提示应用
    类型布尔

    这个变量可以用来交换记录到二进制日志和关闭当前会话。默认值是1(二进制日志做的)。停止或为当前会话开始的二进制日志,改变这个变量的值的会话。会话的用户必须有SYSTEM_VARIABLES_ADMINSUPER权限设置这个变量

    这是不可能的设置@@session.sql_log_bin在一个事务或子查询

    设置此变量为0防止gtids被分配到二进制日志中的事务。如果你使用的是gtids复制,这意味着即使二进制日志后再次启用,该gtids写入的日志不占在此期间发生的任何交易,所以实际上这些交易损失。

  • sync_binlog

    财产价值
    命令行格式--sync-binlog=#
    系统变量sync_binlog
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1
    最小值0
    最大值4294967295

    控制多久MySQL服务器同步二进制日志到磁盘。

    • sync_binlog=0:禁用二进制日志磁盘同步MySQL服务器。相反,MySQL服务器依赖于操作系统冲洗二进制日志磁盘时,它的任何其他文件。此设置提供了最好的性能,但在一个断电或操作系统崩溃的事件,很可能是服务器已提交的事务没有被同步到二进制日志。

    • sync_binlog=1:使二进制日志同步到磁盘之前交易的承诺。这是最安全的设置,但可以对性能的磁盘数量增加的负面影响写。在一个断电或操作系统崩溃的事件,是从二进制日志丢失的交易只有在准备好的状态。这允许自动恢复程序回滚事务,保证没有交易是从二进制日志丢失。

    • sync_binlog=N,在那里N除了0或1个值:二进制日志同步到磁盘后N二进制日志提交组已收集。在一个断电或操作系统崩溃的事件,很可能是服务器已提交的事务尚未刷新到二进制日志。这个设置会对性能产生由于磁盘数量增加的负面影响写。较高的值可以提高性能,但随着数据丢失的风险增加。

    为最大可能的耐久性和一致性的复制设置,使用InnoDB在交易中,使用这些设置:

    注意安全

    许多操作系统和磁盘硬件傻瓜刷新到磁盘操作。他们可能会告诉mysqld,冲洗已经发生,即使它没有。在这种情况下,交易的耐久性是不是推荐的设置保证,在最坏的情况下,停电可以腐败InnoDB数据在SCSI磁盘控制器或磁盘本身加快文件刷新使用电池备份磁盘高速缓存,使操作更安全。你也可以尝试禁用缓存写入磁盘的硬件高速缓存。

  • transaction_write_set_extraction

    财产价值
    命令行格式--transaction-write-set-extraction=[value]
    系统变量transaction_write_set_extraction
    范围全球会议
    动态
    看到的是_提示应用
    类型枚举
    默认值(>= 8.0.2)XXHASH64
    默认值OFF
    有效值

    OFF

    MURMUR32

    XXHASH64

    定义用于哈希写入事务期间的算法提取。如果您使用的是集团的复制,这个变量必须设置为XXHASH64由于提取写从交易过程是在所有组成员的冲突检测要求。看到第18.7.1,“组复制的要求”

    笔记

    这个变量的值不能被改变的时候binlog_transaction_dependency_tracking设置两writesetWRITESET_SESSION

17.1.6.5全局事务ID选项和变量

MySQL服务器选项和系统变量在这部分描述的是用于监测和控制全球事务标识符(gtids)。

更多信息,参见部分下面,“复制与全球事务标识符”

使用启动选项与gtid replication

以下服务器启动选项用于gtid以复制:

  • --enforce-gtid-consistency

    财产价值
    命令行格式--enforce-gtid-consistency[=value]
    系统变量enforce_gtid_consistency
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值OFF
    有效值

    OFF

    ON

    WARN

    当启用时,服务器执行gtid一致通过允许只陈述,可以安全地登录使用gtid执行。你必须设置此选项ON在启用gtid以复制。

    价值观--enforce-gtid-consistency可配置是:

    • OFF:所有的交易都不得违反gtid一致性。

    • ON:交易不允许违反gtid一致性。

    • WARN:所有的交易都不得违反gtid一致,但警告是在这种情况下产生的。

    设置--enforce-gtid-consistency没有价值的别名--enforce-gtid-consistency=ON。这种影响在变量的行为,看enforce_gtid_consistency

    只有报表,可以登录使用gtid安全声明可以登录时enforce-gtid-consistency是集打开(放),所以操作列在这里不能使用这个选项:

    --enforce-gtid-consistency只有生效如果二进制日志发生的声明。如果二进制日志服务器上禁用,或者语句不写入二进制日志,因为它们通过过滤除去,gtid一致性不检查或执行不记录报表。

    有关更多信息,参见第17.1.3.6,”与GTIDs的“复制限制

  • --executed-gtids-compression-period

    财产价值
    命令行格式--executed-gtids-compression-period=#
    过时的
    类型整数
    默认值1000
    最小值0
    最大值4294967295

    这个选项是过时的、将在未来的MySQL版本中删除。使用改名gtid_executed_compression_period控制如何gtid_executed表压缩。

  • --gtid-mode

    财产价值
    命令行格式--gtid-mode=MODE
    系统变量gtid_mode
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值OFF
    有效值

    OFF

    OFF_PERMISSIVE

    ON_PERMISSIVE

    ON

    此选项指定全局事务标识符(gtids)是用来确定交易。设置此选项--gtid-mode=ON要求enforce-gtid-consistency被设置为打开(放)。这个gtid_mode变量是动态的,使gtid通过复制配置在线。在使用此功能之前,看到第17.1.5,“改变复制模式的在线服务器”

  • --gtid-executed-compression-period

    财产价值
    命令行格式--gtid-executed-compression-period=#
    类型整数
    默认值1000
    最小值0
    最大值4294967295

    压缩mysql.gtid_executed表每次许多交易发生。0就是,这桌子不压缩。无压缩的表时发生的二进制日志启用,因此选择没有影响,除非log_bin关闭

    看到mysql.gtid_executed表压缩为更多的信息

使用系统变量与gtid replication

下面的系统变量用于gtid以复制:

  • binlog_gtid_simple_recovery

    财产价值
    命令行格式--binlog-gtid-simple-recovery
    系统变量binlog_gtid_simple_recovery
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值TRUE

    这个变量控制二进制日志文件迭代搜索gtids MySQL启动时,或重新启动时。

    什么时候binlog_gtid_simple_recovery=FALSE,迭代的二进制日志文件的方法:

    • 初始化gtid_executed,二进制日志文件进行迭代,从最新的文件,在第一个二进制日志有任何停止以前_ gtids _ _事件日志。。。。。。。从全gtidsPrevious_gtids_log_eventgtid _ _事件日志从这个二进制日志文件读取。这gtid集内部存储和调用gtids_in_binlog。价值gtid_executed计算这一套联盟和存储在该gtidsmysql.gtid_executed

      这个过程中如果你有大量的二进制日志文件没有gtid事件需要很长的时间,例如创建时gtid_mode=OFF

    • 初始化gtid_purged,二进制日志文件进行迭代,从最新的,在第一个二进制日志包含停以前_ gtids _ _事件日志这是非空(至少有一gtid)或至少有一个Gtid_log_event。从这个二进制日志读取以前_ gtids _ _事件日志。这gtid集减去gtids_in_binlog结果存储在内部变量gtids _ _ binlog _ purged _ not in。the value ofgtid_purged初始化的值gtid_executed,减gtids _ _ binlog _ purged _ not in

    什么时候binlog_gtid_simple_recovery=TRUE,这是默认的服务器,只有最古老和最新的迭代的二进制日志文件和价值gtid_purgedgtid_executed计算仅基于以前_ gtids _ _事件日志Gtid_log_event在这些文件中找到。这确保了只有两个二进制日志文件在服务器重启时迭代二进制日志被清除。

    笔记

    如果启用此选项,gtid_executedgtid_purged可以初始化错误在以下情况:

    • 最新的二进制日志是由MySQL 5.7.5以上生成的,和gtid_mode打开(放)对于一些二进制日志OFF最新的二进制日志

    • SET GTID_PURGED声明是在之前5.7.7 MySQL版本的发布,和二进制日志,当时是活跃的集gtid_purged尚未清除

    如果一个不正确的gtid集是在任何一种情况下计算的,它仍将是正确的即使服务器后重新启动,无论此选项的值。

    如果你使用的是MySQL 5.7.7或更早,发卡后SET gtid_purged声明记下当前的二进制日志文件的名称,它可以检查使用SHOW MASTER STATUS。如果重新启动服务器之前,该文件已被清除,那么你应该使用binlog_gtid_simple_recovery=FALSE为了避免gtid_purgedgtid_executed计算错误

  • enforce_gtid_consistency

    财产价值
    命令行格式--enforce-gtid-consistency[=value]
    系统变量enforce_gtid_consistency
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值OFF
    有效值

    OFF

    ON

    WARN

    根据这个变量的值,服务器执行gtid一致通过允许只陈述,可以安全地登录使用gtid执行。你必须设置这个变量ON在启用gtid以复制。

    价值观enforce_gtid_consistency可配置是:

    • OFF:所有的交易都不得违反gtid一致性。

    • ON:交易不允许违反gtid一致性。

    • WARN:所有的交易都不得违反gtid一致,但警告是在这种情况下产生的。

    enforce_gtid_consistency只有生效如果二进制日志发生的声明。如果二进制日志服务器上禁用,或者语句不写入二进制日志,因为它们通过过滤除去,gtid一致性不检查或执行不记录报表。

    在陈述,可以登录使用gtid基于复制的更多信息,参见--enforce-gtid-consistency

    MySQL 5.7中,发布系列的早期版本之前,布尔enforce_gtid_consistency拖欠关闭。保持与这些早期版本的兼容性,枚举的默认值OFF,和设置--enforce-gtid-consistency没有值被解释为设定值打开(放)。变量也具有多重文本的别名值:0=OFF=FALSE1=ON=TRUE2=WARN。这不同于其他的枚举类型但保持与以前版本的使用布尔类型的兼容性。这些变化对什么是由变量返回的影响。使用选择@ @ enforce _ gtid _ consistencySHOW VARIABLES LIKE 'ENFORCE_GTID_CONSISTENCY',和SELECT * FROM INFORMATION_SCHEMA.VARIABLES WHERE 'VARIABLE_NAME' = 'ENFORCE_GTID_CONSISTENCY',所有返回的文本形式,不是数字的形式。这是一个不兼容的改变,因为@@ENFORCE_GTID_CONSISTENCY返回值的形式返回布尔值,但在textual形式商展和信息架构

  • executed_gtids_compression_period

    财产价值
    过时的
    系统变量executed_gtids_compression_period
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1000
    最小值0
    最大值4294967295

    这个选项是过时的、将在未来的MySQL版本中删除。使用改名gtid_executed_compression_period控制如何gtid _ executed表压缩

  • gtid_executed

    财产价值
    系统变量gtid_executed
    系统变量gtid_executed
    范围全球
    范围全球会议
    动态
    动态
    看到的是_提示应用
    看到的是_提示应用
    类型字符串

    当使用全球范围,这个变量包含在服务器和gtids已由执行所有交易集的表现SETgtid_purged声明。This is the same as the value of theexecuted_gtid_set输出中的列SHOW MASTER STATUSSHOW SLAVE STATUS。这个变量的值是一个gtid集,看gtid集更多信息

    当服务器启动时,@@global.gtid_executed初始化。看到binlog_gtid_simple_recovery在二进制日志迭代填充更多的信息gtid_executed。gtids然后添加到设置为执行交易,或任何SETgtid_purged语句被执行

    交易可以在任何时间在二进制日志发现集等于GTID_SUBTRACT(@@global.gtid_executed, @@global.gtid_purged);即在尚未清除的二进制日志中的所有交易。

    发行RESET MASTER导致全球价值(而不是会话值)这一变量被重置为空字符串。gtids否则从这组比其他组清除由于时复位大师

    在一些较老的版本,这个变量也可以用于会话作用域,它包含的是写在当前会话缓存事务集的表现。现在已经不再使用的会话范围。

  • gtid_executed_compression_period

    财产价值
    系统变量gtid_executed_compression_period
    范围全球
    动态
    看到的是_提示应用
    类型整数
    默认值1000
    最小值0
    最大值4294967295

    压缩mysql.gtid_executed表每次都这样多的交易被处理。0就是,这桌子不压缩。由于没有压缩的表时使用二进制日志时,设置该变量的值没有影响,除非禁用二进制日志。

    看到mysql.gtid_executed表压缩为更多的信息

  • gtid_mode

    财产价值
    系统变量gtid_mode
    范围全球
    动态
    看到的是_提示应用
    类型枚举
    默认值OFF
    有效值

    OFF

    OFF_PERMISSIVE

    ON_PERMISSIVE

    ON

    控制是否启用基于gtid测井是什么类型的交易记录可以包含。你必须有SYSTEM_VARIABLES_ADMINSUPER权限设置这个变量enforce_gtid_consistency你可以设置前必须是真实的gtid_mode=ON。在修改这个变量,看第17.1.5,“改变复制模式的在线服务器”

    记录的事务可以匿名或使用gtids。匿名交易依靠二进制日志文件和位置来确定具体的交易。gtid交易有一个独特的标识,是指交易。不同的模式:

    • OFF:新复制的事务必须是匿名的。

    • OFF_PERMISSIVE:新的交易是匿名的。复制的事务可以匿名或gtid交易。

    • ON_PERMISSIVE:新的交易gtid交易。复制的事务可以匿名或gtid交易。

    • ON:新复制的事务必须gtid交易。

    从一个值与另一个变化,只能一步一个脚印。例如,如果gtid_mode目前将off_permissive,它是可能的变化OFFon_permissive但不ON

    价值观gtid_purgedgtid_executed无论是持久的价值gtid_mode。因此,即使改变的价值gtid_mode,这些变量包含正确的价值观。

  • gtid_next

    财产价值
    系统变量gtid_next
    范围会话
    动态
    看到的是_提示应用
    类型枚举
    默认值AUTOMATIC
    有效值

    AUTOMATIC

    ANONYMOUS

    UUID:NUMBER

    该变量用于指定是否以及如何获得下一gtid。gtid_next可以采取以下任何值:

    • AUTOMATIC:用下自动生成全局事务ID。

    • ANONYMOUS:交易没有全局标识符,并确定文件位置。

    • 全局事务IDUUIDNUMBER格式

    正是上述哪种选择都是有效取决于设置gtid_mode,看到17.1.4.1,“复制模式”更多信息。设置这个变量没有影响,如果gtid_mode关闭

    在这个变量被设置为UUIDNUMBER,和事务已提交或回滚,显集gtid_next声明必须再在任何其他声明。

    DROP TABLEDROP TEMPORARY TABLE没有明确的错误时使用相结合的非临时表或临时表,临时表和临时表使用事务性存储引擎使用非事务性存储引擎。

  • gtid_owned

    财产价值
    系统变量gtid_owned
    范围全球会议
    动态
    看到的是_提示应用
    类型字符串

    这个只读变量保存一个列表的内容取决于其范围。当使用会话范围,列表保存所有gtids是这个客户所有;当使用全球范围内,它拥有一个列表中的所有gtids连同他们的主人。

  • gtid_purged

    财产价值
    系统变量gtid_purged
    范围全球
    动态
    看到的是_提示应用
    类型字符串

    所有交易已经从二进制日志清除设置。这是交易的一个子集gtid_executed。这个变量的值是一个gtid集,看gtid集更多信息

    当服务器启动时,全球价值gtid_purged初始化为一组gtids。看到binlog_gtid_simple_recovery在二进制日志迭代填充更多的信息gtid_purged。。。。。。。发行RESET MASTER导致这一变量的值被重置为空字符串。

    有两种方式设置gtid_purged。什么时候gtid _看到是一个超集gtid_purged,和不相交gtid _ subtract(gtid _ executed - gtid _ purged)使用

    SET @@GLOBAL.GTID_PURGED = 'gtid_set'

    结果是,GTID_PURGED等于gtid _看到,和GTID_EXECUTED成为联盟gtid _看到和以前的值GTID_EXECUTED

    什么时候gtid_set不相交gtid _ executed使用

    SET @@GLOBAL.GTID_PURGED = '+gtid_set'

    结果是,gtid_set被添加到gtid _ executedgtid_purged

    如果二进制日志从MySQL 5.7.7或更早的存在,这是一个机会,gtid_purged可计算错误binlog_gtid_simple_recovery=TRUE。看到binlog_gtid_simple_recovery更多信息

  • simplified_binlog_gtid_recovery

    财产价值
    命令行格式--simplified-binlog-gtid-recovery
    过时的
    系统变量simplified_binlog_gtid_recovery
    范围全球
    动态
    看到的是_提示应用
    类型布尔
    默认值FALSE

    这个选项是过时的、将在未来的MySQL版本中删除。使用改名binlog_gtid_simple_recovery控制MySQL如何遍历二进制日志文件之后崩溃。

17.1.7常见复制管理任务

一旦复制已经开始执行而不需要太多的日常管理。本节介绍如何检查复制状态和如何暂停一个奴隶。

17.1.7.1检查复制状态

最常见的任务管理时,复制过程是保证复制发生,有奴隶和主人之间没有错误。

这个SHOW SLAVE STATUS声明,你必须在每个奴隶执行,提供了从服务器与主服务器之间的连接的配置和状态信息。从MySQL 5.7,性能架构已复制的表,以更方便的形式提供信息。看到第25.11.11,绩效模式复制表”

这个SHOW STATUS声明中还提供了一些相关的具体信息复制的奴隶。从MySQL 5.7,下列状态变量以前监测中的应用SHOW STATUS被废弃,搬到性能架构复制表:

复制的心跳信息在绩效模式复制的图表,让你检查,即使主人不发送事件到最近的复制连接是活跃的奴隶。主机发送一个心跳信号的奴隶,如果没有更新,没有未发送的事件中,二进制日志较长期间的心跳间隔。这个MASTER_HEARTBEAT_PERIOD设置在主(由CHANGE MASTER TO声明)指定的心跳的频率,默认的连接超时时间间隔半奴隶(slave_net_timeout页:1的replication_connection_status性能模式表显示最近的时候心跳信号被复制从收到多少心跳信号已收到。

如果你使用的是SHOW SLAVE STATUS语句来检查一个人的奴隶地位,声明提供以下信息:

MySQL的&#62;SHOW SLAVE STATUS\G*************************** 1。行*************************** slave_io_state:等待主人送事件master_host:Master1 master_user:根master_port:3306 connect_retry:60 master_log_file:mysql-bin.000004 read_master_log_pos:931 relay_log_file:slave1-relay-bin.000056 relay_log_pos:950 relay_master_log_file:mysql-bin.000004 slave_io_running:是的slave_sql_running:是的replicate_do_db:replicate_ignore_db:replicate_do_table:replicate_ignore_table:replicate_wild_do_table:replicate_wild_ignore_table:last_errno:0 last_error:skip_counter:0 exec_master_log_pos:931:1365:没有relay_log_space until_condition until_log_file:until_log_pos:0 master_ssl_allowed:没有master_ssl_ca_file:master_ssl_ca_path:master_ssl_cert:master_ssl_cipher:master_ssl_key:seconds_behind_master:0master_ssl_verify_server_cert:没有last_io_errno:0 last_io_error:last_sql_errno:0 last_sql_error:replicate_ignore_server_ids:0

从状态报告检查的重点领域是:

  • Slave_IO_State:奴隶的现状。看到第8.14.4,“复制从I/O线程状态”,和第8.14.5,“SLAVE端状态”为更多的信息

  • Slave_IO_Running:是I/O线程读取主人的二进制日志运行。通常情况下,你想这是如果你还没有开始复制或有明确停止它STOP SLAVE

  • Slave_SQL_Running:无论是在继电器执行事件日志的SQL线程正在运行。与I/O线程,这通常应

  • Last_IO_Errorlast_sql_error错误:最后的I / O和SQL线程在处理中继日志注册。最理想的是这些应该是空白的,表示没有错误。

  • Seconds_Behind_Master:那从SQL线程在处理主二进制日志的秒数。大量(或增加)表明奴隶无法处理及时掌握事件。

    值为0Seconds_Behind_Master通常可以被解释为意味着奴隶已经赶上了主人,但在某些情况下,这是不完全正确。例如,这可以如果主人和奴隶之间的网络连接断开但从I/O线程尚未注意到这是发生,slave_net_timeout尚未逝去

    它也有可能是瞬时值Seconds_Behind_Master可能无法准确反映情况。当从SQL线程已经赶上了I / O,seconds_behind_master显示0;但当奴隶的I/O线程仍在排队的一个新的事件,Seconds_Behind_Master可以在SQL线程执行完新的事件显示一个大的价值。这是可能的事件时有旧的时间戳;在这种情况下,如果执行SHOW SLAVE STATUS在一个相对较短的时期内几次,你可能会看到这个值的变化来回反复0个比较大的值之间。

领域提供几对从中继日志主二进制日志和处理他们的阅读活动的奴隶的进度信息:

  • Master_Log_fileread_master_log_pos):坐标系在掌握二进制日志显示多远从I/O线程读取事件日志。

  • Relay_Master_Log_Fileexec_master_log_pos):在掌握二进制日志显示多远从SQL线程执行日志接收事件的坐标。

  • Relay_Log_Filerelay_log_pos):指示多远从SQL线程执行中继日志从中继日志坐标。这与前面的坐标,但在奴隶的中继日志表示坐标而不是掌握二进制对数坐标。

上主,你可以检查连接奴隶使用状态SHOW PROCESSLIST查看正在运行的进程列表。从连接binlog转储Command场:

MySQL的&#62;SHOW PROCESSLIST \G;***************************四。行***************************编号:10用户:根主持人:slave1:58371分贝:nullcommand:binlog转储时间:777状态:已发送的所有binlog奴隶;等待binlog要更新信息:空

因为它是驱动复制过程的奴隶,很少的信息在本报告可。

奴隶开始的--report-host选择连接到主人的SHOW SLAVE HOSTS在主表显示关于奴隶的基本信息。输出包括从服务器ID,值了--report-host选项,连接端口,和主人的身份:

MySQL的&#62;SHOW SLAVE HOSTS;----------- -------- ------ ------------------- ----------- | server_id |主机|港口| rpl_recovery_rank | master_id | ----------- -------- ------ ------------------- ----------- | 10 | slave1 | 3306 | 0 | 1 | ----------- -------- ------ ------------------- ----------- 1行集(0秒)

17.1.7.2暂停在奴隶的复制

你可以停止和启动复制的奴隶使用STOP SLAVESTART SLAVE声明.

停止从掌握二进制日志处理,使用STOP SLAVE

MySQL的&#62;STOP SLAVE;

当复制停止,从I/O线程停止从掌握二进制日志写他们的中继日志阅读事件,和SQL线程停止从中继日志阅读活动和执行。你可以暂停I/O或SQL线程单独指定线程类型:

mysql> STOP SLAVE IO_THREAD;
mysql> STOP SLAVE SQL_THREAD;

重新开始执行,使用START SLAVE声明:

MySQL的&#62;START SLAVE;

启动一个特定的线程,指定线程类型:

mysql> START SLAVE IO_THREAD;
mysql> START SLAVE SQL_THREAD;

一个奴隶执行更新只有从主处理事件,除了SQL线程是有用的如果你想执行备份或其他任务。I/O线程将继续从读硕士的事件,但是他们都没有执行。这使得它更容易从追赶当你重新启动SQL线程。

除了I/O线程可以在中继日志的事件是由SQL线程到中继日志结束点执行。这可能是有用的当你想暂停执行赶上已经收到主人的事件,当你想对奴隶进行管理也确保它已经处理了所有的更新到一个特定的点。该方法也可用于暂停事件的奴隶而收到你的行为管理的主人。停止I/O线程但允许SQL线程运行有助于确保不会有大量积压的事件时要执行的复制是重新开始。

17.2 .复制执行

复制基于主服务器记录到数据库的所有更改(更新、删除等等)在其二进制日志。二进制日志作为所有事件,修改数据库的结构和内容的书面记录(数据)从那一刻开始,启动服务器。通常,SELECT陈述并非因为他们没有记录修改数据库的结构和内容。

每个从连接到主请求一份二进制日志。那就是,它把数据从主,而不是主推送数据到奴隶。奴隶也执行事件从它接收的二进制日志。这重复只是使他们在掌握原有变化的影响。创建或修改表结构,和数据的插入,删除,并根据原来的主人的变化更新。

因为每个奴隶都是独立的,不断重复的从主人的二进制日志的变化发生在每一个独立的奴隶是连接到主。此外,因为每个奴隶只接收请求它从主副本的二进制日志,奴隶能读自己的速度在更新数据库的副本,可以启动和停止复制过程不影响能力更新到最新的数据库状态或主人或从侧。

在复制的实现细节的更多信息,参见第17.2.2,“复制的实施细则》

主人和奴隶报告它们的状态,在复制过程中经常如此尊重你可以监视他们。看到8.14节,“检查线程的信息”,为所有复制相关状态的描述。

掌握二进制日志是写在从本地中继日志处理前。奴隶也记录了大师的二进制日志和本地中继日志的当前位置信息。看到第17.2.4,“复制继电器和状态日志”

数据库更改过滤对奴隶根据一组,根据不同的配置选项和变量控制活动评价的应用规则。详细介绍如何应用这些规则,看第17.2.5,“服务器如何评价复制过滤规则”

17.2.1复制格式

复制的作品因为写入二进制日志事件是从主人和奴隶进行阅读。事件记录在不同格式的二进制日志,根据事件的类型。用不同的复制格式对应的二进制日志格式时使用的事件被记录在主人的二进制日志。二进制日志格式,在复制过程中的条款之间的关系:

  • 基于二进制日志语句时,主写SQL语句的二进制日志。对主从复制作品通过执行SQL语句的奴隶。这就是所谓的基于语句的复制(可简称为SBR),对应的二进制日志格式MySQL语句。

  • 使用基于行的记录时,大师写的事件的二进制日志表明每个表行的改变。对主从复制作品抄袭事件代表变化的表行的奴隶。这就是所谓的基于行的复制(可简称为RBR

    基于行的记录是默认的方法。

  • 您也可以配置MySQL使用两者的混合语句基础和基于行的记录,这是最适当的改变被记录。这就是所谓的混合格式记录。采用混合格式记录时,声明是基于日志的默认使用。根据一定的陈述,而且存储引擎被使用,日志自动切换到基于行的特殊情况。采用混合格式复制被称为混合型复制混合格式的复制。有关更多信息,参见第5.4.4.3,“混合二进制日志格式”

当使用MIXED格式的二进制日志格式部分取决于存储引擎使用的语句被执行。在混合格式记录和控制不同的日志格式的支持规则的更多信息,参见第5.4.4.3,“混合二进制日志格式”

日志格式在运行MySQL服务器是通过设置binlog_format服务器系统变量。这个变量可以设置会话或全球范围。规则和新设置生效是相同的其他MySQL服务器的系统变量。为当前会话设置变量只持续到会议结束,和变化是不可见的其他会议。设置变量的全局需要客户端连接后的变化的影响,而不是当前的客户端会话,包括会话变量设置在哪里了。使全局系统变量设置永久性使其应用在服务器重新启动时,你必须将它设置在一个选项文件。有关更多信息,参见第13.7.5.1,”句法变量赋值”

在有些情况下,你不能在运行时或者这样做会导致复制失败改变二进制日志格式。看到第5.4.4.2,设置二进制日志格式”

你必须有SYSTEM_VARIABLES_ADMINSUPER权限设置全局或会话binlog_format价值

基于和基于行的复制格式的声明有不同的问题和局限性。因为他们的相对优势和劣势的比较,看第17.2.1.1,”优势和基础,基于行的复制”语句的缺点

与基于语句的复制,你可能会遇到的问题与复制存储过程或触发器。您可以通过使用基于行的复制来避免这些问题。有关更多信息,参见23.7节,“二进制日志存储程序”

17.2.1.1优点和缺点的基础和行basedreplication声明

每个二进制日志格式的优点和缺点。对于大多数用户来说,混合复制格式应提供数据完整性和性能的最佳组合。如果,然而,你想利用的特定功能或基于基于行的复制格式的语句在执行某些任务时,可以使用本节中的信息,它提供了自己的相对优势和劣势的总结,以确定哪些是最适合你的需要。

基于语句复制的优势
  • 成熟的技术

  • 较少的数据写入到日志文件。当更新或删除的行数的影响,这样的结果许多的日志文件需要的存储空间少。这也意味着,以及从备份恢复可以实现更迅速。

  • 日志文件包含所有报表所做的任何更改,因此可以用来审计数据库。

基于语句复制的缺点
基于行复制的优势
  • 所有的变化可以复制。这是最安全的方式复制。

    笔记

    报表中的信息更新mysql数据库等GRANTREVOKE和触发器的操作,存储程序(包括存储过程),和观点都复制到使用基于语句的复制的奴隶。

    对于这样的语句CREATE TABLE ... SELECT,一个创造语句从表定义中生成和复制使用基于语句的格式,而该行插入复制使用基于行的格式。

  • 少行锁在主的要求,从而达到更高的并发性,下列类型的语句:

  • 更少的行锁在任何需要的奴隶INSERTUPDATE,或DELETE声明

基于行复制的缺点
  • RBR可以产生更多的数据,必须登录。复制一个DML语句(如UPDATEDELETE表),通过复制只写入到二进制日志语句声明。相比之下,基于行的复制写入每个改变行到二进制日志。如果语句修改多行、基于行的复制可能会写更多的数据以二进制日志;这甚至语句回滚是真实的。这也意味着制作和还原备份可能需要更多的时间。此外,二进制日志锁定更长的时间去写数据,这可能会导致并发问题。使用binlog_row_image=minimal的缺点大大减少

  • 确定性的UDF,产生大BLOB比基于语句的复制值需要更长的时间才能与基于行的复制复制。这是因为BLOB记录的列值,而不是语句生成数据。

  • 你不能看到什么语句是从奴隶主和执行接收。然而,你可以看到哪些数据被改变使用mysqlbinlog与选择--base64-output=DECODE-ROWS--verbose

    另外,使用binlog_rows_query_log_events变量,如果启用添加rows_query用语句事件mysqlbinlog输出时-vv选择使用

  • 表格的使用MyISAM存储引擎,更强的锁需要的奴隶INSERT当应用它们作为基于行的事件到二进制日志的时候比运用其作为陈述。这意味着并发的插入MyISAM表不使用基于行的复制时的支持。

17.2.1.2使用基于行的记录和复制

MySQL采用基于语句的记录(SBL),基于行的记录(RBL)或混合格式记录。二进制日志的类型影响日志的大小和效率。因此选择基于行的复制(RBR)或基于语句的复制(SBR)取决于您的应用程序和环境。本节描述了已知问题,使用基于行的格式的日志时,描述了一些最佳实践应用于复制。

更多信息,参见17.2.1,“复制格式”,和第17.2.1.1,”优势和基础,基于行的复制”语句的缺点

  • 基于行的临时表的记录。正如在第17.4.1.31,“复制与临时表”,临时表不复制使用基于行的格式或当(从MySQL 8.0.4)混合格式。有关更多信息,参见第17.2.1.1,”优势和基础,基于行的复制”语句的缺点

    临时表是不可复制的当使用基于行的或混合的格式,因为没有必要。此外,因为临时表只能从它创建线程读,也很少有效益的复制他们,即使采用基于语句的格式。

    你可以从表为基础的基于行的二进制日志格式在运行时即使临时表已创建。然而,从MySQL 8.0.4,你不能从基于行的或混合的二进制日志的格式在运行时,报表格式转换,因为任何CREATE TEMPORARY TABLE报表将已经从以前的模式的二进制日志略。

    从MySQL 8,MySQL服务器跟踪日志记录模式是在每个临时表的创建。当一个客户端会话结束时,服务器日志DROP TEMPORARY TABLE IF EXISTS声明每个临时表仍然存在并时创建基于二进制日志语句使用。如果基于行的或混合格式的二进制日志是在创建表时,该删除临时表是否存在声明中没有记录。在MySQL 8的DROP TEMPORARY TABLE IF EXISTS语句被记录的记录模式,实际上是。

    非事务性的临时表的DML语句时允许使用binlog_format=ROW,只要任何非事务表的语句影响的临时表(bug # 14272672)。

  • RBL和非事务表同步。当许多行受到影响,变化集分为几个事件;当声明承诺,所有这些事件都写入二进制日志。当执行的奴隶,一个表锁了所有的表,然后行用于批处理模式。根据用于表的奴隶的复制引擎,这可能会或可能不会有效。

  • 潜伏期和二进制日志大小。RBL写的每一行的二进制日志等的变化,其大小可以增加很快。这会大大增加需要的奴隶,与那些在主做出改变的时间。你应该意识到这种延迟你的应用的潜力。

  • 读取二进制日志mysqlbinlog显示行中的事件使用二进制日志BINLOG声明(见第13.7.7.1”binlog语法”)。这一声明显示事件为base 64编码的字符串,其中的意义是不明显的。当调用的--base64-output=DECODE-ROWS--verbose选项,mysqlbinlog格式的二进制日志的内容是人类可读的。当二进制日志事件编写的基于行的格式,你想阅读或复制或数据库失败,你可以使用此命令来读取二进制日志的内容恢复。有关更多信息,参见第4.6.8.2,“mysqlbinlog行事件显示”

  • 二进制日志执行错误和slave_exec_mode。如果slave_exec_mode幂等,未能应用更改从RBL由于原行不能找到不触发一个错误或导致复制失败。这意味着,它可能是更新不适用于奴隶,使主人和奴隶不再同步。延迟问题和使用非事务表与RBR的时候slave_exec_mode幂等能使主人和奴隶的分歧进一步。为更多的信息关于slave_exec_mode,看到第5.1.7,服务器“系统变量”

    笔记

    slave_exec_mode=IDEMPOTENT一般只能用于循环复制或MySQL集群的多主复制,这幂等是默认值。其他情况下,设置slave_exec_mode严格通常是足够的,而且是默认值。

  • 基于服务器ID不支持过滤。你可以过滤基于服务器ID用IGNORE_SERVER_IDS选择的CHANGE MASTER TO声明。此选项与语句基础和基于行的日志格式,但使用时使用GTID_MODE=ON是集。过滤出的变化对一些奴隶,另一种方法是使用一个哪里条款,包括关系@@server_id <> id_value条款UPDATEDELETE声明.例如,WHERE @@server_id <> 1。然而,这并不是正确的工作与基于行的日志。使用server_id语句过滤系统变量,使用基于语句的日志。

  • 数据库级的复制选项的影响--replicate-do-db--replicate-ignore-db,和--replicate-rewrite-db选项有很大不同,根据是否行或基于语句基础测井应用。因此,建议避免数据库级选项,而是使用表级选项如--replicate-do-table--replicate-ignore-table。更多关于这些选项的信息和影响复制的格式对他们如何运作,看第17.1.6,“复制和二进制日志记录选项和变量”

  • 非事务表,Rb1、停的奴隶。使用基于行的记录时,如果服务器是当奴隶线程更新非事务表停了下来,从数据库可以达成一致的状态。出于这个原因,建议您使用事务性存储引擎等InnoDB所有表复制使用的格式的行。使用STOP SLAVESTOP SLAVE SQL_THREAD关闭从MySQL服务器有助于防止问题发生之前,总是推荐的日志格式或存储引擎使用。

17.2.1.3测定中的二进制日志的安全和不安全的声明

这个安全性在MySQL复制的声明是指语句及其影响是可以复制的正确使用基于语句的格式。如果这是真实的陈述,我们指的声明安全的我们的问题,否则,它不安全的

在一般情况下,如果确定是安全的和不安全的声明,如果不是。然而,某些不确定的功能认为是不安全的(见不确定性函数不被认为是不安全的,在本节稍后)。此外,使用浮点数学函数是依赖于硬件的结果总是被认为是不安全的(见表第17.4.1.12,“复制和浮点值”

安全和不安全的报表处理。一个说法是不同的声明是否是安全的治疗,而且相对于二进制日志格式(即电流值binlog_format

  • 使用基于行的记录时,没有区别,在安全和不安全的报表处理。

  • 采用混合格式记录时,声明标记为不安全登录基于格式的行;陈述视为安全登录使用的格式声明。

  • 采用基于语句的记录时,声明标记为不安全产生这种效果的警告。安全报表记录正常。

每个声明标记为不安全的生成一个警告。如果大量这样的声明是在主执行,这可能会导致过大的错误日志文件。为了防止这种情况,MySQL有警告的抑制机制。在最近的50ER_BINLOG_UNSAFE_STATEMENT警告已经产生了超过50次的有50秒的时间内,报警抑制功能。当被激活时,这导致这些警告不能写入错误日志;相反,每50个此类型的警告,注意最后的警告,重复N在最后一次S写入错误日志。这样下去只要最近50个这样的警告在50秒或更少的时间内发出;一旦率下降低于这个阈值,警告再次登录正常。警告抑制如何陈述语句的安全基础测井是确定没有影响,也没有对如何警告发送给客户。MySQL客户端仍然收到一个警告对于每一次这样的声明。

有关更多信息,参见17.2.1,“复制格式”

unsafe声明的事情考虑。具有以下特征的陈述被认为是不安全的:

更多信息,参见17.4.1节,“复制的特点和问题”

17.2.2复制实现的细节

MySQL复制功能使用三个线程执行,一对一的奴隶主服务器和两:

  • binlog转储线程。掌握创建一个线程发送二进制日志的内容到一个奴隶当奴隶的连接。该线程可以在输出的确定SHOW PROCESSLIST在主的binlog转储线

    二进制日志转储线程获得阅读每个事件被发送到奴隶对主人的二进制日志锁。当事件被读取,锁被释放,甚至在事件发送到奴隶。

  • 从I/O线程当一个START SLAVE声明是在从服务器发出的,从创建一个I/O线程,连接到主向它发送记录在其二进制日志的更新。

    从I/O线程读取更新的主人Binlog Dump线程发送(见以前的项目)并将其复制到本地文件,包括奴隶的中继日志。

    这个线程的状态显示为Slave_IO_running在输出SHOW SLAVE STATUS或为Slave_running在输出SHOW STATUS

  • 从SQL线程从创建一个SQL线程读取中继日志,写的是奴隶的I/O线程并执行其中包含的事件。

在前面的描述中,有三个线程每主/从连接。一个主人有多个奴隶创建一个二进制日志转储线程每个当前连接的奴隶,每个奴隶都有自己的I/O和SQL线程。

从使用两个线程独立阅读更新从掌握和执行成独立的任务。因此,阅读报表的任务不是放慢如果语句执行慢。例如,如果服务器没有运行一段时间,其I/O线程可以迅速从主当奴隶开始拿所有的二进制日志的内容,即使SQL线程远远落后。如果在SQL线程执行的所有取出的陈述从停止,I/O线程至少有了一切,一个安全的报表副本存储在本地的奴隶的中继日志,准备执行下一次奴隶开始。

这个SHOW PROCESSLIST声明中提供的信息,告诉你什么是主人和奴隶的发生对于复制。在主状态的信息,参见部分8.14.3,“复制主线程状态”。奴隶的状态,看第8.14.4,“复制从I/O线程状态”,和第8.14.5,“SLAVE端状态”

下面的示例说明如何三线显示在输出SHOW PROCESSLIST

在主服务器上,输出SHOW PROCESSLIST看起来像这样:

MySQL的&#62;SHOW PROCESSLIST\G*************************** 1。行***************************编号:2用户:根主持人:本地:32931分贝:nullcommand:binlog转储时间:94状态:已发送的所有binlog奴隶;等待binlog要更新信息:空

在这里,2是一个线程Binlog Dump复制线程服务连接的奴隶。这个状态资料表明,所有未更新已发送到奴隶和主人等待更多更新的发生。如果你没有看到Binlog Dump在主服务器的线程,这意味着复制不运行;即,没有奴隶当前连接。

在从服务器的输出SHOW PROCESSLIST看起来像这样:

MySQL的&#62;SHOW PROCESSLIST\G*************************** 1。行***************************编号:10用户:系统用户主机:数据库:nullcommand:连接时间:11状态:等待主人发送事件信息:空*************************** 2。行***************************编号:11用户:系统用户主机:数据库:nullcommand:连接时间:11状态:已阅读所有中继日志;等待Slave I/O线程更新信息:空

这个State资料表明,线程10是I/O线程与主服务器通信,线程11是SQL线程处理更新存储在中继日志。当时,SHOW PROCESSLIST运行时,两个线程空闲,等待进一步的更新。

在价值Time列可以显示后期奴隶与主人。看到第a.13,MySQL 8常见问题:复制”。如果有足够的时间在主侧不活动的Binlog Dump线程,主决定奴隶不再连接。至于其他的客户端连接,这取决于的超时值net_write_timeoutnet_retry_count;关于这些的更多信息,参见第5.1.7,服务器“系统变量”

这个SHOW SLAVE STATUS声明提供了额外的信息从服务器复制加工。看到第17.1.7.1,“检查复制状态”

17.2.3复制通道

复制通道代表交易从主到奴隶的流动路径。本节介绍了如何的通道可用于复制拓扑,并影响他们对单源复制。

提供与早期版本兼容,MySQL服务器可以自动启动一个名为空字符串默认频道("")。这个频道总是存在;它不能被创造或毁灭的用户。如果没有其他渠道(有空的名字)已经建立,复制语句作用于默认通道,以便从旧的奴隶全部复制报表预期的功能(见第17.2.3.2,“兼容以前的复制报表”。将复制的通道作为本部分描述的语句只能用于当至少有一个叫道。

复制通道包括从主传送到奴隶交易的路径。在多源复制奴隶打开多个通道,每一个主人,每个通道有自己的中继日志和应用(SQL)螺纹。一次交易都是通过复制通道的接收器接收(I / O)的线程,将它们添加到通道的中继日志文件并通过施放器的螺纹。这使渠道功能独立。

复制通道也与主机名称和端口相关联的。您可以指定多个渠道的主机名和端口相同的组合。在MySQL 8中,这可以被添加到一个多源复制拓扑的一个从通道的最大数是256。每个复制通道必须有一个唯一的(非空)的名字(见第17.2.3.4,“复制通道命名约定”)。通道可独立配置

17.2.3.1命令操作一个单一的通道

使MySQL复制操作作用于个体复制通道,使用FOR CHANNEL channel下列复制声明条款:

同样的,额外的channel参数介绍如下功能:

下面的语句是不允许的group_replication_recovery频道

17.2.3.2兼容以前的复制语句

当斯拉夫人复制的时候有多个频道和一个FOR CHANNEL channel选项,一个有效的语句一般作用在所有可用的频道。

例如,下面的语句表现不如预期:

警告

使用RESET SLAVE注意这个语句删除所有现有的渠道,净化他们的中继日志文件,并重新创建只有默认的通道。

一些复制语句不能在所有的渠道运作。在这种情况下,错误1964年在奴隶存在多个渠道。请提供通道的名称作为参数。生成。下面的语句和函数生成此错误时所使用的复制拓扑和多源FOR CHANNEL channel选项不能用于指定行为的通道:

注意,默认频道总是存在于一个单一的复制拓扑的源,在语句和函数在MySQL的以前版本的行为。

17.2.3.3启动选项,复制通道

本节介绍的复制增加渠道影响启动选项。

下面的启动选项必须正确配置使用多源复制。

下面的启动选项现在影响全部在复制拓扑中的通道

设置以下选项将每个通道的值;因为这些mysqld启动选项,它们被应用在每一个通道。

  • --max-relay-log-size=size

    每个通道的单独的中继日志文件的最大大小;达到此限制后,文件旋转。

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

    为所有中继日志组合总规模上限,每个通道。为N渠道,这些日志的大小是有限的relay_log_space_limit * N

  • --slave-parallel-workers=value

    从平行的工人每通道数。

  • --slave-checkpoint-group

    等待的时间由一个I/O线程为每个源。

  • --relay-log-index=filename

    每个通道的中继日志索引文件的基名称。看到第17.2.3.4,“复制通道命名约定”

  • --relay-log=filename

    是指每个通道的中继日志文件的基名称。看到第17.2.3.4,“复制通道命名约定”

  • --slave_net-timeout=N

    这个值设置每个通道,使每个通道等待N秒检查断开的连接

  • --slave-skip-counter=N

    这个值设置每个通道,使每个通道跳过N从主事件

17.2.3.4复制通道的命名约定

本节介绍了如何命名惯例的复制通道的影响。

每个复制的通道都有一个唯一的名称,是一个64个字符的最大长度的字符串是不区分大小写。由于信道的名称用在奴隶的表,用于这些字符集是gb3212。虽然你通常免费频道使用任何名称,以下名称保留:

  • group_replication_applier

  • group_replication_recovery

你选择复制通道的名称也影响由多源复制从使用的文件名。每个通道的中继日志文件和索引文件的命名relay_log_basename-channel.xxxxxx,在那里relay_log_basename是一座名指定使用--relay-log选项,并channel是通道记录到该文件的名称。如果你不指定--relay-log选项,默认的文件名是用,还包括频道的名称。

17.2.4复制继电器状态日志

在复制过程中,从服务器创建几个日志保存二进制日志事件向主人的奴隶,并记录信息的现状和位置在中继日志。有三种类型的过程中使用日志,列在这里:

  • 这个中继日志由主人的二进制日志读写的事件,从I/O线程。在中继日志事件执行的奴隶为SQL线程的一部分。

  • 这个掌握信息日志包含奴隶的连接到主状态和当前配置信息。此日志保存在主域名,信息的登录凭据,和坐标显示多远的奴隶从主人的二进制日志读取。船长日志写入mysql.slave_master_info

  • 这个中继日志信息的日志保存状态信息的执行点在奴隶的中继日志。中继日志写入mysql.slave_relay_log_info

在MySQL 8,发出警告的时候mysqld无法初始化复制日志表,但奴隶是允许继续出发。这种情况是最有可能发生时,从一个版本升级MySQL不支持从登录表,在他们的支持。

在MySQL 8中,任何需要写在一个或两个锁语句执行slave_master_infoslave_relay_log_info表是不允许而复制是持续的,而只能读语句允许在任何时间。

重要

不要试图更新或插入行slave_master_infoslave_relay_log_info表手动。这样做会导致未定义的行为,而不支持。

制作复制弹性意外停止。这个mysql.slave_master_infomysql.slave_relay_log_info表使用的是事务性存储引擎创建的InnoDB,使他们抵御意外停止。这个--relay-log-recovery选项必须启用从属保证弹性。详情见第17.3.2,“处理复制奴隶意外停止”

17.2.4.1从中继日志

中继日志,如二进制日志,包括一套编号包含描述数据库更改事件的文件,和一个索引文件包含所有用于中继日志文件的名称。中继日志文件的默认位置是数据目录。

术语中继日志文件一般是指个人编号包含数据库文件事件。术语中继日志集体表示编号的中继日志文件的设置加上索引文件。

中继日志文件有相同格式的二进制日志文件,可以读取使用mysqlbinlog(见4.6.8“,”mysqlbinlog用于处理二进制日志文件实用程序”

对于默认复制通道,中继日志文件名称默认形式host_name-relay-bin.nnnnnn,在那里host_name是从服务器主机名和nnnnnn是一个序列号。连续中继日志文件使用连续的序列号创建,开始00000 1。对于非默认复制通道,默认的库名称host_name-relay-bin-channel,在那里channel是记录在中继日志复制通道的名称。

从使用一个索引文件来跟踪中继日志文件正在使用。默认的中继日志索引文件名host_name-relay-bin.index对于默认信道,和host_name中继站—channel指数对于非默认复制通道

默认的中继日志文件和日志文件的名称和位置继电器指标可以被重写,分别的--relay-log--relay-log-index服务器选项(见第17.1.6,“复制和二进制日志记录选项和变量”

如果一个奴隶使用基于中继日志文件名称默认主机,复制后已设置改变奴隶的主机名称可能会导致复制失败与错误未能打开中继日志无法初始化期间找到目标中继日志日志。这是一个已知的问题(见虫# 2122)。如果你预期一个奴隶的主人的名字可能在未来改变(例如,如果网络是奴隶,其主机名可以修改使用DHCP设置),就可以避免这个问题完全利用--relay-log--relay-log-index选项指定中继日志文件名称明确当你初始建立的奴隶。这将使名独立服务器主机名称的变化。

如果你遇到问题后复制已经开始,围绕它的工作一方面是阻止从服务器,在旧的中继日志索引文件的内容到一个新的,然后重新启动的奴隶。在UNIX系统中,这可以通过如下所示:

shell> cat new_relay_log_name.index >> old_relay_log_name.index
shell> mv old_relay_log_name.index new_relay_log_name.index

一个从服务器,创建一个新的中继日志文件在下列条件下:

SQL线程自动删除每个中继日志文件后,执行文件中的所有事件和不再需要它。有删除中继日志因为SQL线程负责这样做没有明确的机制。然而,FLUSH LOGS旋转中继日志,从而影响当SQL线程删除它们。

17.2.4.2奴隶状态日志

复制从服务器创建日志的形式在两个奴隶的身份InnoDB表中的MySQL数据库:主日志slave_master_info,和中继日志信息的日志slave_relay_log_info

两个奴隶状态日志中包含这样的输出显示信息SHOW SLAVE STATUS声明,这是讨论第13.4.2,“SQL语句用于控制从服务器”。奴隶状态日志生存从属服务器的关闭。下一次从启动时,它读取两个日志来确定如何目前已进行读取二进制日志从掌握和处理自己的中继日志。

船长日志表应该受到保护,因为它包含用于连接到主密码。看到第6.1.2.3,“密码登录”

在MySQL 8,创造奴隶状态日志表,有必要指定的选项--master-info-repository=TABLE--relay-log-info-repository=TABLE在服务器启动。否则,日志创建的文件在数据目录master.inforelay-log.info,或其他指定的名称和位置--master-info-file--relay-log-info-file选项从MySQL 8,建立奴隶状态日志表是默认的,并创造了奴隶状态日志文件已过时。有关更多信息,参见第17.1.6,“复制和二进制日志记录选项和变量”

这个mysql.slave_master_infomysql.slave_relay_log_info表使用的是事务性存储引擎创建的InnoDB,使他们抵御意外停止。这个--relay-log-recovery选项必须启用从属保证弹性。详情见第17.3.2,“处理复制奴隶意外停止”

一个额外的奴隶状态日志主要是内部使用的创建,并持有状态信息工作者线程在多线程复制的奴隶。这个奴隶工人日志包括每个工作者线程中继日志文件和二进制日志文件的名称和主阵地。如果从中继日志信息的日志创建一个表,这是默认的,奴隶工人日志写入mysql.slave_worker_info表如果中继日志信息的日志写入一个文件,从工作日志写入worker-relay-log.info文件外用,工作线程的状态信息是在性能模式表replication_applier_status_by_worker

从I/O线程更新主日志。下表显示了在柱间的对应关系mysql.slave_master_info表,显示的列SHOW SLAVE STATUS在废弃的线,master.info文件

slave_master_info表列SHOW SLAVE STATUS专栏master.info文件行描述
Number_of_lines表中的列数(或线文件)
Master_log_nameMaster_Log_File大师的二进制日志目前正在从主读名字
Master_log_posRead_Master_Log_Pos在掌握二进制日志已经从掌握当前阅读位置
HostMaster_Host主人的主机名
User_nameMaster_User连接到主机使用的用户名
User_password(不显示的密码SHOW SLAVE STATUS该密码用于连接到主
PortMaster_Port使用的网络端口连接到主
Connect_retryConnect_Retry时间(秒),奴隶将在试图重新连接到主等
Enabled_sslMaster_SSL_Allowed指示服务器是否支持SSL连接
Ssl_caMaster_SSL_CA_File使用证书颁发机构的证书文件(CA)
Ssl_capathMaster_SSL_CA_Path十一为证书颁发机构(CA)证书路径
Ssl_certMaster_SSL_Cert十二SSL证书的文件的名称
Ssl_cipherMaster_SSL_Cipher十三可能的密码用于握手为SSL连接列表
Ssl_keyMaster_SSL_Key十四的SSL密钥文件的名称
Ssl_verify_server_certMaster_SSL_Verify_Server_Cert十五是否验证服务器证书
Heartbeat十六心跳间隔之间的复制,在秒
BindMaster_Bind十七为奴隶的网络接口,可用于连接到主
Ignored_server_idsReplicate_Ignore_Server_Ids十八服务器ID被忽略列表。注意:Ignored_server_ids服务器ID列表之前,服务器ID总数的忽视。
UuidMaster_UUID十九主人的唯一ID
Retry_countMaster_Retry_Count二十重尝试允许最大数量
Ssl_crl二十一一个SSL证书吊销列表文件路径
Ssl_crl_path二十二一个目录包含SSL证书吊销列表文件路径
Enabled_auto_positionAuto_position二十三如果在使用或不autopositioning
Channel_nameChannel_name二十四的复制通道的名称
Tls_VersionMaster_TLS_Version二十五TLS是主版本
Master_public_key_pathMaster_public_key_path二十六RSA name of public key文件
Get_master_public_keyGet_master_public_key二十七从硕士的角度出发

从SQL线程更新中继日志信息的日志。下表显示了在柱间的对应关系mysql.slave_relay_log_info表,显示的列SHOW SLAVE STATUS在废弃的线,relay-log.info文件

slave_relay_log_info表列SHOW SLAVE STATUS专栏线relay-log.info文件描述
Number_of_lines文件中的表中的列数或行
Relay_log_nameRelay_Log_File目前的中继日志文件的名称
Relay_log_posRelay_Log_Pos在中继日志文件的当前位置;事件到这个位置已经从数据库中执行
Master_log_nameRelay_Master_Log_File主人的名字二进制日志文件,在中继日志文件的事件进行阅读
Master_log_posExec_Master_Log_Pos在主人的二进制日志文件,已被处死的事件相当的位置
Sql_delaySQL_Delay那个奴隶主必须延迟秒数
Number_of_workers执行复制事件从施放的线程数(交易)平行
IdID用于内部目的;目前这始终是1
Channel_namechannel_name的复制通道的名称

当你备份复制奴隶的数据,确保你的备份mysql.slave_master_infomysql.slave_relay_log_info含奴隶状态日志表,因为他们需要你恢复数据从奴隶之后继续复制。如果你失去了你的中继日志文件,但仍有中继日志信息的日志,你可以检查一下以确定多远SQL线程在执行主人的二进制日志。然后,您可以使用CHANGE MASTER TOmaster_log_fileMASTER_LOG_POS选项告诉奴隶重新从那点读取二进制日志。当然,这需要二进制日志还存在主。

17.2.5服务器如何评价复制过滤规则

如果主服务器不写声明其二进制日志,声明是不可复制的。如果服务端日志声明,声明被发送到所有的奴隶和奴隶决定是否执行它或忽略它。

上主,你可以控制哪些数据库日志的变化用--binlog-do-db--binlog-ignore-db选项来控制二进制日志。一个描述的规则,在评估这些选项使用服务器,看第17.2.5.1,“数据库级的复制和二进制日志记录选项”的评价。你不应该使用这些选项来控制数据库和表的复制。相反,使用滤波对奴隶的控制,从执行的事件。

在奴隶的一面,关于是否执行或忽略从主接收报表是根据所做的决定--replicate-*那个奴隶开始选项。(见第17.1.6,“复制和二进制日志记录选项和变量”。)过滤器由这些选项也可以设置动态使用CHANGE REPLICATION FILTER声明。无论是在启动时使用了这种滤波器的控制规则是一样的-复制…选项或从服务器运行的CHANGE REPLICATION FILTER。注意:复制器不能用于组复制特定的渠道在MySQL服务器实例配置为组复制,因为有些服务器过滤交易将使集团无法达成一致的状态协议。

在最简单的情况下,当没有--replicate-*选项,从执行的所有语句,它接收从主。否则,其结果取决于特定的选项。

数据库级选项(--replicate-do-db--replicate-ignore-db第一次看到)检查;第17.2.5.1,“数据库级的复制和二进制日志记录选项”的评价为了描述这个过程。如果不使用数据库级选项,选项进行任何检查表级别的选项,可以使用(见第17.2.5.2,“评价表级复制选项”,对它们的讨论)。如果一个或多个数据库级选项使用但没有匹配的声明是不可复制的。

影响数据库只陈述(即,CREATE DATABASEDROP DATABASE,和ALTER DATABASE),数据库级选项总是优先于任何--replicate-wild-do-table选项换句话说,这样的陈述,--replicate-wild-do-table选项如果没有数据库级选项,将检查。

为了使它更容易确定一个选项设置会有什么效果,建议你避免混合忽略黄金和nonwildcard侥幸卡选项,选项。

如果任何--replicate-rewrite-db指定的选项,它们的应用前-复制…过滤规则进行测试

笔记

所有复制的过滤选项遵循情况的敏感性,适用于数据库和MySQL服务器的其他表名称相同的规则,包括的影响lower_case_table_names系统变量

17.2.5.1评价数据库级的复制和二进制日志记录选项

当评估复制选项,从开始检查,看看是否有任何--replicate-do-db--replicate-ignore-db选择适用的。当使用--binlog-do-db--binlog-ignore-db,这个过程是相似的,但选择在主检查。

数据库,检查比赛取决于语句,正在处理的二进制日志格式。如果语句被记录使用的行格式,数据库里的数据是改变的是数据库,检查。如果语句被记录使用的报表格式,默认的数据库(指定一个USE声明)是数据库,检查。

笔记

只有DML语句可以登录使用行格式。DDL语句总是记录报表,即使binlog_format=ROW。所有的DDL语句,因此总是过滤根据基于语句的复制规则。这意味着你必须选择明确一个默认的数据库USE对于DDL语句用于顺序语句。

为复制,步骤如下:

  1. 日志格式的使用?

    • 声明默认的数据库测试

    • 受变更影响的数据库测试。

  2. 有什么--replicate-do-db选择?

    • 数据库是否匹配吗?

      • 继续前进

      • 忽视更新和退出

    • 继续前进

  3. 有什么--replicate-ignore-db选择?

    • 数据库是否匹配吗?

      • 忽视更新和退出

      • 继续前进

    • 继续前进

  4. 继续检查表级复制选项,如果有任何。为说明这些选项进行检查,看第17.2.5.2,“评价表级复制选项”

    重要

    声明还允许在这个阶段还没有真正执行。声明是直到所有表级别选项执行(如果有的话)也进行了检查,并对过程结果的语句执行许可证。

二进制日志,所涉及的步骤如下:

  1. 有什么--binlog-do-db--binlog-ignore-db选择?

    • continue to 2步。

    • 日志声明退出

  2. 有一个默认的数据库(有数据库的选择USE)?

    • 继续前进

    • 忽略声明退出

  3. 有一个默认的数据库。有什么--binlog-do-db选择?

    • 做任何匹配的数据库?

      • 日志声明退出

      • 忽略声明退出

    • 继续前进

  4. 做任何的--binlog-ignore-db选项匹配的数据库?

    • 忽略声明退出

    • 日志声明退出

重要

对于基于语句的日志,一个例外是在规则只是给CREATE DATABASEALTER DATABASE,和DROP DATABASE声明.在这种情况下,数据库创建,修改,或删除替换默认的数据库在决定是否要更新日志或忽略。

--binlog-do-db有时意味着忽略其他数据库。例如,使用基于语句的记录时,只运行一个服务器--binlog-do-db=sales不写入二进制日志报表的默认数据库的区别特价。使用基于行的同一选项登录时,服务器只记录那些更改数据sales

17.2.5.2评价表级复制选项

从检查和评估表选项仅当以下两个条件是真的:

首先,作为一个初步的条件,从检查是否启用基于语句的复制。如果是这样的话,并声明在存储功能,从执行语句和退出。如果基于行的复制启用,奴隶不知道是否声明发生在存储功能上的主人,所以这种情况不适用。

笔记

对于基于语句的复制,复制事件表示语句(所有的变化做了一个特定的事件,都与一个单一的SQL语句相关的);基于行的复制,每一个事件是在一个单一的表行的变化(因此一个语句如UPDATE mytable SET mycol = 1可能会产生很多的基于行的事件)。从事件看,查表选择的过程是相同的两个基于行的和基于语句的复制。

在达到这一点,如果没有表的选择,从简单地执行所有的事件。如果有任何--replicate-do-table--replicate-wild-do-table选项,事件必须匹配一个要执行的;否则,它被忽略。如果有任何--replicate-ignore-table--replicate-wild-ignore-table选项,所有的事件都执行除了匹配任何这些选项。

以下步骤详细描述这一评价。出发点是数据库级选项评估结束,如第17.2.5.1,“数据库级的复制和二进制日志记录选项”的评价

  1. 有表的复制选项?

    • continue to 2步。

    • 执行更新和退出

  2. 日志格式的使用?

    • 声明进行其余步骤每个语句执行更新。

    • 进行其余步骤每更新一个表的行。

  3. 有什么--replicate-do-table选择?

    • 不表匹配吗?

      • 执行更新和退出

      • 继续前进

    • 继续前进

  4. 有什么--replicate-ignore-table选择?

    • 不表匹配吗?

      • 忽视更新和退出

      • 继续前进

    • 继续前进

  5. 有什么--replicate-wild-do-table选择?

    • 不表匹配吗?

      • 执行更新和退出

      • 继续下去

    • 继续下去

  6. 有什么--replicate-wild-ignore-table选择?

    • 不表匹配吗?

      • 忽视更新和退出

      • 继续前进

    • 继续前进

  7. 还有另一个表进行测试?

    • 回到步骤3

    • 继续前进

  8. 有什么--replicate-do-table--replicate-wild-do-table选择?

    • 忽视更新和退出

    • 执行更新和退出

笔记

基于复制停止,如果一个SQL语句运行在一个表中包含的声明--replicate-do-table--replicate-wild-do-table选择,另一个表,忽视了--replicate-ignore-table--replicate-wild-ignore-table选项奴隶必须执行或忽略完整的语句(形成一个复制事件),它无法从逻辑上做这个。这也适用于基于行的DDL语句复制,因为DDL语句总是登录的陈述,不考虑日志格式的影响。语句可以更新一个包括和忽略的表仍然是复制成功是一个DML语句,已登录的唯一类型binlog_format=ROW

17.2.5.3复制规则的应用

本节提供了额外的解释和对复制的过滤选项的不同组合使用的例子。

复制过滤规则类型的一些典型的组合如下表:

空调(类型(期权)结果
--replicate-*在所有的选项:从执行它从主服务器接收所有事件。
--replicate-*-db选项,但没有表选项:从接受或忽略事件使用的数据库选项。它执行所有的事件通过这些选项允许因为没有表的限制。
--replicate-*-table选项,但是没有数据库选项:所有的事件都接受了在数据库检查阶段由于没有数据库的条件。从执行或忽略了完全基于表的选择事件。
结合数据库和表的选择:从接受或忽略事件使用的数据库选项。然后评估所有事件允许的选项根据表选项。这有时会导致的结果,似乎有悖常理,这可能会有所不同取决于你是否正在使用或基于基于行的复制语句;看到的文本为例。

一个更复杂的例子:在我们研究的结果为基础,基于行的设置表。

假设我们有两个表mytbl1在数据库DB1mytbl2在数据库db2在主人和奴隶与下列选项运行(并没有其他复制过滤选项):

replicate-ignore-db = db1
replicate-do-table  = db2.tbl2

现在我们执行以下的语句:

USE db1;
INSERT INTO db2.tbl2 VALUES (1);

在奴隶的结果有很大的不同取决于二进制日志格式,可以在任何情况下,最初的期望不匹配。

基于语句的复制这个USE语句DB1是默认的数据库。因此,--replicate-ignore-db选择匹配,INSERT语句被忽略。表选项未被选中的

基于行的复制默认的数据库对下位机读取数据库选项时使用基于行的复制无影响。因此,该USE声明没有区别了--replicate-ignore-db选择处理:数据库指定这个选项不匹配数据库中INSERT声明的变化数据,所以奴隶进行查表选择。指定的表--replicate-do-table匹配表进行更新,和行插入

17.2.5.4复制通道滤波器

本节说明如何与复制过滤器时多复制通道的存在,例如在多源复制拓扑。在MySQL 8,复制过滤器-过滤器适用于全球所有复制通道。从MySQL 8,复制过滤器可以全球或特定渠道,使你与复制过滤特定复制通道配置多源复制的奴隶。通道特定复制过滤器特别适用于多源复制拓扑时相同的数据库或表是目前在多个主人,和奴隶只需要复制它从一个主人。

更多的背景信息,看第17.1.4,MySQL多源复制”第17.2.3,“复制通道”

重要

在MySQL服务器实例配置组的复制,复制通道特定过滤器可用于复制的通道没有直接参与组的复制,如其中一组成员也作为一个奴隶主,是一个复制组外。他们不能用对group_replication_appliergroup_replication_recovery频道过滤这些渠道将使集团无法达成一致的状态协议。

复制过滤器和管道概况

当多个复制通道的存在,例如在多源复制拓扑,复制方法如下:

  • 任何全球复制筛选器指定添加到过滤式过滤器(全球复制do_dbdo_ignore_table,等等)

  • 任何特定渠道复制滤镜增加过滤器指定通道的复制指定的过滤式过滤器。

  • 每个从复制通道副本复制的通道滤波器全球特定复制过滤器如果这类没有特定渠道复制过滤器配置。

  • 每个通道使用其特定渠道复制滤镜复制流。

语法创建通道特异性复制过滤器扩展现有的SQL语句和命令选项。当复制通道不指定全球复制筛选配置为保证向后兼容性。这个CHANGE REPLICATION FILTER声明支持通道配置信道滤波器在线具体条款。这个--replicate-*命令选项来配置过滤器,可以使用的形式指定复制通道——复制—filter_type=channel_namefilter_details。例如,假设信道channel_1channel_2服务器开始之前就存在,从命令行选项的奴隶--replicate-do-db=db1--replicate-do-db=channel_1:db2--replicate-do-db=db3--replicate-ignore-db=db4--replicate-ignore-db=channel_2:db5会导致:

  • 全球复制过滤器: do_db=db1,db3, ignore_db=db4

  • 通道特定的过滤器channel_1: do_db=db2 ignore_db=db4

  • 通道特定的过滤器channel_2: do_db=db1,db3 ignore_db=db5

监控这样的设置复制过滤器使用replication_applier_global_filtersreplication_applier_filters

在启动配置信道特定复制过滤器

复制器相关的命令选项可以接受一个可选的channel接下来是一个冒号,然后通过过滤器规格。第一个冒号被解释为一个分离器,随后被解释为文本冒号冒号。下面的命令选项支持通道特异性复制过滤器使用这个格式:

  • --replicate-do-db=channel:database_id

  • --replicate-ignore-db=channel:database_id

  • --replicate-do-table=channel:table_id

  • --replicate-ignore-table=channel:table_id

  • --replicate-rewrite-db=channel:db1-db2

  • --replicate-wild-do-table=channel:table regexid

  • --replicate-wild-ignore-table=channel:table regexid

如果你用冒号而不指定channel为筛选选项,例如--replicate-do-db=:database_id,选择配置为默认复制通道复制器。默认的复制通道复制通道的存在一旦复制已经开始,而不同于多源复制通道,你手动创建。如果结肠或channel指定的选项设置全局复制的过滤器,例如--replicate-do-db=database_id设置全局--replicate-do-db滤波器

如果配置多个rewrite-db=from_name->to_name与相同的选项from_name数据库,所有滤波器加在一起(投入rewrite_do列表)和第一个生效

改变频道的特定复制过滤器在线

除了对--replicate-*选项,复制过滤器可以配置使用CHANGE REPLICATION FILTER声明。这消除了需要重新启动服务器,但是从应用线程必须在更改停。做出这一声明过滤器适用于特定信道,使用通道channel的条款。例如:

CHANGE REPLICATION FILTER REPLICATE_DO_DB=(db1) FOR CHANNEL channel_1;

当一个FOR CHANNEL设置条款,对指定通道的复制过滤器声明的行为。如果多个过滤器类型(do_dbdo_ignore_tablewild_do_table,等等)是指定的,只有指定的过滤器类型是由语句替换。在一个多通道的复制拓扑,例如在多源复制的奴隶,当没有FOR CHANNEL设置条款,声明对全球复制过滤器和所有通道复制过滤器,使用类似的逻辑为通道案例更多信息见第13.4.2.2,“改变复制筛选器语法”

除特定渠道复制过滤器

当通道特异性复制过滤器被配置,你可以通过发布一个空滤式语句删除过滤器。例如,删除所有REPLICATE_REWRITE_DB从复制通道命名过滤器channel_1问题

CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB=() FOR CHANNEL channel_1;

任何REPLICATE_REWRITE_DB过滤器以前配置的,可以使用的命令选项或CHANGE REPLICATION FILTER,删除

这个RESET SLAVE ALL语句删除信道特定复制过滤器,设置由语句删除通道。当删除通道或通道的重现,对奴隶的指定任何全球复制过滤器复制他们,没有特定渠道复制过滤器的应用。

17.3复制解决办法

复制可以用在许多不同的环境中有着广泛的用途。本节提供的一般说明和使用特定类型的复制解决方案建议。

基于复制的备份环境信息,包括安装,注意备份程序和文件备份,看第17.3.1,使用复制备份”

在使用不同的存储引擎在主人和奴隶的建议和提示,看本节,“使用复制不同的主从存储引擎”

使用复制作为一个扩展的解决方案需要和使用解决方案的应用程序运行的逻辑的一些变化。看到第17.3.5,使用复制的规模”

性能和数据分布的原因,你可能要重复不同的数据库,不同的复制的奴隶。看到第17.3.6“复制不同的数据库,不同的奴隶”

作为复制的奴隶数量的增加,对掌握负荷增加,导致性能降低(因为需要复制二进制日志,每个奴隶)。技巧提高你的复制性能,包括使用一个辅助服务器的复制,看第17.3.7,“提高复制性能”

指导交换的主人,或转换成一个奴隶主人为急救故障转移解决方案的一部分,看第17.3.8,“转换大师在故障转移期间”

你复制的安全通信,你可以加密通信信道。一步一步的指示,看第17.3.9,“设置复制使用加密连接”

17.3.1使用复制备份

使用复制作为备份的解决方案,从主奴复制数据,然后将数据备份的奴隶。奴隶可以暂停和关闭,不影响主机运行,所以你可以产生一个有效的快照直播数据,否则将需要掌握被关闭。

你如何备份数据库取决于它的大小和是否备份数据,或数据和复制的奴隶状态,你就可以重建失败的事件的奴隶。因此有两个选择:

另一个备份策略,可用于主从服务器,把服务器的只读状态。备份是针对只读服务器执行,然后变回正常的读/写操作状态。看到第17.3.1.3,“备份主机或从机通过只读”

17.3.1.1备份一个奴隶使用mysqldump

使用mysqldump创建一个数据库副本可以捕获所有在一个格式,使信息可以导入到MySQL服务器的另一个实例数据库中的数据(见4.5.4“,”mysqldump一个数据库的备份计划”)。由于信息的格式是SQL语句,该文件可以很容易地分发和应用的事件,你需要在一个急救数据服务器的运行。然而,如果你的数据集的大小是非常大的,mysqldump可能是不切实际的

当使用mysqldump,你应该停止对从复制开始前的转储流程确保转储包含一组一致的数据:

  1. 停止从加工要求。你可以完全停止复制使用的奴隶mysqladmin

    shell> mysqladmin stop-slave

    或者,你可以停下来只从SQL线程暂停活动执行:

    shell> mysql -e 'STOP SLAVE SQL_THREAD;'

    这使奴隶继续接收数据更改事件从主人的二进制日志存放在中继日志使用I/O线程,但防止奴隶执行这些事件和变化的数据。在忙碌的复制环境,允许I/O线程运行备份时可以加快追赶的过程当你重新启动SQL线程的奴隶。

  2. 运行mysqldump把你的数据库。你可以把数据库或数据库被选择。例如,把所有的数据库:

    shell> mysqldump --all-databases > fulldb.dump
  3. 当垃圾已经完成,开始从业务:

    shell> mysqladmin start-slave

在前面的示例中,您可能要添加的登录凭据(用户名、密码)的命令,把过程分为一个脚本,可以自动运行的每一天。

如果你用这种方法,确保你的监控从复制过程确保了运行备份的时间并不影响奴隶的能力跟上从主事件。看到第17.1.7.1,“检查复制状态”。如果奴隶无法跟上,你可能要添加另一个奴隶和分发备份过程。例如如何配置这个场景,看第17.3.6“复制不同的数据库,不同的奴隶”

17.3.1.2备份原始数据从一个奴隶

为了保证复制文件的完整性,备份原始数据文件在你的MySQL复制从应该发生而你从服务器关闭。如果MySQL服务器仍在运行,后台任务仍然可以更新数据库文件,特别是那些涉及存储引擎和后台进程,如InnoDB。与InnoDB,这些问题应该在崩溃恢复解决,但既然从服务器可以关闭在备份过程中不影响主就利用这个能力执行。

关闭服务器和备份文件:

  1. 关闭从MySQL服务器:

    shell> mysqladmin shutdown
  2. 复制数据文件。你可以使用任何合适的复制或档案事业,包括内容提供商焦油WinZip。例如,假设数据目录位于当前目录下,你可以存档的整个目录如下:

    shell> tar cf /tmp/dbbackup.tar ./data
  3. 再次启动MySQL服务器。UNIX下:

    shell> mysqld_safe &

    在Windows:

    C:\> "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld"

通常你应该备份整个数据目录为奴隶的MySQL服务器。如果你希望能够恢复的数据作为一个奴隶(例如,在从失败的事件),除了数据,你需要掌握的信息库和中继日志信息库,和中继日志文件。这些项目都需要你恢复奴隶的数据后恢复复制。如果表已被用于主信息和中继日志信息库(参见第17.2.4,“复制继电器和状态日志”),这是在MySQL 8的默认值,这些数据表备份以及数据目录。如果文件已使用的库,你必须回到这些分开。中继日志文件也必须支持,如果他们已经被分别放置在不同的位置数据目录。

如果你失去了你的中继日志,但仍然有relay-log.info文件,你可以检查一下以确定多远SQL线程在执行主人的二进制日志。然后,您可以使用CHANGE MASTER TOmaster_log_fileMASTER_LOG_POS选项告诉奴隶重新从那点读取二进制日志。这就要求二进制日志仍然存在于主服务器。

如果你的奴隶被复制LOAD DATA INFILE陈述,你也应该支持任何sql_load *文件存在,奴隶使用目录为此。奴隶需要这些文件恢复任何中断复制LOAD DATA INFILEOperations .这座工厂的租赁是它的价值。--slave-load-tmpdir选项如果服务器没有启动这个选项,目录位置的价值tmpdir系统变量

17.3.1.3备份主机或从机通过只读

可以备份或主或从服务器复制设置通过获取一个全局读锁和操纵read_only系统变量更改服务器的只读状态进行备份:

  1. 使服务器的只读,因此它只能处理检索和街区更新。

  2. 执行备份

  3. 更改服务器恢复正常的读/写状态。

笔记

本节将服务器进行备份,备份的方法在一个国家获得的数据从服务器安全指令,如mysqldump(见4.5.4“,”mysqldump一个数据库的备份计划”)。你不应该试图使用这些指令,通过复制文件直接进行二进制备份,因为服务器可能仍然有修改的数据缓存在内存中而不是刷新到磁盘。

下面的说明描述了如何为一个主服务器和从服务器做这个。对于这两种情况下,在这里讨论,假设您有以下复制设置:

  • 主服务器M1

  • 一个从服务器,S1,M1作为它的主人

  • 客户端连接到M1 C1

  • 客户端连接到S1 C2

在任何情况下,为了获得全局读锁和操纵报表read_only变量是在服务器上进行备份,不传播任何奴隶,服务器。

场景1:一个只读备份大师

通过对其执行这些语句把主人M1为只读状态:

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SET GLOBAL read_only = ON;

而M1处于只读状态,下面的属性是真实的:

  • 所发的C1 M1更新请求将块因为服务器在只读模式。

  • 查询结果发送C1 M1请求将成功。

  • 对M1进行备份是安全的。

  • S1进行备份是不安全的。该服务器仍在运行,可以处理的二进制日志或更新请求来自客户端的C2。

而M1是只读的,执行备份。例如,您可以使用mysqldump

对M1完成备份操作后,恢复到正常运行状态,M1通过执行这些语句:

mysql> SET GLOBAL read_only = OFF;
mysql> UNLOCK TABLES;

虽然对M1进行备份是安全的(只要备份而言),它是不是最佳的性能,因为客户M1被阻止执行更新。

这种策略适用于备份主服务器的复制设置,但也可以用于单个服务器中的非重复性的设置。

场景2:一个只读Slave备份

把奴隶S1在只读状态由它执行这些语句:

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SET GLOBAL read_only = ON;

当S1处于只读状态,下面的属性是真实的:

  • 主M1将继续运作,因此在主备份是不安全的。

  • 从S1停止,因此从S1备份是安全的。

这些特性对于一个流行的备份方案提供依据:有一个从繁忙的表演一个备份并不是一个问题,因为它不影响整个网络,和系统仍在运行的备份。特别是,客户仍然可以在主服务器上进行更新,这仍然是在备份活动不受影响。

当S1是只读的,执行备份。例如,您可以使用mysqldump

在S1的备份操作完成后,恢复到正常运行状态S1通过执行这些语句:

mysql> SET GLOBAL read_only = OFF;
mysql> UNLOCK TABLES;

当奴隶恢复正常,再同步到主的追赶从主人的二进制日志未更新。

17.3.2处理复制奴隶意外停止

复制是有弹性的服务器意外停止,(有时称为碰撞安全)必须可以从恢复之前,暂停状态。本节描述一个奴隶一个意外停机的影响在复制过程中,如何配置一个奴隶的最佳机会恢复继续复制。

一个奴隶突然停止后,在重新启动I/O线程必须恢复交易已收到的信息,和SQL线程必须恢复交易已经被执行。在从信息日志恢复所需的,看第17.2.4,“复制继电器和状态日志”

恢复所需的信息是默认的存储InnoDB表利用事务存储引擎的信息总是收回后重新启动。此前,这个信息是通过在数据目录,交易后已应用更新文件的默认存储。这举行的与主依赖于处理事务的奴隶停止在哪个阶段失去同步的风险,甚至腐败的文件本身。该表的更新承诺一起交易,这意味着在他们的信息总是与已应用到数据库的一致性,即使在一个服务器停止活动。

配置MySQL 8的存储复制表中的信息,relay_log_info_repositorymaster_info_repository必须设置默认值。然后服务器中存储的I/O线程恢复所需的信息mysql.slave_master_info表,并对SQL线程恢复所需的信息mysql.slave_relay_log_info表选择设置FILE现在已不再使用,并将在未来的版本中删除。

采用这种配置,DML事务和原子DDL使以下三更新,自动:

  • 应用事务对数据库

  • 在复制的位置更新mysql.slave_relay_log_info

  • 更新在mysql.gtid_executed表gtid(当GTIDs被启用和二进制日志服务器上禁用)。

在所有其他情况下,包括DDL语句是不完全的原子,免除了存储引擎不支持atomic DDL的mysql.slave_relay_log_info表格可能会丢失更新复制的数据如果服务器死机竟然相关。在这种情况下恢复更新是一个手动过程。在MySQL 8原子DDL支持的详细信息,以及由此产生的行为对于某些语句的复制,看第13.1.1,“原子数据定义语句的支持”

如何复制从恢复从一个意想不到的停止是由复制所选方法的影响,无论是单线程或多线程的奴隶,如变量的设置relay_log_recovery,是否等特点master_auto_position正在使用

下表显示了这些不同的因素的影响如何,单线程的奴隶恢复意外停止。

表17.3单线程复制从恢复的影响因素

gtid

master_auto_position

relay_log_recovery

relay_log_info_repository

碰撞类型

恢复的保证

中继日志的影响

关闭

任何

服务器

迷路的

关闭

任何

任何

操作系统

迷路的

关闭

任何

服务器

仍然是

关闭

任何

操作系统

仍然是

打开(放)

打开(放)

任何

任何

任何

迷路的

打开(放)

关闭

服务器

仍然是

打开(放)

关闭

任何

操作系统

仍然是


如表所示,当使用单线程从以下的配置是最有弹性的意外停止:

下表显示了这些不同的因素对多线程的奴隶恢复从意外中断的影响。

表17.4影响因素多线程复制从回收

gtid

sync_relay_log

MASTER_AUTO_POSITION

relay_log_recovery

relay_log_info_repository

碰撞类型

恢复的保证

中继日志的影响

关闭

任何

任何

迷路的

关闭

&#62; 1

任何

服务器

迷路的

关闭

&#62; 1

任何

任何

操作系统

迷路的

关闭

任何

服务器

仍然是

关闭

任何

操作系统

仍然是

打开(放)

任何

打开(放)

任何

任何

任何

迷路的

打开(放)

关闭

服务器

仍然是

打开(放)

关闭

任何

操作系统

仍然是


如表所示,当使用多线程从以下的配置是最有弹性的意外停止:

这是要注意的重要影响sync_relay_log=1,这需要一个写每交易中继日志。虽然这个设置是最有弹性的意外停止,最多有一个不成文的交易损失,这也大大增加了存储负载的潜力。没有sync_relay_log=1,一个意外停机的影响取决于中继日志是由操作系统处理。还注意到,当relay_log_recovery=0接下来的时间,奴隶是一个意外停机继电器日志作为回收处理后开始。这个过程完成后,中继日志被删除。

一个意外停机的一个多线程复制从使用基于位置的推荐文件复制以上配置可能会导致交易的不一致性的中继日志(在交易序列的意外停机造成的差距)。看到第17.4.1.34,“复制和事务不一致”。如果中继日志恢复过程中遇到这样的交易不一致,他们是充满和恢复过程自动进行。

当你使用多源复制relay_log_recovery=1,重新启动后由于意外停止复制通道穿过中继日志恢复过程。由于一个多线程的奴隶意外停止中继日志发现任何不一致了。

17.3.3监控基于行的复制

复制的进展者(SQL)当使用基于行的复制是通过绩效模式仪器阶段监测线,使您可以跟踪操作的处理和检查完成的工作量和工作估计。当这些性能模式仪器阶段启用events_stages_current表显示应用线程和进展阶段。背景信息,看第25.11.5,“表现图式阶段事件表”

跟踪的事件类型的复制所有三排的进步(写、更新、删除):

  • 使3表现图式阶段发行:

    mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES'
        -> WHERE NAME LIKE 'stage/sql/Applying batch of row changes%';
    
  • 等待某一事件被复制应用线程处理然后检查进展的展望events_stages_current表例如获得进展更新事件的问题:

    mysql> SELECT WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_current
        -> WHERE EVENT_NAME LIKE 'stage/sql/Applying batch of row changes (update)'
    
  • 如果binlog_rows_query_log_events启用,查询有关的信息存储在二进制日志和暴露在processlist_info场。看到触发此事件的原始查询:

    mysql> SELECT db, processlist_state, processlist_info FROM performance_schema.threads
        -> WHERE processlist_state LIKE 'stage/sql/Applying batch of row changes%' AND thread_id = N;
    

本使用不同的主从复制存储引擎

它不复制过程是否对师父和复制的表上使用不同的发动机类型从源表的事。事实上,这default_storage_engine系统变量是不可复制的。

这提供了在复制过程中,可以利用不同的复制方案不同的发动机类型很多好处。例如,在一个典型的规模情况(见第17.3.5,使用复制的规模”),你想用InnoDB在主表中利用的交易功能,但是使用MyISAM在奴隶交易的支持,不需要因为数据是只读的。当使用复制的数据记录的环境,你可能想使用Archive在从存储引擎

配置不同的引擎在主人和奴隶取决于你如何设置初始复制过程:

  • 如果你使用mysqldump创建你的数据库快照,您可以编辑转储文件文本更改用于每台发动机的类型。

    另一个选择mysqldump是禁用您不想使用奴隶在使用转储建立数据从发动机类型。例如,你可以添加--skip-federated选择你的奴隶禁用联邦引擎如果一个特定的引擎不一表被创造的存在,MySQL将使用默认的发动机类型,通常MyISAM。(这需要,NO_ENGINE_SUBSTITUTIONSQL模式不启用。)如果你想禁用额外的引擎,这样,你可能要考虑建立一个特殊的二进制用于只支持你想要的引擎的奴隶。

  • 如果您使用的是原始数据文件(二进制备份)建立的奴隶,你将无法改变最初的表格式。相反,使用ALTER TABLE更改表的类型后,奴隶已经开始。

  • 新的主从复制设置,目前在主没有桌子,避免指定的发动机类型创建新表时。

如果你已经运行了一个复制解决方案,想把你现有的表,另一个发动机类型,遵循这些步骤:

  1. 停止从运行复制更新:

    mysql> STOP SLAVE;
    

    这将使你能够改变发动机类型不中断。

  2. 执行一个ALTER TABLE ... ENGINE='engine_type'每个表被改变

  3. 又开始从复制过程:

    mysql> START SLAVE;
    

虽然default_storage_engine变量是不可复制的,要知道CREATE TABLEALTER TABLE报表引擎规格将被正确地复制到奴隶。例如,如果你有一个CSV表格和你执行:

MySQL的&#62;ALTER TABLE csvtable Engine='MyISAM';

上面的语句将被复制到奴隶和奴隶的发动机类型将转换为MyISAM,即使你已经改变了表类型对奴隶以外的CSV引擎。如果你想保持对主从机之间的差异,你应该小心使用default_storage_engine在主当创建一个新表变量。例如,而不是:

MySQL的&#62;CREATE TABLE tablea (columna int) Engine=MyISAM;

使用此格式:

mysql> SET default_storage_engine=MyISAM;
mysql> CREATE TABLE tablea (columna int);

当复制的default_storage_engine变量将被忽略,而CREATE TABLE声明将使用奴隶的奴隶执行默认的搜索引擎。

17.3.5使用规模复制

您可以使用复制和扩展的解决方案;即,你想拆分数据库查询在多个数据库服务器的负载,在一些合理的限制。

因为从一个主人到一个或多个奴隶的分布复制作品,使用复制的扩展工作最好在你所处的环境中有大量的读取和写入次数/更新低。大多数网站都属于这一类,在用户浏览网站,阅读文章,帖子,或查看产品。更新只发生在会话管理,或在作出购买或添加评论/信息论坛。

在这种情况下,复制使您能够将读取在复制的奴隶,同时还使您的Web服务器的复制与大师交流时写的一个要求。你可以看到这个场景样本复制布局图17.1中,使用复制来提高性能在规模”

图17.1使用复制来提高性能在扩展

Incoming requests from clients are directed to a load balancer, which distributes client data among a number of web clients. Writes made by web clients are directed to a single MySQL master server, and reads made by web clients are directed to one of three MySQL slave servers. Replication takes place from the MySQL master server to the three MySQL slave servers.

如果你的代码的一部分,是负责数据库的访问已被正确提取/模块化,将它与复制的设置应该是非常顺利和容易。改变你的数据库访问发送所有执行写入的主人,并将读取到的主人或奴隶。如果你的代码没有这个层次的抽象,建立一个复制系统给你清理的机会和动力。首先创建一个包装库或模块,实现了以下功能:

  • safe_writer_connect()

  • safe_reader_connect()

  • safe_reader_statement()

  • safe_writer_statement()

safe_在每个函数的名字意味着函数负责处理所有的错误条件。你可以使用不同的名称的功能。重要的是要有一个统一的接口,用于连接:连接写道,做阅读,做一个写。

然后把你的客户端代码使用包装库。这可能是一个痛苦和可怕的过程开始,但从长远来看回报。使用该方法只是描述了能够利用主从配置的所有应用程序,即使是一个涉及多个奴隶。代码更容易维护,并添加排除选项是微不足道的。你需要修改一个或两个功能;例如,登录了多久每个语句或语句,其中颁发给你一个错误。

如果你写了很多代码,你可能想自动转换的任务,写一个转换脚本。理想情况下,您的代码使用一致的编程风格约定。如果不是,那么你还是重写吧,或者至少要通过手动调整它使用一致的风格。

17.3.6复制不同的数据库,不同的奴隶

有可能你有一个单一的主要复制不同的数据库,不同的奴隶的情况。例如,您可能要到不同部门分配不同的销售数据来帮助分散负载,在数据分析。这一布局的示例所示图17.2中,使用复制来复制数据库独立复制的奴隶”

图17.2使用复制来复制数据库分离复制的奴隶

The MySQL master server has three databases, databaseA, databaseB, and databaseC. DatabaseA is replicated only to MySQL Slave 1, DatabaseB is replicated only to MySQL Slave 2, and DatabaseC is replicated only to MySQL Slave 3.

你可以通过配置主和奴隶为正常实现这种分离,然后限制的二进制日志报表,每个奴隶的过程通过使用--replicate-wild-do-table对斯拉夫人的选择

重要

你应该使用--replicate-do-db为此采用基于语句的复制,因为基于复制的原因声明本期权的影响根据数据库是当前选择不同。这适用于混合格式复制为好,因为这使一些更新被复制使用的格式声明。

然而,它应该是安全的使用--replicate-do-db为了这个目的,如果你只使用基于行的复制,因为在这种情况下,当前选定的数据库对期权的运作没有影响。

例如,支持分离出图17.2中,使用复制来复制数据库独立复制的奴隶”,你应该配置每个复制从如下,在执行之前START SLAVE

  • 复制从1应该使用--replicate-wild-do-table=databaseA.%

  • 2应使用复制的奴隶--replicate-wild-do-table=databaseB.%

  • 复制从三应该使用--replicate-wild-do-table=databaseC.%

在这种配置每一个奴隶从主机接收到的二进制日志,但只执行这些事件从二进制日志,适用于包括由数据库和表--replicate-wild-do-table选择在效果上的奴隶

如果你有必须同步数据复制开始前的奴隶,你有很多选择:

  • 同步所有数据到每个奴隶,并删除数据库,表,或是你不想继续。

  • 使用mysqldump为每个数据库创建一个单独的转储文件并加载适当的转储文件在每个奴隶。

  • 使用原始数据文件转储和只包含特定的文件和数据库,你需要为每一个奴隶。

    笔记

    这不工作InnoDB除非你使用的数据库innodb_file_per_table

17.3.7提高复制性能

作为连接到主增加奴隶数量的负载,但最低限度,也增加,每个奴隶使用一个客户端连接到主。另外,每个奴隶必须接受主人的二进制日志的完整副本,在主网络负载也会增加,形成一个瓶颈。

如果您使用的是大量的连接到一个主人的奴隶,而主人也忙着处理请求(例如,作为一个规模的部分解决方案),那么你可能想提高复制过程的性能。

为了提高复制过程的性能的一种方法是创建一个更深的复制结构,使主复制到只有一个奴隶,和剩余的奴隶来连接这主要从他们的个人复制要求。这一结构的样品展示图17.3,“使用一个额外的复制主机性能提高”

图17.3使用一个额外的复制主机性能提高

The server MySQL Master 1 replicates to the server MySQL Master 2, which in turn replicates to the servers MySQL Slave 1, MySQL Slave 2, and MySQL Slave 3.

对于这项工作,你必须配置MySQL实例如下:

  • 掌握1是主,所有的变化和更新写入数据库。二进制日志是对主人的启用,这是默认的。

  • 主人是奴隶主,提供复制功能的奴隶,其余的在复制结构。掌握2是允许连接到主1唯一的机。2有主--log-slave-updates启用选项(默认值)。使用此选项,从掌握1复制指令还掌握2的二进制日志,然后将它们复制到真正的奴隶。

  • 从1,2和3的奴隶,奴隶作为奴隶主2,复制信息从主2,这实际上是由升级登录大师1。

上述解决方案降低了客户端的负载,在主网络接口的负载,应当作为一个直接的数据库解决方案提高整体性能的主。

如果你的奴隶很难跟上对师父的复制过程中,有许多可供选择的方案:

  • 如果可能的话,把中继日志和数据文件放在不同的物理驱动器。为此,使用--relay-log选项来指定中继日志的位置。

  • 如果重磁盘I/O活动读取二进制日志文件和中继日志文件是一个问题,考虑增加的价值rpl_read_size系统变量。本系统变量控制从日志文件中读取数据的最低金额,并增加可能减少文件的读取和I / O档当文件数据不被操作系统缓存。注意,这个值的大小的缓冲区分配给每个线程读取二进制日志和中继日志文件,包括转储线程对奴隶主人和协调线程。设置较大的值,因此可能有对于服务器内存消耗的影响。

  • 如果奴隶比主人明显变慢,你可能想将复制数据库不同,不同的奴隶的责任。看到第17.3.6“复制不同的数据库,不同的奴隶”

  • 如果你的主人利用交易和你不关心的事务支持你的奴隶,使用MyISAM或在奴隶的另一个非事务性的引擎。看到本节,“使用复制不同的主从存储引擎”

  • 如果你的奴隶是不作为的主人,和你有一个潜在的解决方案,以确保你可以把故障的事件中的高手,那么你可以关掉--log-slave-updateson the斯拉夫人。This prevents哑的奴隶也记录他们执行到自己的二进制日志事件。

17.3.8大师在故障转移切换

你可以告诉一个奴隶换个新主人使用CHANGE MASTER TO声明。奴隶不检查是否在主数据库是与那些在奴隶的兼容;它只是开始读和从指定的坐标在新主人的二进制日志执行事件。在故障转移的情况下,该组中的所有服务器通常是从相同的二进制日志文件执行相同的事件,所以改变事件的源头不应影响数据库的结构完整,只要你小心做更改。

奴隶应该运行的二进制日志启用(的--log-bin这是默认选项)。如果你不使用gtids复制,然后奴隶也应该运行--skip-log-slave-updates(记录从更新是默认的)。这样,从准备不重启的奴隶成为大师mysqld。假设你有结构显示图17.4、“冗余使用复制的初始结构”

图17.4冗余使用复制的初始结构

Two web clients direct both database reads and database writes to a single MySQL master server. The MySQL master server replicates to MySQL Slave 1, MySQL Slave 2, and MySQL Slave 3.

在该图中,该MySQL Master球队的主数据库MySQL的奴隶主机复制的奴隶,和Web Client机器发出数据库读写。Web客户端的问题只读取(通常会被连接到奴隶)不显示,因为它们不需要切换到故障的事件中的一个新的服务器。对于一个读/写规模复制结构的一个更详细的例子,看第17.3.5,使用复制的规模”

每一个MySQL Slave(Slave 1从2,和Slave 3)是一个奴隶的二进制日志记录功能,并与--skip-log-slave-updates。因为从主奴收到更新不记录在二进制日志时--skip-log-slave-updates指定,每个奴隶的二进制日志是空的最初。如果因为某些原因MySQL的主不可用,你可以选择一个奴隶成为新主人。例如,如果你的选择Slave 1,所有的Web客户端应该改为Slave 1,这将更新其二进制日志。从2Slave 3然后复制从从1

跑步的奴隶的原因--skip-log-slave-updates是为了防止奴隶从接收更新两次,如果你因为一个奴隶成为新主人。如果从1--log-slave-updates启用,这是默认的,它写的任何更新,它接收来自硕士在自己的二进制日志。这意味着,当Slave 2变化硕士Slave 1作为它的主人,它可以从接收更新从1它已经收到了Master

确保所有的奴隶有任何语句在中继日志处理。在每一个奴隶的问题STOP SLAVE IO_THREAD,然后检查输出SHOW PROCESSLIST直到你看到读过所有的中继日志。如果这是真正的所有的奴隶,他们可以重新配置的新格局。在奴隶Slave 1被提拔成为高手,问题STOP SLAVERESET MASTER

在其他的奴隶Slave 2从三,使用STOP SLAVECHANGE MASTER TO MASTER_HOST='Slave1'(在哪里'Slave1'代表真正的主机名称从1)。使用两个CHANGE MASTER TO把所有的信息,关于如何连接从1Slave 2从3userpasswordport)。当发行the改变主表在这,无需指定Slave 1二进制日志文件或日志位置读取二进制日志文件,从第一和4位,都是默认的。最后,执行START SLAVE打开(放)从2Slave 3

一旦新的复制安装到位,你需要告诉每一个Web Client直接的陈述从1。从这一点上,所有的更新报表发送的Web Client从1写入二进制日志Slave 1然后,它包含了每一个UPDATE语句发送到从1自从Master死亡.

由此产生的服务器结构示图17.5、“冗余使用复制后的失败”

图17冗余使用复制后的失败

The MySQL master server has failed, and is no longer connected into the replication topology. The two web clients now direct both database reads and database writes to MySQL Slave 1, which is the new master. MySQL Slave 1 replicates to MySQL Slave 2 and MySQL Slave 3.

什么时候Master再次变为可用时,你应该使它的奴隶从1。要做到这一点,问题Master相同的CHANGE MASTER TO声明,发布从2Slave 3以前硕士然后成为一个奴隶S1ave 1拿起Web客户端说它错过了而这是离线。

使Master又是一个大师,使用前面的过程如从1是无效的,Master新来的主人。在这个过程中,不要忘记运行RESET MASTER打开(放)硕士之前Slave 1从2,和Slave 3奴隶硕士。如果你做不到这一点,奴隶们可以拿起陈旧的写的Web Client应用以前约会的点硕士变得不可用

你应该知道,有奴隶在没有同步,即使他们有相同的主人,因此一些奴隶可能大大超过别人。这意味着,在某些情况下,程序在前面的例子中,可能不会像预期的那样工作概述。然而在实践中,中继日志上所有的奴隶都应该比较紧密。

保持应用了解主人的位置的一种方法是为掌握动态DNS条目。与bind你可以使用nsupdateDNS动态更新

17.3.9设置复制使用加密连接

使用加密连接过程中需要的复制二进制日志转移,无论是主从服务器必须支持加密的网络连接。如果服务器不支持加密连接(因为它没有被编译或为他们配置),通过加密连接的复制是不可能的。

建立加密连接复制类似于这样的客户端/服务器的连接。你必须得到(或创建)一个合适的安全证书,您可以使用的主人,和一个类似的证书(同一认证机构)对每一个奴隶。你还必须获得合适的密钥文件。

在建立加密连接服务器和客户端的更多信息,参见第6.4.1配置MySQL,使用加密的连接”

启用加密连接在主,你必须创建或获得合适的证书和密钥文件,然后添加以下配置选项的配置在主[mysqld]这位大师的部分my.cnf文件,改变文件的名字是必要的:

[mysqld]
ssl-ca=cacert.pem
ssl-cert=server-cert.pem
ssl-key=server-key.pem

该文件的路径可以是相对或绝对的;我们建议您始终使用完整路径为这个目的。

选项如下:

  • --ssl-ca:证书的权威证书文件的路径名(CA)。(——SSL capath类似但指定目录路径名的CA证书文件。)

  • --ssl-cert:服务器的公钥证书的文件的路径名。这可以被发送到客户端和认证针对的CA证书,具有。

  • --ssl-key:私钥文件服务器的路径名。

启用加密连接的奴隶,使用CHANGE MASTER TO声明。你可以叫奴隶证书和SSL私有密钥所需的文件加密的连接在[顾客]对奴隶的部分my.cnf文件,或者您可以显式指定信息的使用CHANGE MASTER TO声明。上的更多信息CHANGE MASTER TO声明,看第13.4.2.1,“变化掌握语法”

  • 名奴隶证书和密钥文件使用一个选项文件,添加以下的线[client]对奴隶的部分my.cnf文件,改变文件的名字是必要的:

    [client]
    ssl-ca=cacert.pem
    ssl-cert=client-cert.pem
    ssl-key=client-key.pem
    
  • 重新启动服务器,使用--skip-slave-start选项来防止从连接到主。使用CHANGE MASTER TO指定主配置,加master_ssl选择连接使用加密:

    mysql> CHANGE MASTER TO
        -> MASTER_HOST='master_hostname',
        -> MASTER_USER='repl',
        -> MASTER_PASSWORD='password',
        -> MASTER_SSL=1;
    

    设置MASTER_SSL=1一个复制连接,然后设置没有进一步master_ssl_xxx选择对应的设置--ssl-mode=REQUIRED对于客户端,如第6.4.2,“加密连接”命令选项。与MASTER_SSL=1连接尝试才能成功,如果一个加密的连接可以建立。复制连接不回落到一个加密的连接,所以没有设置相应的--ssl-mode=PREFERREDSetting for复制。如果MASTER_SSL=0是集,这相当于--ssl-mode=DISABLED

  • 名奴隶证书和SSL私钥文件使用CHANGE MASTER TO声明,如果你没有在奴隶的这样做my.cnf文件,添加适当的MASTER_SSL_xxx备选办法:

    -&#62;MASTER_SSL_CA = 'ca_file_name',-&#62;MASTER_SSL_CAPATH = 'ca_directory_name',-&#62;MASTER_SSL_CERT = 'cert_file_name',-&#62;MASTER_SSL_KEY = 'key_file_name',

    这些选项对应的--ssl-xxx具有相同名称的选项,如第6.4.2,“加密连接”命令选项。这些选项生效,MASTER_SSL=1还必须设置。一个复制连接,指定的值_ SSL _交流硕士MASTER_SSL_CAPATH,或指定这些选项在奴隶的my.cnf文件,对应设置--ssl-mode=VERIFY_CA。连接尝试才能成功如果有效匹配的证书颁发机构(CA)证书是使用指定的信息发现。

  • 激活主机名称身份验证、添加MASTER_SSL_VERIFY_SERVER_CERT选项:

    -&#62;MASTER_SSL_VERIFY_SERVER_CERT=1,

    这个选项对应的--ssl-verify-server-cert选项,这是过时的MySQL 5.7和MySQL 8中删除。一个复制连接,指定MASTER_SSL_VERIFY_SERVER_CERT=1对应设置--ssl-mode=VERIFY_IDENTITY,如第6.4.2,“加密连接”命令选项。这个选项生效,MASTER_SSL=1还必须设置。主机名的身份验证不使用自签名证书的工作。

  • 激活证书撤销列表(CRL)检查,加MASTER_SSL_CRLmaster_ssl_crlpath选项:

        -> MASTER_SSL_CRL = 'crl_file_name',
        -> MASTER_SSL_CRLPATH = 'crl_directory_name',

    这些选项对应的--ssl-xxx具有相同名称的选项,如第6.4.2,“加密连接”命令选项。如果没有指定,没有CRL检查发生。

  • 指定的复制连接允许密码和加密协议的列表,添加MASTER_SSL_CIPHERmaster_tls_version备选办法:

        -> MASTER_SSL_CIPHER = 'cipher_list',
        -> MASTER_TLS_VERSION = 'protocol_list',

    这个MASTER_TLS_VERSION选项指定的加密协议允许的复制连接。格式是这样的tls_version系统变量与一个或多个协议名称以逗号分隔。这个硕士_ SSL _ cipher选项指定的复制连接允许的密码列表,与一个或多个密码名字冒号分隔。协议和密码,你可以使用这些列表取决于用来编译MySQL的SSL库。有关如何指定这些选项,看第6.4.6,“加密连接协议和密码”

  • 在掌握的信息已经更新,开始从复制过程:

    mysql> START SLAVE;
    

    你可以使用SHOW SLAVE STATUS声明确认加密连接建立成功。

  • 加密连接在奴隶的要求并不能保证主需要加密连接的奴隶。如果你想确保主只接受复制的奴隶,连接使用加密连接,创建一个复制的用户帐户在主用REQUIRE SSL选项,然后让用户REPLICATION SLAVE特权。例如:

    MySQL的&#62;CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password'-&#62;REQUIRE SSL;MySQL的&#62;GRANT REPLICATION SLAVE ON *.*-&#62;TO 'repl'@'%.example.com';

    如果你对主有一个现有的复制的用户帐户,您可以添加REQUIRE SSL它与本声明:

    MySQL的&#62;ALTER USER 'repl'@'%.example.com' REQUIRE SSL;

17.3.10半同步复制

除了内置的异步复制,MySQL 8的支持一个接口,通过插件实现半同步复制。本节讨论半同步复制是什么以及它是如何工作的。以下部分包括行政接口半同步复制和如何安装,配置和监控。

MySQL复制默认是异步的。主写事件的二进制日志,但不知道是否或何时有检索和处理他们的奴隶。异步复制,如果主机崩溃,交易已经不可能被发送到任何奴隶。因此,在这种情况下,主从切换可能会导致故障转移到服务器丢失交易相对于主。

半同步复制,可以用来作为一种替代异步复制:

  • 一个奴隶表明无论是半同步时连接到主的能力。

  • 如果半同步复制在主人身边启用并至少有一个半同步的奴隶,一个线程执行一个事务提交的主块和等待至少一个半同步奴隶承认已为交易收到的所有事件,直到发生超时。

  • 奴隶承认交易的事件后,事件被写入中继日志和刷新到磁盘的收据。

  • 如果发生超时不承认任何奴隶交易,主机恢复到异步复制。当至少一个半同步奴隶赶,主人回到半同步复制。

  • 半同步复制必须启用对主站和从站侧。如果半同步复制是在主残疾,或启用主但没有奴隶主使用异步复制。

而主阻塞(等待一个奴隶的承认),它不返回会话进行交易。当块的两端,主人返回到会话,然后可以继续执行其他语句。在这一点上,该交易已经在主方承诺,及其事件的收据已经被至少一个奴隶的承认。

奴隶主的数量必须得到确认每笔交易之前是可配置的应用rpl_semi_sync_master_wait_for_slave_count系统变量。默认值是1。

阻塞发生后回滚,写入二进制日志,这发生在当一个事务修改非事务表回滚。回滚的事务记录,尽管它没有影响事务表因为对非事务性表的修改不能回滚,必须发送到奴隶。

语句不在事务上下文中出现(即在没有交易已经开始START TRANSACTIONSET autocommit = 0),将启用每个语句有隐。半同步复制,对于每一次这样的声明的主块,只是因为它显式事务提交。

了解什么进入半同步复制手段,它与异步和同步复制的比较:

  • 异步复制,主写事件的二进制日志和奴隶要求他们当他们准备好了。有没有保证,任何事件都有奴隶。

  • 完全同步复制,当主提交一个事务,所有的奴隶都提交了交易前的大师返回会话进行交易。这样做的缺点是,可能会有很多的延迟来完成交易。

  • 半同步复制是异步和同步复制之间。主等待,直到至少一个奴隶已经收到并记录的事件。它不会等待所有的奴隶都承认收据,它只需要收据,不是事件已充分执行和从站侧犯。

而异步复制,半同步复制提供了改进的数据的完整性,因为当提交成功返回,它是已知的,数据中存在至少两个地方。直到半同步的主人从奴隶配置数量接收确认rpl_semi_sync_master_wait_for_slave_count,该交易是在把握和没有承诺。

半同步复制也在繁忙的会议速率限制通过限制在二进制日志事件可以发送从主从速度。当一个用户太忙,这会慢下来,这在一些情况下是有用的部署。

半同步复制也有一定的性能影响,因为承诺是由于需要等待的奴隶。这是为增加数据完整性的权衡。放缓的量至少为TCP/IP的往返时间将致力于奴隶和奴隶等的收据。这意味着半同步复制最好关闭服务器快速网络进行通信,并在遥远的服务器网络通信的最慢。

这个rpl_semi_sync_master_wait_point系统变量控制点半同步复制等交易收据从确认之前返回一个状态到客户端提交事务。这些值是允许的:

  • AFTER_SYNC(默认):大师写的每一笔交易的二进制日志和奴隶,并同步二进制日志到磁盘。主等待收到确认后同步奴隶交易。在收到确认,主提交事务的存储引擎并返回结果给客户端,然后才能进行。

  • AFTER_COMMIT:主写每个事务的二进制日志和奴隶,同步二进制日志,并提交事务的存储引擎。主等待交易收据确认提交后的奴隶。在收到确认,主人将结果返回给客户端,然后才能进行。

如下这些设置的复制特性不同:

  • AFTER_SYNC看,所有客户承诺同时交易:在它被承认的奴隶和致力于存储引擎在主。因此,所有的客户看到主人相同的数据。

    在主失败的事件,在主所犯下的所有交易都复制到奴隶(保存到其中继日志)。一个崩溃的奴隶主和故障转移是无损因为奴隶是最新的。

  • AFTER_COMMIT,客户发行交易只在服务器向存储引擎和接收从确认得到的返回状态。提交之前,从确认后,客户可以在客户端看到的已提交的事务提交。

    如果做错了事情,奴隶不处理事务,然后在主碰撞和故障转移事件的奴隶,这是可能的,这样的客户将看到的损失相对于他们所看到的在主数据。

17.3.10.1半同步复制管理界面

以半同步复制的管理界面有几个组成部分:

只有合适的主人或奴隶插件已安装的系统,状态变量是可用的INSTALL PLUGIN

17.3.10.2半同步复制的安装和配置

半同步复制的实现使用的插件,这样的插件必须安装到服务器,使他们可以。在一个插件被安装,你通过与它相关的系统变量。这些系统变量才能使用相关的插件已经安装。

本节介绍如何安装半同步复制插件。关于安装插件的一般信息,看第5.6.1,“安装和卸载插件”

使用半同步复制,必须满足以下要求:

建立半同步复制,使用下面的指令。这个INSTALL PLUGINSET GLOBALSTOP SLAVE,和START SLAVE这里所说的需要的报表REPLICATION_SLAVE_ADMINSUPER特权

MySQL分布包括主、从端半同步复制插件文件。

采用主从服务器可以使用适当的插件库文件必须位于MySQL插件目录(目录命名的plugin_dir系统变量)。如果有必要,设置值plugin_dir在服务器启动告诉服务器插件目录位置。

插件库文件的基名称semisync_mastersemisync_slave。the file name for example(后缀为平台,differs.soUNIX和类UNIX系统,dllWindows)

主插件库文件必须在主服务器上的插件目录。从插件库文件必须存在插件目录中的每个从属服务器。

加载插件,使用INSTALL PLUGIN在主人和奴隶的声明是在每个半同步,(调整。所以足够的你的平台

在主:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

在每一个奴隶:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

如果试图安装一个插件导致错误Linux类似,在这里显示,你必须安装libimf

MySQL的&#62;INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';错误1126(hy000):不能打开共享库的/usr/local MySQL / lib /插件/ semisync_master。所以(errno:22 libimf.so:不能打开共享对象文件:没有这样的文件或目录)

你可以获得libimfhttp://dev.mysql.com/downloads/os-linux.html

看看哪些插件安装,使用SHOW PLUGINS声明,或查询INFORMATION_SCHEMA.PLUGINS

to verify the插件安装,检查INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS声明(见第2,“获取服务器插件的信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+

如果插件初始化失败,检查诊断消息服务器错误日志。

在半同步复制插件已安装,它默认是禁用的。必须启用的插件都在主人身边,从面使半同步复制。如果只有一方是启用,将异步复制。

控制是否安装的插件启用,设置相应的系统变量。你可以在运行时使用这些变量设置SET GLOBAL,或在命令行或在一个选项文件服务器启动。

在运行时,这些主副系统变量可用:

SET GLOBAL rpl_semi_sync_master_enabled = {0|1};
SET GLOBAL rpl_semi_sync_master_timeout = N;

在奴隶的一面,这个系统变量是可用的:

SET GLOBAL rpl_semi_sync_slave_enabled = {0|1};

rpl_semi_sync_master_enabledrpl_semi_sync_slave_enabled,该值应为使半同步复制或0禁用它。默认情况下,这些变量设置为0。

rpl_semi_sync_master_timeout,价值N给出了在毫秒。默认值是10000(10秒)。

如果你启用了半同步复制在运行一个奴隶,你也必须开始从I/O线程(停止首先如果它已经运行)造成从连接到主登记为半同步的奴隶:

STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

如果I/O线程正在运行,你不启动它,奴隶继续使用异步复制。

在服务器启动时,控制半同步复制可以设置命令行选项或选择文件的变量。一个设置在一个选项文件中列出每次服务器开始生效。例如,您可以设置变量my.cnf在主从双方文件如下

在主:

[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1 second

在每一个奴隶:

[mysqld]
rpl_semi_sync_slave_enabled=1

17.3.10.3半同步复制的监测

该插件的半同步复制能力暴露一些系统和状态变量,您可以检查以确定它的结构和运行状态。

系统变量反映了半同步复制配置。检查自己的价值观,用SHOW VARIABLES

MySQL的&#62;SHOW VARIABLES LIKE 'rpl_semi_sync%';

状态变量使您监控半同步复制的操作。检查自己的价值观,用SHOW STATUS

MySQL的&#62;SHOW STATUS LIKE 'Rpl_semi_sync%';

当主开关异步或半同步由于犯堵超时或奴隶追赶复制之间,它设置Rpl_semi_sync_master_status状态变量。自动回退从半同步异步复制的掌握意味着它可能rpl_semi_sync_master_enabled系统变量有一个价值1在主人身边即使半同步复制是不操作的目前的事实。你可以监控Rpl_semi_sync_master_status状态变量来确定是否掌握目前使用异步或半同步复制。

看看有多少奴隶半同步连接,检查Rpl_semi_sync_master_clients

提交数已公认的成功或失败的奴隶是指由Rpl_semi_sync_master_yes_txRpl_semi_sync_master_no_tx变量.

从站侧,Rpl_semi_sync_slave_status指示是否正在运行半同步复制。

17.3.11延迟复制

MySQL支持复制,从服务器执行交易后故意至少要比指定的时间延迟的主。本节介绍了如何配置一个奴隶复制延迟,以及如何监控复制延迟。

在MySQL 5.0,延迟复制的方法取决于两个时间戳,immediate_commit_timestamporiginal_commit_timestamp(见复制延迟时间戳)。如果在复制拓扑中的所有服务器都运行MySQL 8.0.1或以上,延迟复制使用这些时间戳测量。如果直接主从不使用这些时间戳,延迟复制MySQL 5.7的实现是使用(见延迟复制)。本节描述了延迟都是使用这些时间戳服务器之间的复制。

默认的复制延迟是零秒。使用CHANGE MASTER TO MASTER_DELAY=N语句设置延迟N秒。从主接收事务直到至少执行N晚于提交即时掌握秒。延迟发生的每笔交易(不如以前的MySQL版本)和实际延迟只是强加于gtid _ _事件日志anonymous_gtid_log_event。在交易的其他活动始终遵循这些事件没有任何等待时间强加给他们。

笔记

START SLAVESTOP SLAVE立即生效,忽略任何延迟。RESET SLAVE复位延迟到0

这个replication_applier_configuration性能模式表包含desired_delay列显示的延迟配置使用MASTER_DELAY选项这个replication_applier_status性能模式表包含remaining_delay列显示延迟秒数

延迟复制可用于多种用途:

  • 为了防止用户错误的主人。有延迟可以回滚一个延迟时间的奴隶之前的错误。

  • 测试系统的行为的时候,有一个滞后。例如,在应用程序中,一个滞后可能在重负载引起的奴隶。然而,很难产生这种负荷水平。延迟复制可以模拟滞而不必模拟负载。它也可以用来调试一个滞后的奴隶相关的条件。

  • 检查一下数据库看起来像在过去,而不必重新备份。例如,用一个星期的延迟配置的奴隶,如果你需要知道数据库以前的样子值得最后几天的发展,延迟的奴隶可以检查。

复制延迟时间戳

MySQL 8提供了一种新的方法测量的延迟(也被称为复制滞后)在复制拓扑中,取决于以下时间戳与每个交易gtid相关(而不是每个事件)写入二进制日志。

  • original_commit_timestamp:数微秒纪元以来交易时写的(承诺)对原主人的二进制日志。

  • immediate_commit_timestamp:数微秒纪元以来交易时写的(承诺)的即时掌握二进制日志。

输出mysqlbinlog两种格式显示这些时间戳,从时代和微秒TIMESTAMP格式,它是基于用户定义的时区为更好的可读性。例如:

#170404 10:48:05 server id 1  end_log_pos 233 CRC32 0x016ce647     GTID    last_committed=0   \ sequence_number=1    original_committed_timestamp=1491299285661130    immediate_commit_timestamp=1491299285843771# original_commit_timestamp=1491299285661130 (2017-04-04 10:48:05.661130 WEST)# immediate_commit_timestamp=1491299285843771 (2017-04-04 10:48:05.843771 WEST) /*!80001 SET @@session.original_commit_timestamp=1491299285661130*//*!*/;   SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1'/*!*/;# at 233

作为一项规则,这original_commit_timestamp总是相同的所有复制品交易的应用。在主从复制的original_commit_timestamp在一个交易(原创)大师的二进制日志总是为同一immediate_commit_timestamp。在奴隶的中继日志的original_commit_timestampimmediate_commit_timestamp该交易是在主人的二进制日志一样;而在自己的二进制日志,事务immediate_commit_timestamp相当于当奴隶提交事务。

在一组复制设置,当原来的主人是一个组的成员,该original_commit_timestamp时产生的交易准备承诺。换句话说,当它完成执行原来的主人及其写集准备发送到该组的所有成员认证。因此,相同的original_commit_timestamp复制到所有服务器(无论它是一个组的成员或从复制从一个成员)应用交易及各店在其二进制日志本地提交时使用immediate_commit_timestamp

看来改变的事件,这是组复制的专属,是一个特殊的例子。含有这些事件所产生的交易是每个服务器同gtid(所以,他们不是大师,然后复制到组,第一组的所有成员执行,但执行和运用同样的交易)。由于没有原来的主人,这些交易有其original_commit_timestamp设置为零

监视复制Delay

一个监视复制延迟的最常见的方式(滞后)在以前的版本是依靠Seconds_Behind_Master在输出字段表明奴隶的身份。然而,这个度量是不适合使用的复制拓扑时比传统的主从设置更复杂,如组复制。此外,immediate_commit_timestamporiginal_commit_timestampMySQL 8提供了一个更高的程度上对复制延迟信息。推荐的方法来监测在支持这些时间戳的拓扑复制延迟使用下列性能模式表。

  • replication_connection_status:连接的当前状态的主人,提供过去和当前事务的连接线程排队进入中继日志。

  • replication_applier_status_by_coordinator:协调员的线程,只显示信息,使用多线程的奴隶当现状,提供的信息在最后交易缓冲协调线程一个工人的队列,以及交易目前缓冲。

  • replication_applier_status_by_worker:线程的当前状态(S)将从主接收交易,提供有关通过敷贴线应用的交易信息,或者通过使用多线程时,每个工人的奴隶。

使用这些表格你可以监控关于过去交易对应的线程处理和事务线程当前正在处理的信息。这些信息包括:

  • 交易的gtid

  • 交易的original_commit_timestampimmediate_commit_timestamp,从奴隶的中继日志检索

  • 时间线开始处理事务

  • 在最后处理的事务,时间线程处理完它

除了性能架构表,输出SHOW SLAVE STATUS有三个字段显示:

  • SQL_Delay:一个非负整数表示配置使用的复制延迟CHANGE MASTER TO MASTER_DELAY=N,以秒为单位

  • SQL_Remaining_Delay:当slave_sql_running_stateWaiting until MASTER_DELAY seconds after master executed event本字段包含一个整数,表示左边的延迟秒数。在其他时候,这场无效的

  • Slave_SQL_Running_State:一个字符串表示的SQL线程的状态(类似于slave_io_state)。价值是相同的State值的SQL线程显示SHOW PROCESSLIST

当从SQL线程等待延迟时间执行一个事件之前,SHOW PROCESSLIST显示其状态价值Waiting until MASTER_DELAY seconds after master executed event

17.4复制笔记与心得

17.4.1复制的特点和问题

以下部分提供了有关支持和MySQL复制不是什么信息,并对特定的问题和可能发生的情况时,复制某些语句。

基于语句的复制取决于主人和奴隶之间的SQL兼容性。换句话说,成功的基于语句的复制要求任何SQL使用的功能是由主、从服务器支持。如果你使用一个功能,在主服务器上,只有在MySQL的当前版本,你不能复制一个奴隶使用较早版本的MySQL。这些不兼容的情况也可以发生在一个发布系列以及版本之间的。

如果你打算使用基于语句的复制MySQL 5.0和以前的MySQL版本系列之间,这是一个好主意,征询的版本MySQL参考手册对于这一系列相应的复制特性信息同期发布的系列。

MySQL是基于语句的复制,有可能复制存储过程或触发器的问题。你可以通过使用MySQL的基于行的复制来避免这些问题。一个详细的问题列表,看看23.7节,“二进制日志存储程序”。有关行的更多信息的记录和基于行的复制,看第5.4.4.1,“二进制日志格式”,和17.2.1,“复制格式”

具体的复制和附加信息InnoDB,看到15.18节,“InnoDB和MySQL复制”。关于MySQL集群复制信息,看NDB集群复制

17.4.1.1复制和自我维持

基于复制的声明AUTO_INCREMENTLAST_INSERT_ID(),和TIMESTAMP值进行了以下例外:

  • 一个语句调用触发器或功能更新的原因AUTO_INCREMENT柱是不可复制的正确使用基于语句的复制。这些陈述是标记为不安全。(错误# 45677)

  • 一个INSERT为表有一个主键,包括汽车列那不是这个组合键的第一列是不是安全的日志记录或复制的声明。这些陈述是标记为不安全。(错误# 11754117,错误# 45670)

    这个问题不影响表的使用InnoDB存储引擎,因为InnoDB表一汽车柱至少需要一个关键的地方自动递增列是唯一的或最左边的列。

  • 添加一个AUTO_INCREMENT列一个表ALTER TABLE不可能产生在奴隶和主人的相同行排序。这是因为在这行编号的顺序取决于特定的存储引擎用于表和订单中的行插入。如果是对主人和奴隶的重要次序,行粘贴前必须在指定汽车数。假设你想要添加一个AUTO_INCREMENT列一个表T1有柱col1COL2,下面的语句产生一个新的表t2相同T1但是有一个AUTO_INCREMENT专栏

    创建表T2像T1 T2;修改表添加ID int auto_increment主键;插入T2 SELECT * FROM T1的col1,col2;
    重要

    为了保证对主人和奴隶一样的排序,ORDER BY条款必须命名全部t1

    给的指令是受限制的CREATE TABLE ... LIKE:外键定义被忽略,因为是数据目录INDEX DIRECTORY表选项。如果一个表的定义包括任何的这些特点,创造T2使用CREATE TABLE声明是一个用于创建相同T1,但增加了AUTO_INCREMENT专栏

    无论方法用来创建和填充的内容有AUTO_INCREMENT柱,最后一步是把原来的表,然后重命名该副本:

    降T1;表重命名T1 T2;

    参见第b.5.6.1,“问题表”

17.4.1.2复制和黑洞的表

这个BLACKHOLE存储引擎接受数据,但丢弃它不存储。执行二进制日志时,所有的插入这样的表格总是登录,无论使用的记录格式。更新和删除是不同的处理取决于基或基于行的日志语句中使用。基于测井格式声明,所有报表的影响黑洞表记录,但其影响不容忽视。使用基于行的记录时,更新和删除这些表是简单地跳过他们不写入二进制日志。警告记录,每当发生这种情况。

因为这个原因,我们建议当你复制到表的使用BLACKHOLE存储引擎,你有binlog_format服务器变量设置为声明,和不ROW混合的

17.4.1.3复制和字符集

以下适用于MySQL服务器使用不同的字符集之间的复制:

  • 如果主人有一个字符集不同于全局数据库character_set_server价值,你应该设计你的CREATE TABLE语句使他们不隐式依赖于数据库的默认字符集。一个好的解决方法是国家字符集和整理,明确CREATE TABLE声明.

17.4.1.4复制和校验表

CHECKSUM TABLE返回一个校验码,是由一排排计算,使用的方法取决于表的行存储格式。存储格式不保证不变之间的MySQL版本,所以校验值可能会改变以下升级。

17.4.1.5复制创建服务器,修改服务器,并将服务器

报表CREATE SERVERALTER SERVER,和DROP SERVER不写入二进制日志,无论其二进制日志格式,使用。

17.4.1.6复制创建…如果不存在报表

MySQL应用这些规则时,各种CREATE ... IF NOT EXISTS报表复制:

17.4.1.7复制创建表…SELECT语句

MySQL应用这些规则时,CREATE TABLE ... SELECT报表复制:

当基于语句的复制使用,MySQL 8不允许CREATE TABLE ... SELECT陈述以外的表是由语句创建表的任何变化。这是不是一个问题,使用基于行的复制时,因为语句将作为CREATE TABLE与表数据行插入事件的任何变化的声明,而不是整个CREATE TABLE ... SELECT

17.4.1.8复制current_user()

下面的语句支持使用CURRENT_USER()函数取的名字的地方,可能是主机,受影响的用户或者:

当启用了二进制日志,CURRENT_USER()CURRENT_USER作为在任何这些语句的定义,MySQL服务器保证声明适用于相同的用户对主人和奴隶当语句复制。在某些情况下,如报表,修改密码,功能参考扩展之前被写入到二进制日志,使语句包含用户名。在所有其他情况下,在掌握当前用户的名称复制到奴隶为元数据,和奴隶将语句为当前用户的元数据命名,而不是从当前用户。

17.4.1.9复制不同的表定义在大师和Slave

复制的源和目标表不一定是相同的。一个在主表可以有更多或更少的列的表比奴隶的副本。此外,相应的表列在主人与奴隶可以使用不同的数据类型,在一定条件下。

笔记

复制表之间隔开的另一个不同是不支持的。看到第17.4.1.24,“复制分区”

在源和目标表不具有相同的定义的所有情况下,数据库和表的名称必须在主人和奴隶是一样的。讨论,结合实例附加条件,在之后的两个部分。

17.4.1.9.1复制主或Slave更多的列

你可以复制一个表主从这样的主从表的副本有不同的列数,须符合下列条件:

  • 列常见的表的两个版本必须定义在相同的顺序在主人与奴隶。

    (即使两个表的列数相同,这是真的)

  • 列常见的表的两个版本必须在任何额外的列定义。

    这意味着执行ALTER TABLE在一个新的柱插入表内的列常见的范围表导致复制失败的奴隶的声明,如下面的示例所示:

    假设一个表t,在主人与奴隶的存在,是由以下定义CREATE TABLE声明:

    创建表(C1 C2 C3 int,int,int);

    假设ALTER TABLE声明所示是奴隶执行:

    修改表添加列在C3 cnew1 int;

    以前的ALTER TABLE允许在奴隶因为列C1c2,和C3这是两个版本的常见表t保持集中在表的两个版本,之前的任何列不同。

    然而,以下ALTER TABLE语句不能执行的奴隶而不引起复制打破:

    修改表添加列在C2 cnew2 int;

    复制的奴隶执行失败后ALTER TABLE声明显示,因为新的列cnew2是柱间共同的版本t

  • 每个额外在桌子上有多个列的版本列必须有一个默认值。

    列的默认值是由许多因素决定,包括它的类型,它是否有一个DEFAULT选择,无论是声明为无效的,和服务器的SQL模式的影响在其创作时间;有关更多信息,参见11.7节,“数据类型的默认值”

此外,当表的副本的奴隶比主人的复制多个列,每列的表格常见必须在表格中使用相同的数据类型。

实例下面的例子说明了一些有效和无效的表定义:

在掌握更多的列下表定义是有效和正确地复制:

master> CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);
slave>  CREATE TABLE t1 (c1 INT, c2 INT);

下表定义将引发错误,因为共同的列表的两个版本的定义是在一个不同的顺序对奴隶比他们的主人:

master> CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);
slave>  CREATE TABLE t1 (c2 INT, c1 INT);

下表定义也会引发错误,因为在主柱外的定义出现在列的常见表的两个版本的定义:

master> CREATE TABLE t1 (c3 INT, c1 INT, c2 INT);
slave>  CREATE TABLE t1 (c1 INT, c2 INT);

在从多个列下表定义是有效和正确地复制:

master> CREATE TABLE t1 (c1 INT, c2 INT);
slave>  CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);
                  

下列定义引发错误,因为柱共同表的两个版本没有被定义在相同的顺序在主人与奴隶:

master> CREATE TABLE t1 (c1 INT, c2 INT);
slave>  CREATE TABLE t1 (c2 INT, c1 INT, c3 INT);

下表定义也引发错误,因为在奴隶的版本的表柱外的定义出现在表的版本都是常见的列的定义:

master> CREATE TABLE t1 (c1 INT, c2 INT);
slave>  CREATE TABLE t1 (c3 INT, c1 INT, c2 INT);

下表定义失败是因为奴隶的版本的表相比,大师的版本有额外的列,和两个版本的表使用不同的数据类型的列c2

硕士CREATE TABLE t1 (c1 INT, c2 BIGINT);奴隶CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);
17.4.1.9.2复制具有不同数据类型的列

相应的列上硕士和同桌的奴隶的副本应当具有相同的数据类型。然而,这并不总是严格执行,只要满足一定的条件。

它通常是可以复制的一列从一个给定的数据类型到另一列相同的类型及大小或宽度,适用或更大。例如,您可以复制从CHAR(10)列到另一个char(10),或从CHAR(10)列一个char(25)没有任何问题列。在某些情况下,还可以复制从一列具有一个数据类型(在主)到具有不同数据类型的列(在奴隶);当柱的主版本的数据类型提升为一个类型是相同的大小或更大的奴隶,这被称为属性提升

属性提升可以用于与基于语句和基于行的复制,而不依赖于任何主人或奴隶使用存储引擎。然而,记录格式的选择并不被允许的类型转换的效果;详情在后面讨论。

重要

你是否使用或基于基于行的复制表,表的不能奴隶的副本包含更多的柱比硕士如果你想使用属性提升。

基于语句的复制当使用基于语句的复制,一个简单的经验法则,遵循的是,如果在主报表运行也会对奴隶的成功执行,它也应该复制成功。换句话说,如果语句使用一个值是一个给定的列在奴隶的类型兼容,声明可以复制。例如,你可以插入任何值,适合在TINYINT列为bigint柱为好;因此,即使你改变一个类型TINYINT在一张桌子的奴隶的复制列bigint,任何插入列在主的成功也应该成功的奴隶,因为它是不可能有法律TINYINT值足够大到超过bigint专栏

基于行的复制:属性升级和降级。基于行的复制支持较小的数据类型和大类型之间的属性升级和降级。它也可以指定是否允许有损(截断)或非有损转换降级列值,正如在本节稍后。

Lassy和Non-lossy转换。如果在目标类型不代表被插入的值,必须决定如何处理转换。如果我们允许转换但截断(或修改)源的价值实现适合在目标栏,我们所谓的有损转换。转换不需要截断或拟合源列的值在目标列类似的修改是一个非有损转换

类型转换模式(斯拉夫_ _型转换变量)。的设置slave_type_conversions全局服务器上使用变量控制奴隶的类型转换模式。这个变量的值的集合,从下面的列表中,它描述了每个模式的奴隶的类型转换行为的影响:

所有_ lossy

在这种模式中,类型转换意味着信息的丢失是允许的。

这并不意味着非有损转换是允许的,仅仅只有案件需要有损转换或没有在所有的转换都是允许的;例如,使只有这种模式允许INT柱被转换为TINYINT(一种有损转换),但不是一个TINYINT列一个国际的柱(无损耗)。在后者的转换在这种情况下会导致复制停止错误的奴隶。

所有非lossy _ _

这种模式允许转换不需要源值截断或其他特殊处理;即,它允许转换的目标类型具有比源类型广泛。

设置该模式是否有损转换是不允许轴承;这是可控的ALL_LOSSY模式。只要所有非lossy _ _是集,但不ALL_LOSSY,然后尝试转换会导致数据丢失(如国际的TINYINT,或char(25)VARCHAR(20))使奴隶停止错误

所有_ lossy,所有非lossy _ _

在该模式下,所有支持的类型转换是允许的,无论是否有损转换。

all_signed

对提升整数类型的值(默认行为)签署。

all_unsigned

对提升整数类型为无符号值。

all_signed,all_unsigned

对提升整数类型签署,如果可能的话,否则为无符号。

空的]

什么时候slave_type_conversions没有设定,没有属性升级或降级是允许的;这意味着在源和目标表的所有列必须是同一类型。

这种模式是默认的

当一个整数类型的推广,它的符号是不保留。默认情况下,所有的奴隶对待诸如签署。你可以使用这个行为控制ALL_SIGNEDall_unsigned,或两者ALL_SIGNED告诉奴隶对待所有提升整数类型符号;all_unsigned指示它处理这些符号。指定导致奴隶对待价值作为签署如果可能,否则视为无符号;所列出的顺序是不重要的。既不ALL_SIGNED也没有all_unsigned如果有任何影响的至少一个ALL_LOSSY所有_ nonlossy是不是也用

改变类型转换模式需要新的奴隶重新启动slave_type_conversions设置

支持转换支持不同数据类型之间的转换但类似以下列表显示:

  • 任何整数类型之间TINYINTSMALLINTMEDIUMINTINT,和BIGINT

    这包括在签署这些类型unsigned版本转换。

    有损转换是通过截断源值最大(或最小)制成的目标列允许。为确保无损转换,从符号到符号类型、目标列必须足够大以容纳源列中的值的范围。例如,你可以降级TINYINT UNSIGNED非有损于smallint,但不TINYINT

  • 任何十进制类型之间DECIMALFLOATDOUBLE,和NUMERIC

    FLOAT是一种无损转换;DOUBLE只能处理有损。从转换DECIMAL(M,D)(小数点M'D'哪里D'>=DM'D') >= (MD)是非有损;任何情况下M'<MD'<D,或两者兼而有之,不仅有损转换可。

    任何的十进制类型,如果要存储不适合目标类型的值,该值是根据圆形向下舍入规则文档中的其他服务器定义。看到第12.23.4,“舍入行为”,有关这是十进制类型。

  • 任何字符串类型之间CHARVARCHAR,和TEXT之间的转换,包括不同的宽度。

    转化的研究CHARvarchar,或TEXT一个烧焦VARCHAR,或文本柱大小相同或更大的不失真。有损转换是通过插入只有前处理N对奴隶的字符串中的字符,在N是目标列的宽度

    重要

    使用不同的字符集的列之间的复制是不支持的。

  • 任意二进制数据类型之间的BINARYVARBINARY,和BLOB之间的转换,包括不同的宽度。

    转化的研究BINARYvarbinary,或BLOB一个二元的VARBINARY,或斑点柱大小相同或更大的不失真。有损转换是通过插入只有前处理N对奴隶的字符串的字节,其中N是目标列的宽度

  • 之间的任何2BIT任何两尺寸柱

    当插入一个值从BIT(M)列为位(M'列,其中M'&#62;M,在最重要的位位(M'列被清除(设置为0)和M位的位(M价值设定的最低有效位位(M'专栏

    当插入一个值从源BIT(M)列为目标位(M'列,其中M'<M最大值的最大值位(M'为列分配;换句话说,一个所有的设置值赋给目标列

之间的转换类型不在之前的名单是不允许的。

17.4.1.10复制目录选项

如果一个DATA DIRECTORY索引目录表格选项中使用CREATE TABLE主服务器上的表,表的选择上也采用了奴隶。可如果没有相应的目录存在于奴隶主文件系统或如果它存在但不到从服务器访问的问题。这也可以被使用NO_DIR_IN_CREATE服务器的SQL模式的奴隶,使奴隶的忽视数据目录INDEX DIRECTORY折叠时的表选项CREATE TABLE声明.结果是,MyISAM数据和索引文件中的数据库目录中创建表。

有关更多信息,参见第5.1.10,”服务器的SQL模式”

17.4.1.11复制滴…如果存在语句

这个DROP DATABASE IF EXISTSDROP TABLE IF EXISTS,和DROP VIEW IF EXISTS语句总是复制,即使数据库、表、视图或被丢弃,不在主的存在。这是为了确保被丢弃不再是主人或奴隶的存在对象,一旦奴隶已经赶上了大师。

DROP ... IF EXISTS用于存储程序语句(存储过程和函数、触发器和事件)也被复制,即使存储程序被删除不存在的主。

17.4.1.12复制和浮点值

与基于语句的复制,价值观是从十进制转换为二进制。因为十进制和二进制表示他们可能近似之间的转换,涉及浮点值的比较是不准确的。此操作使用浮点值的明确是真实的,或者使用价值,转换为浮点型隐。浮点值的比较会产生不同的结果,由于在计算机体系结构的差异,主从服务器编译器用来建立MySQL,等等。看到12.2节,“表达评价类型转换”,和第b.5.4.8,“浮点数”的问题

17.4.1.13复制和冲洗

的一些形式FLUSH声明中没有记录因为他们如果复制到奴隶问题:FLUSH LOGSFLUSH TABLES WITH READ LOCK。一个语法的例子,看第13.7.7.3“同花顺语法”。这个FLUSH TABLESANALYZE TABLEOPTIMIZE TABLE,和REPAIR TABLE语句写入二进制日志并复制到奴隶。这通常不是一个问题,因为这些语句不修改表中的数据。

然而,这种行为会造成困难,在某些情况下。如果你复制的权限表中mysql数据库和更新这些表的情况下直接使用GRANT,你必须发出一个FLUSH PRIVILEGES在把新特权生效的奴隶。另外,如果你使用FLUSH TABLES当重命名MyISAM表中的一部分MERGE表格,你必须发出FLUSH TABLES手动的奴隶。这些陈述都写入二进制日志,除非你指定no_write_to_binlog或是它的别名LOCAL

17.4.1.14复制和系统功能

某些功能没有很好地复制在一定条件下:

  • 这个USER()CURRENT_USER()(或CURRENT_USER),UUID()VERSION(),和LOAD_FILE()功能是复制不改变因此不能可靠地工作在奴隶除非基于行的复制启用。(见17.2.1,“复制格式”。)

    USER()CURRENT_USER()自动复制使用时,使用基于行的复制混合的模式,并生成一个警告STATEMENT模式。(参见第17.4.1.8,“current_user()”复制This is also true forVERSION()RAND()

  • NOW()二进制日志包含时间戳。这意味着价值返回的调用这个函数在主复制到奴隶。为了避免意外的结果复制时在MySQL服务器在不同的时区,设置时区对主人和奴隶。参见第17.4.1.33,“复制和时区”

    说明潜在的问题复制时,在不同的时区服务器之间,假设主位于纽约,从位于斯德哥尔摩和服务器使用本地时间。进一步假设,在主,你创建一个表mytable,执行INSERT在这个表的语句,然后选择从表,如下所示:

    MySQL的&#62;CREATE TABLE mytable (mycol TEXT);查询行,0行受影响(0.06秒)MySQL &#62;INSERT INTO mytable VALUES ( NOW() );查询行,1行的影响(0秒)MySQL &#62;SELECT * FROM mytable;| mycol |,意图,意图| 2009年09月01 | 12:00:00,意图在1行集(0秒)

    斯德哥尔摩当地时间比纽约晚6小时;所以,如果你的问题SELECT NOW()在同一瞬间的奴隶,价值2009-09-01 18:00:00返回。因此,如果从奴隶的副本选择你mytableCREATE TABLEINSERT报表只显示已复制,你可能期望论文包含的价值2009-09-01 18:00:00。然而,这是没有的情况下;当你选择从奴隶的份空白表,你得到完全相同的结果作为主人:

    mysql> SELECT * FROM mytable;
    +---------------------+
    | mycol               |
    +---------------------+
    | 2009-09-01 12:00:00 |
    +---------------------+
    1 row in set (0.00 sec)
    

    不像NOW(),的SYSDATE()功能的复制是不安全的因为它是不受影响设置时间戳如果报表基于测井中使用的二进制日志报表和不确定性。这不是一个问题,如果使用基于行的日志。

    一种选择是使用--sysdate-is-now选择的原因SYSDATE()是一个别名NOW()。这必须是在主人与奴隶的正确工作做。在这种情况下,警告仍通过此功能发布,但可以安全地忽略只要--sysdate-is-now是用在主人与奴隶

    SYSDATE()自动复制使用时,使用基于行的复制混合的模式,并生成一个警告STATEMENT模式

    参见第17.4.1.33,“复制和时区”

  • 以下限制适用于基于语句的复制,而不是基于行的复制。这个GET_LOCK()RELEASE_LOCK()IS_FREE_LOCK(),和IS_USED_LOCK()处理用户级锁的复制没有奴隶了解并发上下文在主函数。因此,这些功能不应该被用来插入主表因为奴隶的内容也会有所不同。例如,不发表声明,如插入表值(get_lock(…))

    这些功能是自动复制使用行时,使用基于复制MIXED模式,并生成一个警告声明模式

作为一个前局限性的解决方法时,基于语句的复制效果,你可以使用一个用户变量保存问题的功能效果的策略和在后来的声明的变量。例如,下面的一行INSERT存在的参考UUID()功能:

插入T值(uuid());

解决问题,而不是:

SET @my_uuid = UUID();
INSERT INTO t VALUES(@my_uuid);

这个语句序列重复,因为价值@my_uuid存储在二进制日志作为一个用户变量事件之前的INSERT声明和使用的INSERT

同样的想法适用于多行插入,但更多的是繁琐的使用。12行插入,你可以这样做:

SET @my_uuid1 = UUID(); @my_uuid2 = UUID();
INSERT INTO t VALUES(@my_uuid1),(@my_uuid2);

然而,如果行数很大或是未知的,解决方法是困难的或不可能的。例如,你不能把下列陈述一个给定的个人用户变量是每一行的:

INSERT INTO t2 SELECT UUID(), * FROM t1;

在存储函数,RAND()复制正确只要它被调用一次该函数的执行过程。(你可以考虑函数的执行时间戳和随机数种子为隐式输入,在主人和奴隶是相同的)

这个FOUND_ROWS()ROW_COUNT()函数是不可复制的可靠使用基于语句的复制。一个解决方案是存储在用户变量的函数调用的结果,然后利用在INSERT声明。例如,如果你希望将结果存储在一个表名空白表,你通常会做这样:

SELECT SQL_CALC_FOUND_ROWS FROM mytable LIMIT 1;
INSERT INTO mytable VALUES( FOUND_ROWS() );

然而,如果你是复制的mytable,你应该使用SELECT ... INTO,然后存储的变量表中,这样:

从表1 sql_calc_found_rows选择限制为“found_rows;插入表值(@ found_rows);

在这种方式中,用户变量复制作为语境的一部分,并将其应用于从正确。

这些功能是自动复制使用行时,使用基于复制MIXED模式,并生成一个警告声明模式。(错误# 12092,错误# 30244)

17.4.1.15复制和秒的小数部分的支持

MySQL 8允许小数秒TIMEDATETIME,和TIMESTAMP值,以微秒(6位数)精度。看到第11.3.6,“小数秒的时间价值”

可能会有问题,复制从主服务器理解分数秒奴隶使用MySQL 5.6版本比不了解他们之前。为CREATE TABLE报表包含的列,有一个fsp(小数秒精度)值大于0,复制将由于分析器错误,失败,和一些表达的结果会对主人和奴隶的区别。语句中使用的时态数据类型与fsp0的值将为基于语句的记录但不是基于行的日志。注意,然而,复制从一个较新的主人老奴隶不是推荐配置。

17.4.1.16复制调用功能

调用的功能如用户自定义函数(UDF)和复制程序存储(存储过程、函数、触发器、事件)提供了以下特点:

以确定是否有任何预定的事件在一个MySQL服务器,在不同的服务器上创建的(这是作为一个复制),查询INFORMATION_SCHEMA.EVENTS类似的方式在这里显示什么表:

SELECT EVENT_SCHEMA, EVENT_NAME    FROM INFORMATION_SCHEMA.EVENTS    WHERE STATUS = 'SLAVESIDE_DISABLED';

或者,您可以使用SHOW EVENTS声明,像这样:

SHOW EVENTS    WHERE STATUS = 'SLAVESIDE_DISABLED';

当有这样的活动,促进复制复制的奴隶,你必须使每个事件使用ALTER EVENT event_name ENABLE,在那里event_name冰的事件的名称

如果超过一个大师参与创建这个奴隶的事件,你希望确定,只有在一个给定的具有服务器ID大师所创造的事件master_id,在修改以前的查询EVENTS表包括鼻祖列,如下所示:

SELECT EVENT_SCHEMA, EVENT_NAME, ORIGINATOR
    FROM INFORMATION_SCHEMA.EVENTS
    WHERE STATUS = 'SLAVESIDE_DISABLED'
    AND   ORIGINATOR = 'master_id'

你可以使用ORIGINATORSHOW EVENTS在一个类似的时尚:

SHOW EVENTS    WHERE STATUS = 'SLAVESIDE_DISABLED'    AND   ORIGINATOR = 'master_id&#39;

启用前,从主复制事件,你应该禁用从MySQL事件调度器(使用这样一个语句SET GLOBAL event_scheduler = OFF;),运行任何必要ALTER EVENT报表,重新启动服务器,然后重新启用事件调度器的奴隶之后(使用这样一个语句SET GLOBAL event_scheduler = ON;)—

如果你以后把新主人回是一个复制的奴隶,你必须手动启用禁用所有事件的ALTER EVENT声明.你可以通过在一个单独的表中的事件名称存储SELECT声明表明,或使用ALTER EVENT语句重命名事件与一个共同的前缀如replicated _识别它们

如果您重命名的事件,然后将这个服务器重新复制的奴隶,你可以找出事件的质疑EVENTS表,如下所示:

SELECT CONCAT(EVENT_SCHEMA, '.', EVENT_NAME) AS 'Db.Event'      FROM INFORMATION_SCHEMA.EVENTS      WHERE INSTR(EVENT_NAME, 'replicated_') = 1;

17.4.1.17 JSON文件复制

在MySQL 8中,一个JSON列的更新总是写入二进制日志文件的完整。在MySQL 8中,它是可能的日志部分更新到JSON文档(参见JSON值部分更新),这是更有效的。伐木行为取决于所用的格式,这里描述的:

基于语句的复制JSON部分更新总是记录作为部分更新。这不能被禁用时,采用基于语句的日志。

基于行的复制JSON部分更新没有登录的默认,而是记录完整的文件。对部分更新日志启用,集binlog_row_value_options=PARTIAL_JSON。如果复制这个变量设置,从总体的处理和运用复制奴隶无论为变奴隶的自己设置的接收部分更新。

运行MySQL 8.0.2或更早版本的服务器不识别用于JSON部分更新日志事件。因为这个原因,当复制这样的服务器从服务器上运行MySQL 8.0.3或后,binlog_row_value_options必须通过设置这个变量来禁用主&#39; &#39;(空字符串)。更多信息请查看该变量的描述。

17.4.1.18 replication和限制

基于复制的声明LIMIT条款DELETEUPDATE,和INSERT ... SELECT报表是不安全的自排的顺序是不确定的影响。(这样的语句可以正确复制与基于语句的复制只有同时包含顺序条款。)这样的语句时:

  • 当使用STATEMENT模式,一个警告,声明是不安全的基于语句的复制已发布。

    当使用STATEMENT模式,是DML语句包含发出警告极限即使他们也有一个ORDER BY条款(因此是确定的)。这是一个已知的问题。(错误# 42851)

  • 当使用MIXED模式,现在语句自动复制使用基于行的模式。

17.4.1.19复制和负载数据的导入导出

LOAD DATA INFILE被认为是不安全的声明基于测井(见第17.2.1.3,“确定安全和不安全的语句在二进制日志”页:1当binlog_format=MIXED是集,声明中记录的基于行的格式。什么时候binlog_format=STATEMENT设置,注意LOAD DATA INFILE不会产生一个警告,不像其他不安全的声明。

什么时候mysqlbinlog读取日志事件LOAD DATA INFILE报表登录基于语句的格式,生成的文件是一个临时目录中创建。这些临时文件不会自动删除mysqlbinlog或任何其他MySQL程序。如果你使用LOAD DATA INFILE基于二进制日志记录语句的语句,你应该在你之后不再需要声明自己的日志删除临时文件。有关更多信息,参见4.6.8“,”mysqlbinlog用于处理二进制日志文件实用程序”

17.4.1.20复制和max_allowed_packet

max_allowed_packet集在MySQL服务器和客户端之间的任何一个消息的大小上限,包括复制的奴隶。如果你是复制大列的值(如有可能找到TEXTBLOB列)和max_allowed_packet太小的主人,主人的失败,错误,和奴隶关闭I/O线程。如果max_allowed_packet太小的奴隶,这也导致奴隶停止I/O线程。

基于行的复制目前将所有柱和更新行主从列值,包括列值实际上没有被更新。这意味着,当你复制大列值使用基于行的复制,你必须小心设置max_allowed_packet大到足以容纳任何表中要复制的最大行,即使你是复制更新,或者你只插入相对小的值。

在一个多线程的奴隶(与slave_parallel_workers > 0),确保slave_pending_jobs_size_max系统变量设置为等于或大于的设置max_allowed_packet在主系统变量。设置为默认slave_pending_jobs_size_max,128M,两次设置为默认max_allowed_packet64M,which is。max_allowed_packet限制,主机将发送数据包的大小,而是一个事件标题的加入可以产生一个二进制日志事件超过这个尺寸。同时,在基于行的复制,一个事件可以明显大于max_allowed_packet的大小,因为价值max_allowed_packet唯一的限制,每个列的表。

复制从实际上接受数据包到极限了slave_max_allowed_packet设置到最大设置1GB的默认设置,以防止复制失败由于大型包。然而,价值slave_pending_jobs_size_max控制存储器,可在奴隶把传入的数据包。指定的内存都是奴隶工人队列之间共享。

价值slave_pending_jobs_size_max是一种软限制,如果一个非常大的事件(由一个或多个数据包)超过这个大小,交易直到所有奴隶工人有空队列,然后处理。所有后续的交易才举行大型的交易已经完成。所以虽然不寻常的事件比slave_pending_jobs_size_max可加工,延迟清除所有的奴隶工人的队列和等待队列的后续交易会导致滞后对复制的奴隶和奴隶工人减少并发。slave_pending_jobs_size_max因此应设置足够高的适应最期望的事件的大小。

17.4.1.21复制记忆表

当主服务器关闭和重新启动,其MEMORY表成空。复制此效果的奴隶,第一次使用一个给定的主MEMORY表启动后,它记录事件通知奴隶的表必须是空的写DELETE该表的二进制日志语句。

当一个从服务器,关闭和重新启动,其MEMORY表成空。这使得奴隶是同步性的主人,可能会导致其他故障或导致奴隶停止:

重新启动的奴隶是复制的安全方法MEMORY表是第一滴或从中删除所有行MEMORY在主表,等到这些变化复制到奴隶。那么它是安全启动的奴隶。

另一种启动方法可以应用在某些情况下。什么时候binlog_format=ROW,你可以如果你设置防止奴隶停止slave_exec_mode=IDEMPOTENT在你开始之前的奴隶了。这让奴隶继续复制,但其MEMORY表仍然是不同于主。这可以是好的如果应用程序的逻辑是这样的内容MEMORY表格可以安全地失去了(例如,如果MEMORY用于解析的表格slave_exec_mode=IDEMPOTENT适用于全球所有的表,所以它可能隐藏其他复制错误非—MEMORY

大小MEMORY表的价值有限max_heap_table_size系统变量,是不可复制的(见第17.4.1.39,“复制和变量”)。一个变化max_heap_table_size以效果内存表创建或更新使用ALTER TABLE ... ENGINE = MEMORYTRUNCATE TABLE以下的变化,或所有MEMORY以下服务器重启表。如果你增加值这一变量对主人对奴隶没有这样做,它成为在主表的增长大于其对应的奴隶可能导致插入成功大师但失败的奴隶桌上摆满了错误.这是一个已知的问题(bug # 48666)。在这种情况下,你必须树立全球价值max_heap_table_size在奴隶和主人,然后重新启动复制。建议您重新启动主从MySQL服务器,以确保新的价值以完整的(全球)对它们的影响。

看到16.3节,“存储引擎”为更多的信息,MEMORY

17.4.1.22复制MySQL数据库系统

数据修改语句向表中mysql数据库复制按值binlog_format如果此值;混合的,这些陈述是复制使用基于行的格式。然而,语句通常会更新此信息间接GRANTREVOKE,和报表操纵触发器、存储例程,和视图复制到使用基于语句的复制的奴隶。

17.4.1.23复制和查询优化器

在主从数据如果声明是这样写的:数据修改是不确定性成为不同它是可能的;即,由查询优化器。(一般来说,这不是一个好的实践,甚至复制之外。)不确定陈述的例子包括DELETEUPDATE语句中使用极限没有ORDER BY条款;看第17.4.1.18,“复制和限制”,对于这些详细的讨论。

17.4.1.24复制和分区

复制支持之间的分区表只要他们使用相同的分区方案和其他有相同的结构,除了一个例外是特别允许(见第17.4.1.9,“复制不同的表定义在大师和Slave”

不是一般的支持具有不同的分区表之间复制。这是因为报表(如ALTER TABLE ... DROP PARTITION)直接作用在这种情况下的分区可以在主人和奴隶产生不同的结果。在这种情况下,一个表分区的主人而不是奴隶,任何陈述对奴隶主的复制分区操作失败的奴隶。当表的奴隶的复制分区但主人的副本不,陈述对分区不能运行在主不出现错误有。

由于这些危险导致复制失败完全(对失败的声明帐户)和不一致(当结果分区SQL语句对主人和奴隶产生不同的结果),我们建议确保分区的任何表是从主复制是由这些表的奴隶的版本匹配。

17.4.1.25复制和修复表

当使用损坏或其他损坏的表,因为它是可能的REPAIR TABLE语句删除,不可恢复的行。然而,任何此类修改表中的数据进行这样的声明是不可复制的,它可以使主人和奴隶失去同步。为此,在事件,在主表和你使用的损坏REPAIR TABLE修复它,你首先应该停止复制(如果它仍然运行)使用前REPAIR TABLE,然后比较主人和奴隶的表的副本和准备正确的任何差异手动重新启动前复制。

17.4.1.26复制和保留字

你能遇到的问题,当你试图复制从旧到新的奴隶主,你是保留字在新的MySQL版本上运行的奴隶主利用标识符。例如,一个表的列命名rank在MySQL 5.7的主人是复制到MySQL 8的奴隶可能导致问题的原因在MySQL 8中的一个保留字开始。

复制可以在错误1064例失败你的错误在您的SQL语法…即使一个数据库或表使用保留字或具有柱使用保留字命名表命名排除复制。这是由于这样的事实,每个SQL事件必须被解析的奴隶之前执行,所以从知道哪些数据库对象或对象会受到影响。只有在事件发生后进行解析,可以适用于任何过滤规则定义的奴隶--replicate-do-db--replicate-do-table--replicate-ignore-db,和--replicate-ignore-table

围绕工作数据库、表或列的名称问题,在掌握这将被视为保留字的奴隶,做下列之一:

  • 使用一个或多个ALTER TABLE陈述大师改名字任何数据库对象,这些名称是保留字的奴隶,和改变任何使用旧名称,而不是使用新名称的SQL语句。

  • 在任何SQL语句中使用这些数据库对象的名字,写的名字引用标识符使用那些字符(`

为保留字列表的MySQL版本,看保留字,在MySQL服务器版本的参考。标识符的引用规则,看第二,“架构对象名称”

17.4.1.27复制服务器端的帮助表

服务器维护中的表mysql用于存储信息的数据库HELP声明(见第13.8.3,“语法”。这些表可以手动加载如第5.1.13,“服务器端”

帮助表格内容来自MySQL参考手册。有手册,具体到每一个MySQL版本系列版本,所以帮助内容是具体到每个系列以及。通常情况下,你装的版本与服务器版本的帮助内容。这会影响复制。例如,你可以加载MySQL 5.7帮助内容到一个MySQL 5.7的主服务器,但不一定复制内容到一个MySQL 8的从属服务器,8帮助内容更合适。

本节介绍了如何管理帮助表格内容升级你的服务器参与复制。服务器的版本在这项任务中的一个因素。另一个是表结构可以帮助主人与奴隶之间的不同。

假定帮助内容存储在一个文件名为fill_help_tables.sql。在MySQL中分布,此文件位于下分享share/mysql目录,以及最新的版本是可供下载dev.mysql.com http:/ / / / index-other.html DOC

升级帮助表,使用下面的过程。连接参数不显示为MySQL命令在这里讨论;在所有情况下,连接到使用一个帐户服务器等root已经在修改表的权限MySQL数据库

  1. 通过运行你的服务器升级mysql_upgrade第一个奴隶,然后在主。这是第一次升级奴隶的一般原理。

  2. 决定是否要复制表的内容,从帮助主人的奴隶。如果没有,加载内容的掌握和每个从单独。否则,检查并解决任何不兼容的帮助表结构之间的主人和奴隶,然后加载内容为主,让它复制到奴隶。

    关于这两种加载方法帮助表格内容详细如下。

加载帮助表内容没有复制的奴隶

没有复制加载帮助表格内容,运行这个命令在主和每一个奴隶单独使用fill_help_tables.sql含有适当的服务器版本内容文件:

mysql mysql < fill_help_tables.sql
与复制到奴隶加载帮助表格内容

如果你想复制的帮助表内容检查表,帮助你主人和奴隶之间不兼容。这个url列在帮助_ categoryhelp_topic表最初char(128),但TEXT在最新的MySQL版本适应较长的网址。检查有助于表结构,使用此语句:

SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPEFROM INFORMATION_SCHEMA.COLUMNSWHERE TABLE_SCHEMA = 'mysql'AND COLUMN_NAME = 'url';

与旧的结构表,产生这一结果的声明:

+---------------+-------------+-------------+
| TABLE_NAME    | COLUMN_NAME | COLUMN_TYPE |
+---------------+-------------+-------------+
| help_category | url         | char(128)   |
| help_topic    | url         | char(128)   |
+---------------+-------------+-------------+

用新的结构表,产生这一结果的声明:

+---------------+-------------+-------------+
| TABLE_NAME    | COLUMN_NAME | COLUMN_TYPE |
+---------------+-------------+-------------+
| help_category | url         | text        |
| help_topic    | url         | text        |
+---------------+-------------+-------------+

如果主人和奴隶都有旧的结构或有新的结构,它们是兼容的,你可以复制在主执行这个命令的帮助表内容:

mysql mysql < fill_help_tables.sql

表格内容加载到主,然后复制到奴隶。

如果主人和奴隶有不兼容的帮助表(一个服务器有旧的结构和其他新的),你有没有复制之间的帮助表内容毕竟选择,或使表结构兼容,你可以复制的内容。

  • 如果你决定不复制内容毕竟升级主和奴隶单独使用MySQL--init-command选项,如前所述

  • 如果你决定让表结构兼容,升级,旧服务器的表结构。假设你的主服务器有旧表结构。升级表手动执行这些语句的新结构(二进制日志是残疾人来防止对已经有新结构的奴隶,改变复制):

    SET sql_log_bin=0;
    ALTER TABLE mysql.help_category ALTER COLUMN url TEXT;
    ALTER TABLE mysql.help_topic ALTER COLUMN url TEXT;
    

    然后运行这个命令在主:

    mysql mysql < fill_help_tables.sql
    

    表格内容加载到主,然后复制到奴隶。

17.4.1.28复制和主从停工

它是安全的关闭主服务器,重新启动之后。当一个奴隶失去连接到主,奴隶试图重新立即重试周期如果失败。默认是每六十秒重试。这可能会改变的CHANGE MASTER TO声明。一个奴隶也能处理网络连接中断。不过,从公告的网络中断,只有从主接收任何数据后slave_net_timeout秒。如果你的中断是短暂的,你可能要减少slave_net_timeout。看到第17.3.2,“处理复制奴隶意外停止”

洁净的关机(例如,崩溃)在主人身边会有最后的位置低于奴隶读最近的位置掌握二进制日志,由于主人的二进制日志文件不被刷新。这会导致奴隶不能复制时,主人回来了。设置sync_binlog=1在主my.cnf为了解决这个问题的原因是因为有大师刷新其二进制日志文件有助于更频繁。为最大可能的耐久性和一致性的复制设置使用InnoDB与交易,你也应该设定innodb_flush_log_at_trx_commit=1。使用此设置的内容InnoDB重做日志缓冲区写入到日志文件在每个事务提交和日志文件刷新到磁盘。值得注意的是,交易的耐久性仍不这个设定,因为操作系统或磁盘硬件可以告诉mysqld,刷新到磁盘操作的发生,即使它没有。

关闭一个奴隶的清洁是安全的因为它跟踪它离开的地方。但是,要小心,奴隶没有临时表打开;看第17.4.1.31,“复制与临时表”。不洁的关闭可能会产生问题,尤其是如果磁盘高速缓存未刷新到磁盘之前发生的问题:

  • 进行交易,从提交和更新relay-log.info。如果出现大跌,这两个操作之间,中继日志处理将继续比信息文件指示和奴隶将重新执行的事件在中继日志的最后交易后已重新启动,进一步。

  • 如果从更新可以发生类似的问题relay-log.info但是服务器主机崩溃之前写的已经刷新到磁盘。为了减少这种发生的几率,集sync_relay_log_info=1在奴隶my.cnf文件设置sync_relay_log_info0的原因没有写被迫磁盘和服务器依赖于操作系统将文件时间。

对于这些类型的问题,你的系统的容错,如果你有一个好的不间断电源大大增加。

17.4.1.29奴隶在复制过程中的错误

如果一个语句产生同样的错误(相同的错误代码)对主人和奴隶,是记录错误,但复制下去。

如果一个语句在主人与奴隶的产生不同的错误,从SQL线程终止,和奴隶将消息写入错误日志等数据库管理员决定如何处理错误。这包括一个语句产生一个错误,在主人或奴隶的情况,但都没有。为了解决这个问题,连接到从手动和确定问题的原因。SHOW SLAVE STATUS这是有用的。解决问题和运行START SLAVE。例如,你可能需要在你可以再次开始从创建一个不存在的表。

笔记

如果一个暂时的错误记录在奴隶的错误日志,你不一定要采取任何行动,在引用错误信息提示。暂时的错误应该由客户端重试事务处理。例如,如果从SQL线程记录有关死锁的临时错误,你不需要手动重启交易的奴隶,除非从SQL线程随后终止与一个永久的错误消息。

如果此错误代码验证的行为是不可取的,一些或所有的错误可以屏蔽掉(忽略)与--slave-skip-errors选项

对于非事务性存储引擎等MyISAM,它可能有一个声明,只有部分更新一个表并返回一个错误代码。这可能发生,例如,在一个多行插入了一行违反主键约束,或如果一个长的UPDATE语句更新一些行后死亡。如果这发生在主、从预计的声明导致同样的错误代码执行。如果没有,从SQL线程停止先前所描述的。

如果你是复制的表使用不同的存储引擎在主人和奴隶之间,记住同样的语句可能会产生不同的错误时,使用同一个版本的表,而不是其他,或可能导致一个版本的一个表中的错误,而不是其他。例如,自MyISAM忽略外键约束,一INSERTUPDATE语句访问InnoDB在主表的外键冲突而可能造成对同一语句MyISAM该表对奴隶的版本不会产生这样的错误,导致复制停止。

17.4.1.30复制服务器的SQL模式

使用不同的服务器的SQL模式设置在主人与奴隶可能导致相同的INSERT报表是在主人与奴隶的区别对待,使主人和奴隶的分歧。为达到最佳效果,你应该总是使用相同的SQL Server模式对主人和奴隶。这个建议适用于你是否正在使用或基于基于行的复制语句。

如果你是复制的分区表,使用不同的SQL模式对主人和奴隶可能引起的问题。至少,这会导致数据分布在分区间是不同的在主人和奴隶的一个表的副本。它也可能导致插入分区表,成功在主对奴隶失败。

有关更多信息,参见第5.1.10,”服务器的SQL模式”

17.4.1.31复制与临时表

在MySQL 8.0,whenbinlog_format是集MIXED,声明只使用临时表没有登录的主人,因此临时表不可复制。声明涉及混合临时和非临时表登录只为非临时表的操作的掌握,对临时表的操作不被记录。这意味着没有任何临时表的奴隶被丢在一个非计划停工事件的奴隶。唯一的例外是如果临时表的创建记录在使用基于语句格式的二进制日志。在这种情况下,一个删除临时表是否存在声明登录主当临时表被删除。更多信息的复制与临时表行,看基于行的临时表的记录

什么时候binlog_format是集声明,对临时表的操作都记录在主人和奴隶的复制,只要涉及到临时表的语句可以登录安全使用基于语句的格式。在这种情况下,复制的临时表对奴隶的损失可以是一个问题。

安全从关机时,使用临时表。临时表复制,除非你停止从服务器(不只是从属线程)和你复制的临时表,用于尚未对奴隶进行更新是开放的。如果你停止从服务器,由那些需要更新临时表不再可用时重新启动的奴隶。为了避免这个问题,不关闭奴隶却临时打开的表。相反,使用下面的过程:

  1. 问题STOP SLAVE SQL_THREAD声明

  2. 使用SHOW STATUS检查的价值Slave_open_temp_tables变量

  3. 如果值不是0,重新从SQL线程START SLAVE SQL_THREAD重复该过程后

  4. 当该值为0,问题关闭命令停止奴隶

临时表和复制选项默认情况下,与基于语句的复制,复制所有的临时表;这种情况是否匹配--replicate-do-db--replicate-do-table,或--replicate-wild-do-table效果选项。永远--replicate-ignore-table--replicate-wild-ignore-table选项是对临时表的荣幸。唯一的例外是,使在会话结束时的临时表的正确去除,复制的奴隶总是复制删除临时表是否存在声明,无论任何排除规则通常适用于指定的表。

推荐使用基于语句的复制实践时指定一个命名的临时表独家使用的前缀,你不想复制,然后使用--replicate-wild-ignore-table选项匹配的前缀。例如,你可能会把这样的表的名字开始未收到答复(如norepmytablenorepyourtable所以,和在),然后使用--replicate-wild-ignore-table=norep%为了防止复制

17.4.1.32复制重试和超时

全球系统变量slave_transaction_retries影响复制如下:如果从SQL线程执行失败的交易因为一个InnoDB死锁或因为它超出了InnoDBinnodb_lock_wait_timeout价值,或NDB越界交易TransactionInactiveTimeout价值,从自动重试事务slave_transaction_retries在停止一个错误的时候。默认值是10。总的重试次数可以在输出中看到SHOW STATUS它;第5.1.9,“服务器状态变量”

17.4.1.33复制和时区

默认情况下,主从服务器假设他们是在同一个时区。如果你是复制服务器之间在不同的时区,时区必须设置在主人和奴隶。否则,根据当地时间的掌握都是不可复制的正确陈述,如报表使用NOW()FROM_UNIXTIME()功能.设置时区,MySQL服务器运行应用--timezone=timezone_name期权的_ mysqld safe脚本或通过设置TZ环境变量。see also第17.4.1.14,“复制和系统功能”

17.4.1.34复制和事务一致性

在已经从中继日志执行事务的序列不一致性会发生取决于你复制配置。本节说明如何避免不一致性和解决任何问题,他们的原因。

以下类型的不一致可以存在:

  • 应用交易的一半。一个事务更新非事务表应用了一些但不是所有的变化。

  • 空白。间隙是交易尚未(完全)的应用,尽管后来的一些交易已经应用。缺口只能使用多线程时出现的奴隶。避免断裂发生,集slave_preserve_commit_order=1,这就要求slave_parallel_type=LOGICAL_CLOCK,和二进制日志(的log_bin系统变量)和奴隶的更新日志(--log-slave-updates)也启用

  • 无隙低水印的位置。即使在空白的情况下,它是可能的,交易后Exec_master_log_pos已应用。那就是,所有的交易点上N已被应用,没有交易后N已应用,但exec_master_log_pos有一个值小于N.这只会发生在多线程的奴隶。有可能slave_preserve_commit_order防止无间隙低水印位置。

以下情节是半应用交易,存在相关的差距,和无间隙低水印位置不一致:

  1. 而从线程正在运行,有可能是一半的交易。

  2. mysqld关闭。无论是洁净的和不洁净的关机中止正在进行的交易和可能留下的空白和一半的交易。

  3. KILL复制线程(SQL线程使用单线程的奴隶,当使用多线程的奴隶当协调者线程)。这正在进行的交易可能中止留下缝隙,应用交易的一半。

  4. 在应用线程错误。这可能会留下空白。如果错误是在混合交易,交易是一半的应用。使用多线程的奴隶时,并没有收到一个错误完成队列的工人,所以它可能需要一段时间停止所有线程。

  5. STOP SLAVE使用多线程的奴隶时。发行后的STOP SLAVE、奴隶等任何空白需要填补,然后更新exec_master_log_pos。这将确保它不会留下空白或无间隙低水印位置,除非上述情况适用(换句话说,前STOP SLAVE完成的,任何一个错误发生,或者另一个线程的问题KILL,或重新启动服务器。在这些情况下,STOP SLAVE成功返回。)

  6. 如果在中继日志最后交易只有一半接受和多线程从协调员已经开始计划交易的一个工人,然后STOP SLAVE该交易将获得最多等待60秒。这之后超时,协调员放弃和中止交易。如果交易是混合的,它可能是左半完成。

  7. STOP SLAVE使用单线程的奴隶时。如果正在进行的交易只更新事务表,它是回滚,STOP SLAVE立即停止。如果正在进行的交易是混合,STOP SLAVE交易的完成等多达60秒。这之后暂停,中止事务,所以它可能是左半完成。

全局变量rpl_stop_slave_timeout是停止复制线程过程无关。它不仅使客户问题STOP SLAVE返回到客户端,但复制线程继续试图阻止。

如果复制通道的空白,它有以下的后果:

  1. 从数据库中的状态可能不会在主的存在。

  2. 现场Exec_master_log_pos进入SHOW SLAVE STATUS只有一个“低水印”。换句话说,交易出现在位置保证承诺,但交易后的位置可能已犯或不。

  3. CHANGE MASTER TO该频道的失败与错误陈述,除非申请人线程正在运行,CHANGE MASTER TO只有一种选择

  4. 如果mysqld开始--relay-log-recovery,没有恢复的那个通道完成,并打印警告。

  5. 如果mysqldump使用--dump-slave,它不记录存在差距;因此它打印CHANGE MASTER TOrelay_log_pos设置为低水印位置Exec_master_log_pos

    应用自另一个服务器后,启动复制线程,后的位置出现交易再复制。注意,如果gtids启用这是无害的(但是,在这种情况下,不建议使用--dump-slave

如果复制通道具有无间隙低水印位置,例2到5以上的申请,但1不。

无间隙低水印位置信息以二进制格式保存在内部表mysql.slave_worker_infoSTART SLAVE [SQL_THREAD]总是查阅这个信息,它只适用于正确的交易。这是真实的即使slave_parallel_workers已改为前0START SLAVE,即使START SLAVE使用直到条款.START SLAVE UNTIL SQL_AFTER_MTS_GAPS仅适用于许多交易是为了填补空白。如果START SLAVE使用直到的条款,告诉它之前就已经耗尽了所有的间隙停下来,然后留下空隙。

警告

RESET SLAVE删除中继日志重新复制的位置。因此,发行RESET SLAVE与空白对奴隶意味着奴隶的差距失去任何信息,没有纠正的空白。

slave-preserve-commit-order确保没有间隙。然而,它仍然是可能的,exec_master_log_pos只是一个无间隙低水印位置在场景1到4以上。就是说,有可能是交易后Exec_master_log_pos它已经被应用。因此,案件编号为2到5以上的(但不是1)申请,即使slave-preserve-commit-order启用

17.4.1.35复制和交易

混合型和非事务语句在相同的事务。一般来说,你应该避免交易更新复制环境中交易和非事务表。你也应该避免使用任何语句访问交易(或临时)和非事务表写任何人。

服务器使用这些规则的二进制日志:

  • 如果在一个交易的初始陈述是非事务性的,它们的二进制日志直接写入。在交易中剩余的语句缓存而不是写入二进制日志提交事务之前。(如果事务被回滚,缓存的语句如果他们让非事务性的变化不能回滚到二进制日志写入。否则,他们将被丢弃。)

  • 对于基于语句的日志,日志语句的非事务性的影响binlog_direct_non_transactional_updates系统变量。这个变量是当关闭(默认),日志只是描述。这个变量是当ON对于非事务语句立即发生,记录发生在交易的任何地方(不只是初始非事务语句)。其他报表保存在事务缓存和记录事务提交时。binlog_direct_non_transactional_updates有没有影响行格式或混合格式的二进制日志。

事务性的,非事务性的,和混合的陈述。应用这些规则,服务器认为声明非事务性如果只改变非事务表,和交易如果只改变事务表。声明引用了两非事务和事务表和更新任何所涉及的表是混合的声明。混合报表,如交易报表、缓存和记录事务提交时。

混合语句更新事务表被视为不安全如果语句也执行下列操作:

  • 更新或读取临时表

  • 读取一个非事务表和事务隔离级别小于repeatable_read

混合后的声明在一个事务的事务表的更新被认为是不安全的如果它执行下列操作:

有关更多信息,参见第17.2.1.3,“确定安全和不安全的语句在二进制日志”

笔记

混合语句混合二进制日志格式无关。

在这种情况下,交易结构更新事务和非事务表,在二进制日志语句的顺序是正确的,和所有需要的报表是即使一个二进制日志写入ROLLBACK。然而,当第二连接更新非事务表前先连接交易完成后,报表可以退出,因为第二连接更新它完成后立即写的,无论国家的事务是由第一连接进行。

使用不同的存储引擎在主人和奴隶。可以使用非事务性复制表的奴隶主事务表。例如,您可以复制InnoDB作为一个主表MyISAM从表。然而,如果你这样做,如果奴隶是在中间的一个停有问题BEGINCOMMIT块因为奴隶重新开始BEGIN

复制交易也是安全的MyISAM在主表的事务表如表使用InnoDB在从存储引擎。在这种情况下,一个AUTOCOMMIT=1在主发布声明是复制,从而实施自动提交在从模式

当奴隶的存储引擎类型是非事务性的,对主人的事务和非事务表结构更新应该避免,因为他们可以引起主事务表和从非事务性表之间的数据不一致的交易。那是,这样的交易会导致主复制走出同步存储引擎的具体行为可能产生的影响。mysql不发出警告,关于这一点,所以应采取额外的照顾,当复制的事务表从主非事务表的奴隶。

在交易改变二进制日志格式。这个binlog_formatbinlog_checksum系统变量是只读,只要交易是在进步。

每一笔交易(包括autocommit交易)记录在二进制日志好像一开始BEGIN声明,和任何一个结束COMMITROLLBACK声明。这种影响的表,使用非事务性存储引擎的陈述是真的(如MyISAM

笔记

限制针对XA事务,看到第6号,“限制XA事务”

17.4.1.36复制触发器

与基于语句的复制,触发执行主人的奴隶也执行。与基于行的复制,触发主执行不执行的奴隶。相反,从触发器的执行导致主行更改复制和应用上的奴隶。

此行为是设计。如果基于行的复制从应用触发器以及它们引起的连续变化下的变化可以有效的应用在两次奴隶,导致在主人与奴隶的不同数据。

如果你想触发对主人和奴隶也许执行因为你有不同的触发主从你必须使用基于语句的复制。然而,要使从触发器,这是没有必要使用基于语句的复制完全。这是足以切换到基于语句的复制只为那些你想要这个效果报表,并使用基于行的复制其余的时间。

一个语句调用触发(或功能),一个更新的原因AUTO_INCREMENT柱是不可复制的正确使用基于语句的复制。MySQL 5.0标记为不安全的这样的陈述。(错误# 45677)

一个触发器可以有不同的组合触发(触发事件INSERTUPDATEDELETE)和作用时间(之前AFTER),和多个触发器允许。

简洁,多个触发器这是速记多个触发器具有相同的触发事件和动作时间。

升級多个触发器不在之前的版本的MySQL 5.7的支持。如果你升级复制拓扑中的服务器,使用一个版本早于MySQL 5.7,升级复制的奴隶,然后再升级主。如果升级复制大师还有老奴隶使用MySQL版本不支持多个触发器,一个错误发生在那些奴隶如果触发了对主人的桌子已经触发的触发事件和动作时间。

降级如果你把一个支持旧版本不多触发服务器,在降级的影响:

  • 对于每个表,触发器,触发器的定义中的所有.TRG为表文件。然而,如果有相同的触发事件和动作时间的多个触发器,服务器只执行其中一个触发事件发生时。有关教研组文件,看表触发器存储

  • 如果表的触发器添加或降级后下降,服务器将表.TRG文件改写的文件保留的触发事件和动作时间的组合只有一个触发器;其他人都失去了。

为了避免这些问题,降级前修改你的触发器。对于每个表,每个触发事件和动作时间组合多个触发器,将触发每个这样的设置一个触发器,如下:

  1. 每个触发器,创建一个存储程序在触发包含所有代码。值来使用NEW旧版可以通过常规的使用参数。如果触发需要从代码的一个结果值,你可以把代码放在存储函数和函数返回值。如果触发需要多个结果值的代码,你可以把代码放在一个存储过程返回的值OUT参数.

  2. 把所有的三明治都放在桌子上。

  3. 创建表,调用存储程序只是创造了一个新的触发器。这个触发效果从而为多重触发它取代一样。

17.4.1.37复制TRUNCATETABLE

TRUNCATE TABLE通常被视为一个DML语句,所以预计将被记录和复制使用基于行的格式的二进制日志模式时MIXED。然而,这引起的问题时,记录或复制,在声明MIXED模式,表用的事务性存储引擎等InnoDB事务隔离级别时提交读READ UNCOMMITTED,这排除了基于语句的日志。

TRUNCATE TABLE为记录和复制而不是DML DDL可以记录和复制为治疗目的的声明。然而,该声明适用的影响InnoDB和其他事务表复制奴隶仍然遵循了规则第13.1.34”truncate table语法”管理这些表。(错误# 36763)

17.4.1.38复制和用户名长度

MySQL用户名称的最大长度为32个字符。用户名称超过16个字符的一个奴隶比MySQL 5.7,只支持短用户名不能复制。然而,这应该只发生在复制从一个较新的主人到一个旧的奴隶,这是一个不推荐配置。

17.4.1.39复制和变量

系统变量是不可复制的正确使用STATEMENT模式,除了以下变量时,使用会话范围:

什么时候MIXED模式的使用,上述列表中的变量,当使用会话范围,导致开关表为基础的基于行的日志。看到第5.4.4.3,“混合二进制日志格式”

sql_mode也复制除NO_DIR_IN_CREATE模式;奴隶总是保留自己的价值NO_DIR_IN_CREATE,无论改变到它的主人。这是真正的所有复制格式。

然而,当mysqlbinlog解析SET @@sql_mode = mode声明,全mode价值,包括NO_DIR_IN_CREATE,是通过接收服务器。因此,这样一个声明的复制可能不安全的时候声明方式是使用

这个default_storage_engine系统变量是不可复制的,无论测井模式;这是为了方便不同存储引擎之间的复制。

这个read_only系统变量是不可复制的。此外,使这个变量有着不同的影响,对于临时表,表锁定,和SET PASSWORD不同语言中的MySQL版本归档。

这个max_heap_table_size系统变量是不可复制的。增加这个变量的值在主人不在的奴隶这样做可能最终导致桌上摆满了在奴隶当试图执行错误INSERT报表上MEMORY在主,从而允许增长大于对从其对应表。有关更多信息,参见第17.4.1.21,“复制记忆表”

在基于语句的复制,复制会话变量不正确时,更新表的语句中使用。例如,下面的语句序列不会插入在主人与奴隶相同的数据:

SET max_join_size=1000;
INSERT INTO mytable VALUES(@@max_join_size);

这不适用于普通序列:

SET time_zone=...;
INSERT INTO mytable VALUES(CONVERT_TZ(..., ..., @@time_zone));

会话变量是基于行的复制时复制不被使用的问题,在这种情况下,会话变量总是复制的安全。看到17.2.1,“复制格式”

下面的会话变量写入二进制日志被复制的奴隶当分析二进制日志,不管日志格式:

重要

虽然会话变量与字符集和整理写入二进制日志,不同的字符集之间的复制是不支持的。

为了帮助减少可能出现的混乱,我们建议您始终使用相同的设置lower_case_table_names在主从系统的变量,尤其是当你运行的是对大小写敏感的文件系统平台的MySQL。这个lower_case_table_names设置只能配置初始化服务器时。

17.4.1.40复制视图

观点总是复制到奴隶。视图是用自己的名字后,不由表指。这意味着,一个视图可以被复制到从即便视图包含了一个表,通常会被过滤掉的replication-ignore-table规则因此,应注意确保视图不表的数据通常会由于安全原因被过滤的复制。

表中的同一命名视图复制使用基于语句的记录支持,但不使用基于行的记录时。在这样做时,基于行的记录实际上是导致错误。

17.4.2复制MySQL版本之间的兼容性

MySQL支持从一个版本系列复制到下一个更高的版本系列。例如,您可以复制从主运行MySQL 5.6奴隶使用MySQL 5.7,从主运行MySQL 5.7奴隶使用MySQL 8,等等。然而,你可能会遇到困难时,复制从旧到新的奴隶主如果掌握使用报表或依赖行为不再支持使用奴隶的MySQL版本。比如,外键名称超过64个字符不再支持MySQL 8。

多个MySQL服务器版本不支持复制的设置涉及多个主人,无论主人或奴隶的MySQL服务器的数量。这种限制不仅适用于释放系列,但版本号在同一版本系列以及。例如,如果您使用的是一个链接或循环复制设置,您不能使用MySQL 8.0.1,MySQL和MySQL 8.0.4 8.0.2,同时,虽然你可以使用这些版本的任何两在一起。

重要

强烈建议使用最新版本可在一个给定的MySQL版本系列因为复制(和其他)的能力不断提高。它还建议升级的主人和奴隶,一个使用MySQL版本系列早期发布的GA(生产)时释放后成为可释放系列。

新主人老奴隶的复制是可能的,但一般不支持。这是由于一些因素:

  • 二进制日志格式的变化。二进制日志格式可以主要版本间的变化。当我们试图保持向后兼容,这是不可能的。

    这也为复制服务器升级意义重大;看第17.4.3,升级复制设置”为更多的信息

  • 为更多的信息以复制行,看17.2.1,“复制格式”

  • incompatibilities SQL。你不能复制,从一个较新的主人老奴隶使用基于语句的复制如果被复制使用SQL功能可在主而不是奴隶的陈述。

    然而,如果主人和奴隶的支持基于复制的行,并且没有数据定义语句被复制依赖于SQL功能找到主人而不是奴隶,你可以使用基于行的复制复制数据修改语句的影响即使在掌握DDL运行不支持在奴隶。

对潜在的复制问题的更多信息,参见17.4.1节,“复制的特点和问题”

17.4.3升级复制设置

当你升级服务器参与复制设置,升级程序取决于当前服务器的版本和版本要升级到。本节提供了有关如何升级影响复制。有关升级MySQL的一般信息,看2.10.1节,“升级MySQL”

当你升级主8从早期的MySQL版本系列,你首先应该确保这个大师所有奴隶都使用相同的8。X发布。如果不是这样的话,你必须先升级的奴隶。提升每一个奴隶,关闭它,它升级到相应的8。x版本,重新启动它,并重新复制。中继日志升级后是8格式的奴隶了。

影响严格的SQL模式操作的变化(STRICT_TRANS_TABLESSTRICT_ALL_TABLES)可能会导致复制失败的一个升级的奴隶。如果你使用基于语句的记录(binlog_format=STATEMENT),如果一个奴隶主的nonupgraded升级之前,主人会执行语句没有错误,可能对奴隶和复制失败将停止。为了解决这一问题,在掌握新的报表,等到奴隶赶上。然后升级的奴隶。或者,如果你不能阻止新的报表,暂时改变基于行的登录主(binlog_format=ROW),等到所有的奴隶都处理都产生了这种变化的点的二进制日志。然后升级的奴隶。

默认的字符集改utf8mb4在MySQL 8。在复制的设置,从MySQL 5.7至8,建议更改默认字符集的字符集回到升级前使用MySQL 5.7。升级完成后,默认的字符集是可以改变的utf8mb4。假设使用的是以前的默认设置,保存它们的方法之一是启动服务器中的这些句子my.cnf文件:

[mysqld]character_set_server=latin1collation_server=latin1_swedish_ci

奴隶后已经升级,关闭主,升级到8。x释放奴隶,并重新启动它。如果你暂时改变了大师的基于行的记录,改变它回到语句基础测井。8掌握能够读取旧的二进制日志写入升级和送他们去8个奴隶之前。奴隶们认识到旧的格式和妥善处理。二进制日志的主人随后创建升级为8格式。这些也都是由8奴隶的认可。

换句话说,当升级到MySQL 8,奴隶必须MySQL 8之前你可以升级大师8。值得注意的是,从8版本降级不工作很简单:你必须确保任何8个二进制日志或中继日志已被完全处理,这样你可以删除它之前的降级程序。

一些升级可能需要删除并重新创建数据库对象的时候,你从一个MySQL系列一。例如,排序规则的变化可能需要重建表索引。这样的操作,如果必要的话,进行详细的第2.10.1.2,影响升级到MySQL 8”的变化。这是最安全的执行这些操作分别对奴隶和主人,并禁用这些操作复制从主从。为此,请使用以下过程:

  1. 停止所有的奴隶和升级。重新启动他们的--skip-slave-start选择让他们不连接到主。执行任何表修复或重建需要重新创建数据库对象的操作,如使用修表ALTER TABLE,或倾销和重装表或触发器。

  2. 禁用二进制日志的主人。不用重新启动主、执行SET sql_log_bin = 0声明。另外,停止并重新启动它的主人--skip-log-bin选项如果你重启的主人,你也要允许客户端连接。例如,如果所有的客户端连接使用TCP / IP,使用--skip-networking当你恢复了硕士学位的时候。

  3. 与二进制日志禁用,执行任何表修复或重建需要重新创建数据库对象的操作。二进制日志必须被禁止在这一步防止这些操作被记录并发送到奴隶后。

  4. 重新启用在掌握二进制日志。如果你设置sql_log_bin到0年初,执行SET sql_log_bin = 1声明。如果你的主人禁用二进制日志重启,重启无--skip-log-bin,无--skip-networking这样客户和奴隶可以连接。

  5. 重新启动的奴隶,这一次没有--skip-slave-start选项

如果你是从一个版本的MySQL不支持全局事务标识符的一个版本,没有一个现有的复制安装程序升级,你不应该让任何主人或奴隶之前,确保安装符合所有的要求gtids gtid复制。看到第17.1.3.4,“设置复制使用gtids”,其中包含的信息转换现有的复制设置使用基于gtid复制。

当服务器与全球事务标识符(gtids启用(运行)gtid_mode=ON),不启用二进制日志的mysql_upgrade

不推荐加载转储文件时,gtids在服务器上启用(gtid_mode=ON),如果你的转储文件包含系统表。mysqldump问题的系统表使用非事务性存储引擎MyISAM DML指令,这样的组合是不允许的,gtids启用。注意,加载转储文件从服务器gtids启用,到另一个服务器gtids启用,使不同的事务标识符的生成。

17.4.4排除复制

如果你遵循指示,但你复制安装程序不工作,要做的第一件事是检查邮件错误日志。很多用户都不这样做,很快遇到问题后失去的时间。

如果你不能从错误日志中的问题是什么说的,试试下面的方法:

  • 确认主人发出启用二进制日志SHOW MASTER STATUS声明。二进制日志是默认启用。如果启用了二进制日志,位置不为零。如果没有启用二进制日志,确认没有任何设置,禁用二进制日志记录的大师,如--skip-log-bin选项

  • 验证:主人和奴隶都开始与--server-id选择,ID值是唯一的每个服务器上的。

  • 验证从运行。使用SHOW SLAVE STATUS检查是否slave_io_runningSlave_SQL_Running值都是。如果不是,验证用于启动从服务器时,选择。例如,--skip-slave-start防止从线程从开始直到你的问题START SLAVE声明

  • 如果从运行,检查是否建立了一个连接到主。使用SHOW PROCESSLIST,发现I/O和SQL线程和检查状态看看他们显示列。看到第17.2.2,“复制的实施细则》。如果I/O线程状态说Connecting to master下面,检查:

    • 验证用户用于在主复制的特权。

    • 检查主的主机名是正确的,你使用了正确的端口连接到主。用于复制的端口是用于客户端的网络通信相同(默认是3306)。为主机名,确保名称解析为正确的IP地址。

    • 检查网络上没有主从残疾人。寻找skip-networking在配置文件选项。如果存在,评论它或删除它。

    • 如果主人有防火墙或IP过滤配置,确保网络端口用于MySQL不被过滤。

    • 检查可以通过使用达到掌握pingtraceroute/tracert到达主机

  • 如果从运行以前,但已经停止,原因通常是一些声明,成功在主对奴隶失败。这不应该如果你已经掌握一个适当的快照发生,不修改数据的线程以外的奴隶的奴隶。如果从意外停止,这是一个错误,或者你遇到了一个已知的复制缺陷描述17.4.1节,“复制的特点和问题”。如果这是一个错误,看第17.4.5,“如何报告复制错误或问题”,说明如何报告

  • 如果一个语句,成功在主拒绝运行在奴隶,尝试以下步骤如果通过删除从数据库和复制一个新的快照从主做一个完整的数据库同步是不可行的:

    1. 确定是否受影响的表的奴隶并不同于主表。试着去理解这一切是怎么发生的。然后让奴隶的表主人相同的运行START SLAVE

    2. 如果前面的步骤不工作或不适用,试着了解它是否会使手动更新安全(如果需要)然后忽略下一语句从主。

    3. 如果你认为奴隶可以跳过下面的语句从主,发出以下声明:

      mysql> SET GLOBAL sql_slave_skip_counter = N;
      mysql> START SLAVE;
      

      价值N应该是1,如果从主的下一个语句不使用汽车LAST_INSERT_ID()。否则,该值应该是2。使用报表,请使用2值的原因汽车LAST_INSERT_ID()他们认为在大师的二进制日志事件。

      参见第13.4.2.5,“全球sql_slave_skip_counter语法”

    4. 如果你确信奴隶开始了与主完全同步,并且没有一个更新了涉及从线程以外的表,然后大概的差异是一个错误的结果。如果您运行的是MySQL的最新版本,请报告问题。如果您运行的是旧版本,要升级到最新的确定问题是否存在产能释放。

17.4.5如何报告复制错误或问题

当你确定没有用户错误,复制还不上班或是不稳定的,是时间给我们发送错误报告。我们需要从你得到尽可能多的信息,能够追踪bug。请花一些时间在准备一个好的bug报告的努力。

如果你有一个可重复的测试用例验证bug,请进入我们的bug数据库采用了指令7节,“如何报告错误或问题”。如果你有一个幻影问题(一个你不能复制时),使用下面的过程:

  1. 确认没有用户错误的参与。例如,如果你更新的奴隶的奴隶的线程以外,数据超出同步,你可以在更新有独特的重点违法行为。在这种情况下,从属线程停止并等待你去清理表手动使其同步性。这不是一个复制的问题。这是一个外界干扰导致复制失败的问题。

  2. 确保奴隶与二进制日志记录的功能(log_bin系统变量),并与--log-slave-updates启用选项,使奴隶记录它接收从主到自己的二进制日志的更新。这些设置的默认值。

  3. 在重新设置复制状态保存所有的证据。如果我们没有信息或只有粗略的信息,成为我们追查问题困难的或不可能的。你应该收集证据:

    • 所有的二进制日志文件从主

    • 所有的二进制日志文件从

    • 输出SHOW MASTER STATUS从主的时候,你发现了问题

    • 输出SHOW SLAVE STATUS在你发现问题的奴隶

    • 错误日志的主人和奴隶

  4. 使用mysqlbinlog检查二进制日志。以下有助于发现问题的声明。log_filelog_pos是的master_log_fileRead_Master_Log_PosSHOW SLAVE STATUS

    内核&#62;mysqlbinlog --start-position=log_pos log_file | head

当您收集证据的问题,试图把它作为一个单独的测试用例的第一。然后进入问题的尽可能多的信息进入我们的bug数据库使用说明7节,“如何报告错误或问题”