初识MYSQL GTID

什么是GTID

全局事务标识符(GTID),由两个部分组成,用用冒号(:)分隔,即GTID = source_id:transaction_id
source_id代表源服务器,通常服务器使用server_uuid来作为source_id,transaction_id事务提交时产生的序列号

GTID同步原理

1、事务在源上执行并提交。

使用源的UUID和此服务器上尚未使用的最小非零事务序列号为该事务分配GTID;GTID将写入源的二进制日志中(紧接在日志中事务本身之前)。

2、在将二进制日志数据传输到副本并存储在副本的中继日志中之后,副本将读取GTID并设置其gtid_next系统值变量作为此GTID。这告诉副本必须使用此GTID记录下一个事务。

3、副本检查以确保尚未使用此GTID在其自己的二进制日志中记录事务。当且仅当未使用该GTID时,副本才写入GTID并应用事务(并将事务写入其二进制日志)。通过首先读取并检查事务的GTID,副本在处理事务本身之前,不仅保证没有任何具有该GTID的先前事务已应用到副本,而且还确保没有其他会话已经读取此GTID但尚未提交相关交易。
4、因为gtid_next不为空,副本不会尝试为此事务生成GTID,而是将存储在此变量中的GTID(即从源获取的GTID)写在二进制日志中紧接事务之前的位置。

GTID配置方式

接下来的大多数步骤要求使用MySQL root帐户或具有SUPER特权的另一个MySQL用户帐户。 mysqladmin shutdown 需要SUPER特权或 SHUTDOWN特权。

步骤1:同步服务器。 将服务器设为只读。为此,read_only通过在两个服务器上执行以下语句来启用 系统变量:

mysql> SET @@GLOBAL.read_only = ON;
等待所有正在进行的事务提交或回滚。然后,允许副本追赶源。在继续之前,确保副本已处理所有更新,这一点非常重要。

如果您将二进制日志用于复制以外的其他目的(例如进行时间点备份和还原),请等到不需要包含没有GTID的事务的旧二进制日志。理想情况下,请等待服务器清除所有二进制日志,然后等待任何现有备份到期。

提示
包含事务但没有GTID的日志不能在启用了GTID的服务器上使用。在继续之前,必须确保没有GTID的事务在拓扑中的任何地方都不存在。

步骤2:停止两台服务器。 如下所示, 使用mysqladmin停止每个服务器,这里username是具有足够特权关闭服务器的MySQL用户的用户名:

shell> mysqladmin -uusername -p shutdown
然后在提示时提供该用户的密码。

步骤3:重启两个启用了GTID的服务器。 要启用具有全局事务标识符的二进制日志记录,必须以GTID模式,二进制日志记录,副本更新日志记录启用了每个服务器,并且禁用了对于基于GTID的复制不安全的语句。此外,应通过以只读模式启动两个服务器,以防止在这两个服务器上执行不必要的更新或意外更新。这意味着两个服务器必须至少使用以下mysqld_safe调用中显示的选项启动 :

shell> mysqld_safe --gtid_mode=ON --log-bin --log-slave-updates --enforce-gtid-consistency &
另外,您应该使用该–skip-slave-start选项以及刚刚显示的示例中指定的其他服务器选项启动副本 。

注意
gtid_mode不是布尔值,而是枚举。设置此选项时,请使用一个值ON或OFF仅使用一个值 。使用数字值(例如0或1)可能会导致意外结果。

步骤4:指示副本使用源。 告诉副本使用复制源服务器作为数据源,并使用基于GTID的自动定位而不是基于文件的定位。CHANGE MASTER TO使用MASTER_AUTO_POSITION 选项告诉副本该事务将由GTID标识,在副本上执行一条 语句。

您可能还需要提供源的主机名和端口号以及复制用户帐户的用户名和密码的适当值,复制副本可以使用该值来连接源。如果已经在步骤1之前设置了这些选项,并且无需进行进一步更改,则可以安全地从此处显示的语句中省略相应的选项。

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

步骤5:进行新备份。 启用了GTID以后,在启用GTID之前进行的现有备份将无法再在这些服务器上使用。此时,请进行新的备份,以免没有可用的备份。

例如,您可以FLUSH LOGS在进行备份的服务器上执行。然后,要么明确地进行备份,要么等待您可能已设置的任何定期备份例程的下一个迭代。

步骤6:启动副本并禁用只读模式。 像这样启动副本:

mysql> START SLAVE;
通过运行以下语句,允许源再次开始接受更新:

mysql> SET @@GLOBAL.read_only = OFF;

禁用GTID事务
如果您在MySQL 5.6中启用了GTID,并且想降级到不支持GTID的MySQL版本,则必须执行此过程来禁用GTID,然后再降级。在MySQL 5.6中,必须使服务器脱机才能禁用GTID。

在每个副本上,通过运行以下语句来禁用自动定位:

STOP SLAVE;
CHANGE MASTER TO MASTER_AUTO_POSITION = 0, MASTER_LOG_FILE = file, MASTER_LOG_POS = position;
START SLAVE;
在每台服务器上,通过运行以下语句停止更新:

