MySQL包括一些内置的(原生)函数用于GTID-based复制。这些函数如下:
-
GTID_SUBSET (
set1
,关于我校
) -
鉴于全球事务两组标识符
set1
和关于我校
,如果所有GTIDs返回trueset1
也在关于我校
。否则返回false。 -
GTID_SUBTRACT (
set1
,关于我校
) -
鉴于全球事务两组标识符
set1
和关于我校
,只返回那些GTIDsset1
不是在关于我校
。 -
WAIT_FOR_EXECUTED_GTID_SET (
gtid_set
(,超时
]) -
等到服务器应用的所有事务的全局事务中包含标识符
gtid_set
。可选的超时阻止函数在指定的秒数后等待。
这些功能的详细信息,请参阅函数使用全局事务标识符(GTIDs)。
您可以定义您自己的存储功能来处理GTIDs。定义存储函数的信息,请参阅存储对象。下面的例子展示一些有用的存储功能,可以创建基于内置的GTID_SUBSET ()
和GTID_SUBTRACT ()
功能。
注意,在这些存储功能,分隔符命令已经被用于改变MySQL语句竖线分隔符,如下:
mysql >分隔符|
所有这些函数的字符串表示GTID集作为参数,所以GTID集使用时必须引用。
这个函数返回非零(真正的)如果两个GTID集是相同的,即使他们不是格式化以同样的方式。
创建函数GTID_IS_EQUAL (gtid_set_1量变,gtid_set_2量变)返回INT返回GTID_SUBSET (gtid_set_1 gtid_set_2)和GTID_SUBSET (gtid_set_2 gtid_set_1) |
这个函数返回非零(真正的)如果两个GTID集是不相交的。
创建函数GTID_IS_DISJOINT (gtid_set_1量变,gtid_set_2量变)返回INT返回GTID_SUBSET (gtid_set_1, GTID_SUBTRACT (gtid_set_1 gtid_set_2)) |
这个函数返回非零(真正的)如果两个GTID集不相交,和总和
两组的结合。
创建函数GTID_IS_DISJOINT_UNION (gtid_set_1量变,gtid_set_2量变,sum量变)返回INT返回GTID_IS_EQUAL (GTID_SUBTRACT(和,gtid_set_1) gtid_set_2)和GTID_IS_EQUAL (GTID_SUBTRACT(和,gtid_set_2) gtid_set_1) |
这个函数返回一个GTID集的标准化形式,在所有大写,没有空白,没有重复。uuid是按字母顺序和间隔以数字顺序排列。
创建函数GTID_NORMALIZE (g量变)返回量变返回GTID_SUBTRACT (g) |
这个函数返回两个GTID集的结合。
创建函数GTID_UNION (gtid_set_1量变,gtid_set_2量变)返回量变返回GTID_NORMALIZE (CONCAT (gtid_set_1,”、“gtid_set_2)) |
这个函数返回两个GTID集的交集。
创建函数GTID_INTERSECTION (gtid_set_1量变,gtid_set_2量变)返回量变返回GTID_SUBTRACT (gtid_set_1, GTID_SUBTRACT (gtid_set_1 gtid_set_2)) |
这个函数返回的对称的区别两个GTID集,即GTIDs中存在的gtid_set_1
但不是在gtid_set_2
,也存在的GTIDsgtid_set_2
但不是在gtid_set_1
。
创建函数GTID_SYMMETRIC_DIFFERENCE (gtid_set_1量变,gtid_set_2量变)返回量变返回GTID_SUBTRACT (CONCAT (gtid_set_1,”、“gtid_set_2) GTID_INTERSECTION (gtid_set_1 gtid_set_2)) |
该函数删除从一组GTID GTIDs从指定的起源,并返回其余GTIDs,如果任何。UUID是标识符使用的服务器事务源自哪里,这是正常的server_uuid
价值。
创建函数GTID_SUBTRACT_UUID (gtid_set量变,uuid文本)返回量变返回GTID_SUBTRACT (gtid_set CONCAT (uuid、“: 1 - (1) - 2)) | < < 63
这个函数改变前面列出的函数返回的只有那些GTIDs GTID来自服务器的设置与指定的标识符(UUID)。
创建函数GTID_INTERSECTION_WITH_UUID (gtid_set量变,uuid文本)返回量变返回GTID_SUBTRACT (gtid_set, GTID_SUBTRACT_UUID (gtid_set uuid)) |
2.1验证一个例子是最新的复制品
内置的功能GTID_SUBSET
和GTID_SUBTRACT
可以用来检查一个复制品已经应用至少每个事务源都有应用。
执行此检查GTID_SUBSET
副本上执行下面的语句:
选择GTID_SUBSET (source_gtid_executed,replica_gtid_executed)
如果它返回0(假),一些GTIDssource_gtid_executed
没有出现在replica_gtid_executed
,所以源应用一些复制品没有应用的事务,和复制品因此不是最新的。
执行检查GTID_SUBTRACT
副本上执行下面的语句:
选择GTID_SUBTRACT (source_gtid_executed,replica_gtid_executed)
该语句返回的任何GTIDssource_gtid_executed
但不是在replica_gtid_executed
。如果任何GTIDs返回,源应用一些复制品没有应用的事务,和复制品因此不是最新的。
示例2.2备份和恢复场景
存储功能GTID_IS_EQUAL
,GTID_IS_DISJOINT
,GTID_IS_DISJOINT_UNION
可以用来验证涉及多个数据库和服务器的备份和恢复操作。在这个示例场景中,server1
包含数据库db1
,server2
包含数据库db2
。我们的目标是复制数据库db2
来server1
,结果server1
应该两个数据库的结合。是备份使用的过程server2
使用mysqlpump或,mysqldump,然后恢复备份server1
。
提供备份程序的选项——set-gtid-purged
被设置为在
或默认汽车
,包含一个程序的输出设置@@GLOBAL.gtid_purged
声明中增加gtid_executed
设置从server2
到gtid_purged
上设置server1
。的gtid_purged
集包含所有的事务的GTIDs已经提交服务器上但不存在于任何二进制日志文件在服务器上。当数据库db2
复制到server1
的GTIDs事务提交server2
,这不是在二进制日志文件server1
必须添加到server1
的gtid_purged
设置的设置完成。
存储函数可以用来协助以下步骤在这个场景中:
使用
GTID_IS_EQUAL
验证备份操作计算正确的GTID集设置@@GLOBAL.gtid_purged
声明。在server2
,提取的声明mysqlpump或,mysqldump输出和GTID集存储到一个局部变量,如gtid_purged_set美元
。然后执行以下语句:server2 >选择GTID_IS_EQUAL (gtid_purged_set美元,@@GLOBAL.gtid_executed);
如果结果是1,两个GTID集相等,和一组计算正确。
使用
GTID_IS_DISJOINT
验证GTID组mysqlpump或,mysqldump输出不重叠gtid_executed
上设置server1
。拥有相同的GTIDs呈现在两台服务器上复制数据库时导致错误db2
来server1
。检查,server1
、提取和存储gtid_purged
设置从上面的输出到一个本地变量中,然后执行下列语句:server1 >选择GTID_IS_DISJOINT (gtid_purged_set美元,@@GLOBAL.gtid_executed);
如果结果是1,两套GTID之间没有重叠,所以没有重复GTIDs存在。
使用
GTID_IS_DISJOINT_UNION
验证恢复操作导致正确的GTID状态server1
。在恢复备份,之前server1
,获得现有的gtid_executed
通过执行以下语句:server1 >选择@@GLOBAL.gtid_executed;
将结果存储在一个本地变量
original_gtid_executed美元
。也存储gtid_purged
一个局部变量中设置如上所述。当备份server2
已经恢复到server1
,执行以下语句来验证GTID状态:server1 >选择GTID_IS_DISJOINT_UNION ($ original_gtid_executed gtid_purged_set美元@@GLOBAL.gtid_executed);
如果结果是1,存储函数证明原件
gtid_executed
设置从server1
(original_gtid_executed美元
)和gtid_purged
集了server2
(gtid_purged_set美元
)没有重叠,同时更新gtid_executed
上设置server1
现在由之前的gtid_executed
设置从server1
加上gtid_purged
设置从server2
,这是期望的结果。确保这张支票进行任何进一步的交易发生在之前server1
,否则新事务gtid_executed
导致它失败。
示例2.3为手动选择最新的复制品故障转移
存储函数GTID_UNION
可以用来识别最新的副本的副本,以执行手动故障转移操作后一个源服务器意外停止。如果一些副本复制延迟,这个存储函数可以用来计算最新的复制品而不必等待所有的副本将他们现有的中继日志,因此尽量减少故障转移时间。函数可以返回的联盟gtid_executed
设置在每个副本的设置交易收到的副本,这是记录在表的性能模式replication_connection_status
。你可以比较这些结果找到复制品的交易记录是最新的,即使不是所有的事务已经提交。
在每一个副本,计算完整的交易记录通过发出以下语句:
从performance_schema选择GTID_UNION (RECEIVED_TRANSACTION_SET, @@GLOBAL.gtid_executed)。replication_connection_status哪里channel_name = '名称';
然后可以比较结果从每个副本看到哪一个最新的交易记录,并使用这个副本作为新的来源。
2.4检查无关的事务复制的例子
存储函数GTID_SUBTRACT_UUID
可以用来检查是否一个副本已经收到交易并非来源于其指定的源或来源。如果它有,可能有一个问题与你的复制设置,或与代理,路由器,或负载均衡器。这个函数是通过删除从一组GTID GTIDs从指定的原始服务器,并返回其余GTIDs,如果任何。
从单一来源的副本复制,发出以下语句,给原始的标识符,通常server_uuid
值:
选择GTID_SUBTRACT_UUID (@@GLOBAL。gtid_executed,server_uuid_of_source);
如果结果不是空的,返回的交易是额外的交易,不是来自指定的源。
在多源复制副本拓扑中,重复的功能,例如:
选择GTID_SUBTRACT_UUID (GTID_SUBTRACT_UUID (@@GLOBAL。gtid_executed,server_uuid_of_source_1), server_uuid_of_source_2);
如果结果不是空的,返回的交易是额外的交易,没有来自任何指定的来源。
示例2.5验证服务器的复制拓扑是只读的
存储函数GTID_INTERSECTION_WITH_UUID
可以用来验证服务器没有发起任何GTIDs和处于只读状态。函数返回的只有那些GTIDs GTID来自服务器的设置与指定的标识符。如果在服务器的任何交易gtid_executed
设置服务器的标识符,服务器本身起源于这些事务。你可以发出以下语句在服务器上检查:
选择GTID_INTERSECTION_WITH_UUID (@@GLOBAL。gtid_executed my_server_uuid);
示例2.6验证源复制设置额外的副本
存储函数GTID_INTERSECTION_WITH_UUID
可以用来发现如果一个副本附加到源复制设置应用所有交易来自一个特定的来源。在这个场景中,source1
和source2
都是来源和副本和复制。source2
也有自己的复制品。副本还收到从源代码和应用交易source1
如果source2
配置了log_replica_updates =对
或log_slave_updates =对
,但如果它不这样做source2
使用log_replica_updates =了
或log_slave_updates =了
。不管怎样,我们现在只想查明是最新的复制品source2
。在这种情况下,存储功能GTID_INTERSECTION_WITH_UUID
可以用来识别的事务吗source2
起源,丢弃的事务source2
已经复制source1
。内置的函数GTID_SUBSET
然后可以用来比较的结果吗gtid_executed
上设置的副本。如果是最新的复制品source2
,gtid_executed
上设置的副本包含所有事务在十字路口(源自的事务source2
)。
这张支票,商店source2
的gtid_executed
集,source2
的服务器UUID和复制的gtid_executed
集,到客户端变量如下:
美元source2_gtid_executed: = source2 >选择@@GLOBAL.gtid_executed;美元source2_server_uuid: = source2 >选择@@GLOBAL.server_uuid;$ replica_gtid_executed: = >选择@@GLOBAL.gtid_executed复制品;
然后使用GTID_INTERSECTION_WITH_UUID
和GTID_SUBSET
与这些变量作为输入,如下:
选择GTID_SUBSET (GTID_INTERSECTION_WITH_UUID (source2_gtid_executed, source2_server_uuid美元),replica_gtid_executed美元);
的服务器标识符source2
(source2_server_uuid美元
)是使用GTID_INTERSECTION_WITH_UUID
识别并返回只有那些GTIDssource2
的gtid_executed
集,起源于source2
,省略那些起源source1
。结果GTID集然后与所有执行的集合GTIDs副本,使用GTID_SUBSET
。如果该语句返回非零(真正的),所有的标识GTIDssource2
(第一组输入)也在复制的gtid_executed
集(第二组输入),这意味着副本复制的所有交易起源于source2
。