为什么mysql`gtid\u owned`会话变量在提交事务后总是空的?

fzsnzjdm  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(410)

我正在测试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 总是空的。
我做错了什么/错过了什么?还是我发现了窃听器?

zqry0prt

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).

相关问题