SET @@GLOBAL.READ_ONLY = ON;
等待所有正在进行的事务提交或回滚。然后,根据您的部署,等待一段安全的时间,以将任何二进制日志中当前存在的所有事务复制到所有副本。在继续操作之前,确保所有副本都已处理所有更新,这一点非常重要。

如果您将二进制日志用于复制以外的其他用途,例如进行时间点备份和还原,请等到不需要包含GTID事务的旧二进制日志。理想情况下,请等待服务器清除所有二进制日志,然后等待任何现有备份到期。

提示
包含GTID事务的日志不能在禁用GTID的服务器上使用。在继续之前,必须确保GTID事务在拓扑中的任何地方都不存在。

如下所示, 使用mysqladmin停止每个服务器,这里username是具有足够特权关闭服务器的MySQL用户的用户名:

shell> mysqladmin -uusername -p shutdown
然后在提示时提供该用户的密码。

在每个服务器上设置 gtid_mode=OFF和 enforce_gtid_consistency=OFF 在my.cnf。

使用mysqld_safe或另一个 mysqld启动脚本以只读模式重新启动每个服务器 ,并–read_only=ON在命令行上指定选项。以只读模式启动服务器可防止在任何服务器上执行不必要的更新或意外更新。

此时,请进行新的备份,以免没有可用的备份。由于您已禁用GTID,因此在禁用GTID之前进行的现有备份将无法再在这些服务器上使用。例如,您可以FLUSH LOGS在进行备份的服务器上执行。然后,要么明确地进行备份,要么等待您可能已设置的任何定期备份例程的下一个迭代。

在每台服务器上,通过运行以下语句重新启用更新:

SET @@GLOBAL.READ_ONLY = OFF;
如果要降级到MySQL的较早版本,则可以使用正常的降级过程立即进行降级。

GTID限制

1、GTIDs are not compatible or supported with the NDB storage engine used by NDB Cluster. Enabling GTIDs in NDB Cluster is very likely to cause problems with NDB, and to cause NDB Cluster Replication to fail as well.

2、涉及非事务性存储引擎的更新。

使用GTID时,MyISAM 无法在与使用事务存储引擎(例如)更新表相同的语句或事务中对使用非事务存储引擎(例如)进行更新 InnoDB。

此限制是由于以下事实:在同一事务中对使用非事务性存储引擎的表的更新与对使用事务性存储引擎的表的更新混合在一起可能导致将多个GTID分配给同一事务。

当源和副本针对同一表的各自版本使用不同的存储引擎时,也可能发生此类问题,其中一个存储引擎是事务性的,而另一个则不是事务性的。

在上述任何情况下,事务和GTID之间的一对一对应关系都被破坏,结果是基于GTID的复制无法正确运行。

3、CREATE TABLE … SELECT语句。

CREATE TABLE … SELECT基于语句的复制不安全。使用基于行的复制时,该语句实际上被记录为两个单独的事件-一个用于创建表,另一个用于将源表中的行插入到刚刚创建的新表中。在事务中执行此语句时,在某些情况下,这两个事件可能会接收相同的事务标识符,这意味着包含插入内容的事务将被副本跳过。因此, CREATE TABLE … SELECT使用基于GTID的复制时不支持。

4、临时表。
使用GTID时(即,使用该 选项启动服务器时),事务内部不支持CREATE TEMPORARY TABLEand DROP TEMPORARY TABLE语句 --enforce-gtid-consistency。可以在启用GTID的情况下使用这些语句,但只能在任何事务之外且仅在时使用 autocommit=1。

5、sql_slave_skip_counter使用GTID时不支持。
如果需要跳过事务,请改用源gtid_executed变量的值 。有关更多信息,请参见注入空事务。

6、GTID模式和mysqldump。
在MySQL 5.6.9及更高版本中,如果目标服务器的二进制日志中没有GTID ,则可以将使用mysqldump创建的转储导入到启用了GTID模式的MySQL服务器中。

在MySQL 5.6.9之前,mysqldump不记录全局事务ID,因此必须使用二进制日志和mysqlbinlog还原GTID。(缺陷#14797808,错误#14832472)

7、GTID模式和mysql_upgrade。
在此之前的MySQL 5.6.7,mysql_upgrade无法连接到使用全局事务标识符(GTIDs)运行MySQL服务器启用(gtid_mode=ON),除非 mysql_upgrade与运行 --write-binlog=OFF。否则,必须先使用 mysqldgtid_mode=OFF在运行mysql_upgrade之前重启,然后再使用 mysql_upgrade重启 gtid_mode
8、防止执行不受支持的语句。
为了防止执行会导致基于GTID的复制失败的语句,–enforce-gtid-consistency 在启用GTID时,必须使用该选项启动所有服务器 。这会导致本节前面讨论的任何类型的语句失败,并显示错误。

GTID总结

1、在备库复制时不需要指定MASTER_LOG_FILET和MASTER_LOG_POS
2、实现的主备库数据的一致性

猜你喜欢

转载自blog.csdn.net/weixin_41561946/article/details/108025274
今日推荐