我正在测试mysql全局事务id(gtid)的一些工作,很难获得最新的会话gtid。我已经启用了gtids(全局 gtid_mode
设置为 ON_PERMISSIVE
). 根据文件 gtid_owned
:
此只读变量包含一个列表,其内容取决于其作用域。当与会话作用域一起使用时,列表包含此客户端拥有的所有gtid。。。
因此,我期望在提交一个事务之后,这个会话变量将包含gtid;但不管我做什么,它总是空的。然而,全球 gtid_executed
每次提交事务时都会更改,因此我知道gtid正在工作。
下面是一个演示此问题的会话:
mysql> SELECT @@global.gtid_executed;
| a1c32161-89c4-11e8-856e-0242ac12001d:1-4 |
mysql> SELECT @@session.gtid_next;
| AUTOMATIC |
mysql> SELECT @@session.gtid_owned;
| |
mysql> START TRANSACTION;
mysql> SELECT @@global.gtid_executed;
| a1c32161-89c4-11e8-856e-0242ac12001d:1-4 |
mysql> SELECT @@session.gtid_next;
| AUTOMATIC |
mysql> SELECT @@session.gtid_owned;
| |
mysql> INSERT INTO ........
mysql> SELECT @@global.gtid_executed;
| a1c32161-89c4-11e8-856e-0242ac12001d:1-4 |
mysql> SELECT @@session.gtid_next;
| AUTOMATIC |
mysql> SELECT @@session.gtid_owned;
| |
mysql> COMMIT;
mysql> SELECT @@global.gtid_executed;
| a1c32161-89c4-11e8-856e-0242ac12001d:1-5 |
mysql> SELECT @@session.gtid_next;
| AUTOMATIC |
mysql> SELECT @@session.gtid_owned;
| |
mysql> INSERT INTO ........
mysql> SELECT @@global.gtid_executed;
| a1c32161-89c4-11e8-856e-0242ac12001d:1-6 |
mysql> SELECT @@session.gtid_next;
| AUTOMATIC |
mysql> SELECT @@session.gtid_owned;
| |
请注意,每次提交事务(显式或隐式/autocommit)时,执行的gtid的全局列表都会递增,但会话 gtid_owned
总是空的。
我做错了什么/错过了什么?还是我发现了窃听器?
1条答案
按热度按时间zqry0prt1#
客户机只拥有一个仍处于打开状态的事务,因此
gtid_owned
在事务提交后清除。它也只显示一个值,如果你已经显式设置了一个gtid_next
; 使用gtid_next=automatic
不会填充gtid_owned
. 使用gtid_owned
因此,仅限于某些内部操作以及在二进制日志中显式设置gtid的复制等情况。要获取当前会话设置的gtid列表,可以启用
session_track_gtids
(见https://dev.mysql.com/doc/en/server-system-variables.html#sysvar_session_track_gtids).但是请注意,“mysql”命令行客户端不报告会话跟踪器返回的值;您需要一个客户机,它允许您调用c api函数
mysql_session_track_get_first()
以及mysql_session_track_get_next()
(见https://dev.mysql.com/doc/en/mysql-session-track-get-first.html).