• 首页
  • css3教程
  • html5教程
  • jQuery手册
  • vue手册
  • php手册
  • MySQL手册
  • apache手册
  • redis手册
  • 与全局事务标识符(GTID)一起使用的函数

    本节中描述的功能与基于GTID的复制一起使用。重要的是要记住,所有这些函数都将GTID集的字符串表示形式作为参数。因此,GTID集与它们一起使用时必须始终用引号引起来。有关更多信息,请参见GTID集。

    两个GTID集的并集只是将它们的表示形式表示为字符串,并用逗号隔开。换句话说,您可以定义一个非常简单的函数来获取两个GTID集的并集,类似于此处创建的函数:

    CREATE FUNCTION GTID_UNION(g1 TEXT, g2 TEXT)
        RETURNS TEXT DETERMINISTIC
        RETURN CONCAT(g1,',',g2);
    

    有关GTID以及如何在实践中使用这些GTID函数的更多信息,请参见“使用全局事务标识符进行复制”。

    表 GTID函数

    名称描述
    GTID_SUBSET()如果子集中的所有GTID也都已设置,则返回true;否则,返回true。否则为假。
    GTID_SUBTRACT()返回集合中所有不在子集中的GTID。
    WAIT_FOR_EXECUTED_GTID_SET()等待直到给定的GTID在从站上执行。
    WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()(不推荐使用8.0.18)使用WAIT_FOR_EXECUTED_GTID_SET()

    • GTID_SUBSET(set1,set2)

      给定两组全局事务标识符set1set2,如果中的所有GTID set1也在中,则返回true set2。否则返回false。

      此函数使用的GTID集以字符串表示,如以下示例所示:

      mysql> SELECT GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:23',
      ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')\G
      *************************** 1. row 	***************************
      GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562	:23',
          '3E11FA47-71CA-11E1-9E33-C80AA9429562	:21-57')	: 1
      1 row in set (0.00 sec)
      
      mysql> SELECT GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:23-25',
      ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')\G*************************** 1. row 	***************************
      GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562	:23-25',
          '3E11FA47-71CA-11E1-9E33-C80AA9429562	:21-57')	: 1
      1 row in set (0.00 sec)
      
      mysql> SELECT GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562:20-25',
      ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57')\G*************************** 1. row 	***************************
      GTID_SUBSET('3E11FA47-71CA-11E1-9E33-C80AA9429562	:20-25',
          '3E11FA47-71CA-11E1-9E33-C80AA9429562	:21-57')	: 0
      1 row in set (0.00 sec)
      
    • GTID_SUBTRACT(set1,set2)

      给定两组全局事务标识符set1set2,仅返回set1不在中的那些GTID set2

      如以下示例所示,与此函数一起使用的所有GTID集都表示为字符串,并且必须用引号引起来:

      mysql> SELECT GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57',
      ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:21')\G
      *************************** 1. row 	***************************
      GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562	:21-57',
          '3E11FA47-71CA-11E1-9E33-C80AA9429562	:21')	: 3e11fa47-71ca-11e1-9e33-c80aa9429562	:22-57
      1 row in set (0.00 sec)
      
      mysql> SELECT GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57',
      ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:20-25')\G*************************** 1. row 	***************************
      GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562	:21-57',
          '3E11FA47-71CA-11E1-9E33-C80AA9429562	:20-25')	: 3e11fa47-71ca-11e1-9e33-c80aa9429562	:26-57
      1 row in set (0.00 sec)
      
      mysql> SELECT GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562:21-57',
      ->     '3E11FA47-71CA-11E1-9E33-C80AA9429562:23-24')\G*************************** 1. row 	***************************
      GTID_SUBTRACT('3E11FA47-71CA-11E1-9E33-C80AA9429562	:21-57',
          '3E11FA47-71CA-11E1-9E33-C80AA9429562	:23-24')	: 3e11fa47-71ca-11e1-9e33-c80aa9429562	:21-22	:25-57
      1 row in set (0.01 sec)
      
    • WAIT_FOR_EXECUTED_GTID_SET(gtid_set[,timeout])

      等待服务器应用所有包含全局事务标识符的事务gtid_set;也就是说,直到条件GTID_SUBSET(gtid_subset@@GLOBAL.gtid_executed)成立。有关GTID集的定义,请参见“ GTID格式和存储”。

      如果指定了超时,并且timeout在应用GTID集中的所有事务之前经过了几秒钟,则该函数停止等待。timeout是可选的,默认超时为0秒,在这种情况下,该函数始终等待,直到已应用GTID集中的所有事务。

      WAIT_FOR_EXECUTED_GTID_SET()监视服务器上应用的所有GTID,包括来自所有复制通道和用户客户端的事务。它不考虑复制通道是否已启动或停止。

      有关更多信息,请参见“使用全局事务标识符进行复制”。

      此函数使用的GTID集以字符串表示,因此必须用引号引起,如以下示例所示:

      mysql> SELECT WAIT_FOR_EXECUTED_GTID_SET('3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5');
      -> 0
      

      有关GTID集的语法说明,请参见“ GTID格式和存储”。

      对于WAIT_FOR_EXECUTED_GTID_SET(),返回值是查询的状态,其中0表示成功,而1表示超时。任何其他故障都会产生错误。

      gtid_mode当任何客户端正在使用此功能等待GTID被应用时,不能将其更改为OFF。

    • WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(gtid_set[,timeout][,channel])

      WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()不推荐使用。使用WAIT_FOR_EXECUTED_GTID_SET()代替,无论指定的事务通过哪个复制通道或用户客户端到达服务器,它都可以使用。