7

我正在测试一些使用 MySQL 全局事务 ID (GTID) 的工作,但我很难获得最新的会话 GTID。我已启用 GTID(全局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;
|                      |

请注意,每次提交事务(显式或隐式/自动提交)时,已执行 GTID 的全局列表都会增加,但会话gtid_owned始终为空。

我在做什么错/错过了什么?还是我发现了一个错误?

4

1 回答 1

0

客户端只拥有一个仍处于打开状态的事务,因此gtid_owned一旦事务提交就会被清除。gtid_next如果您为;明确设置了一个值,它也只会显示一个值。usinggtid_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)。

于 2018-09-14T14:12:34.750 回答