Note: 锟芥本锟斤拷锟斤拷
锟斤拷 1.2.0-alpha 锟芥本锟斤拷始锟酵伙拷锟斤拷 GTID 锟斤拷锟斤拷使锟矫o拷锟斤拷锟斤拷锟斤拷懿锟斤拷锟斤拷锟揭拷锟酵拷锟斤拷锟饺猴拷锟绞癸拷茫锟� 锟斤拷锟斤拷 MySQL Cluster锟斤拷锟斤拷锟斤拷锟斤拷锟届步锟斤拷群锟斤拷锟斤拷锟斤拷 MySQL 锟斤拷锟斤拷同锟斤拷锟斤拷
锟斤拷 MySQL 5.6.5-m8 锟芥本锟斤拷始锟斤拷MySQL 使锟斤拷锟斤拷锟矫碉拷 GTID锟斤拷锟斤拷锟斤拷要 1.3.0-alpha 锟皆猴拷姹局э拷帧锟�
PECL/mysqlnd_ms 锟斤拷锟斤拷使锟斤拷锟皆硷拷锟斤拷 GTID 锟斤拷锟芥,锟斤拷锟斤拷使锟斤拷 MySQL 锟斤拷锟矫碉拷 GTID锟斤拷锟斤拷锟斤拷使锟斤拷锟斤拷锟街凤拷式锟斤拷 锟斤拷锟斤拷使锟矫凤拷锟今级憋拷锟斤拷说锟斤拷锟斤拷一锟斤拷锟侥★拷锟斤拷锟角碉拷锟斤拷锟斤拷锟斤拷 concepts section 锟斤拷锟斤拷说锟斤拷锟斤拷
锟斤拷锟斤拷锟斤拷使锟矫诧拷锟斤拷诓锟斤拷锟� GTID 模锟斤拷锟斤拷展示锟斤拷锟绞癸拷梅锟斤拷锟剿的革拷锟斤拷锟斤拷
锟斤拷锟斤拷涂突锟斤拷锟侥o拷锟�
GTID 锟斤拷 slave 锟斤拷要同锟斤拷锟斤拷 table 锟斤拷 master 锟较伙拷锟斤拷锟斤拷锟� table 锟斤拷一锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷每锟斤拷锟斤拷锟斤拷锟结交锟斤拷锟斤拷锟斤拷锟斤拷锟接★拷 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷茫锟斤拷锟斤拷 master 锟斤拷锟斤拷锟斤拷锟较o拷锟斤拷锟斤拷锟斤拷锟斤拷锟捷匡拷锟斤拷锟皆比凤拷锟绞癸拷锟斤拷锟斤拷碌锟� slave 锟斤拷 锟街革拷锟铰碉拷 master锟斤拷锟斤拷锟铰碉拷 slave 锟斤拷锟斤拷锟角革拷锟斤拷值锟斤拷叩摹锟接︼拷每锟斤拷锟绞癸拷锟� GTID 锟斤拷询某一锟斤拷写锟诫, 锟角凤拷锟窖撅拷锟斤拷 slave 锟斤拷同锟斤拷锟斤拷
锟斤拷锟斤拷锟斤拷锟斤拷锟矫匡拷锟斤拷峤伙拷锟斤拷锟斤拷时锟斤拷锟斤拷锟斤拷 GTID锟斤拷锟斤拷然锟斤拷锟� GTID 也锟斤拷锟斤拷锟斤拷应锟斤拷锟叫讹拷写锟斤拷锟斤拷锟角凤拷同锟斤拷锟斤拷 锟斤拷锟斤拷锟酵匡拷锟斤拷实锟斤拷锟斤拷 session 一锟斤拷锟皆凤拷锟今级憋拷锟叫o拷锟斤拷一锟斤拷锟斤拷 master 锟斤拷取锟斤拷锟捷o拷也锟斤拷锟皆达拷锟窖撅拷同锟斤拷 锟斤拷 slave 锟叫伙拷取锟斤拷锟捷o拷锟接讹拷锟斤拷锟斤拷 master 锟侥讹拷锟斤拷锟截★拷
锟酵伙拷锟斤拷 GTID 模锟斤拷锟斤拷一些锟斤拷锟狡o拷锟斤拷锟皆参匡拷 concepts section 说锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷使锟斤拷前锟斤拷锟斤拷细锟斤拷全锟斤拷锟斤拷锟斤拷锟斤拷锟侥癸拷锟斤拷原锟斤拷透锟斤拷睢o拷锟截憋拷锟斤拷锟斤拷支锟街o拷 锟斤拷锟节憋拷锟轿匡拷锟叫斤拷锟斤拷说锟斤拷锟斤拷
锟斤拷锟斤拷锟斤拷 master 锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟揭诧拷锟斤拷一锟斤拷锟斤拷录锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟姐建锟斤拷锟斤拷锟斤拷锟� 锟斤拷锟捷匡拷锟斤拷锟皆憋拷锟揭拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷诨锟斤拷锟斤拷锟斤拷锟斤拷猓拷锟斤拷诖锟斤拷蟊ǜ锟斤拷锟狡o拷 锟斤拷锟斤拷艿貌锟斤拷锟斤拷魏未锟斤拷锟斤拷锟较拷锟�
Example #1 锟斤拷 master 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷
CREATE TABLE `trx` ( `trx_id` int(11) DEFAULT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=latin1 INSERT INTO `trx`(`trx_id`) VALUES (1);
锟节诧拷锟斤拷锟斤拷锟斤拷锟斤拷募锟斤拷校锟斤拷锟揭拷锟� global_transaction_id_injection 锟铰斤拷锟斤拷锟借定 on_commit 锟斤拷锟斤拷锟斤拷一锟斤拷要确锟斤拷锟斤拷 UPDATE 锟斤拷使锟矫的憋拷锟斤拷锟角可达拷模锟斤拷锟斤拷纾菏癸拷锟斤拷锟揭伙拷锟斤拷锟斤拷锟斤拷谋锟� test.trx 要锟斤拷 trx 锟斤拷锟斤拷锟绞★拷 锟斤拷一锟斤拷浅锟斤拷锟揭拷锟斤拷锟轿拷锟酵拷锟斤拷锟斤拷菘锟斤拷锟斤拷樱锟斤拷锟斤拷艿锟侥拷锟斤拷锟斤拷菘锟窖★拷癫⒉锟斤拷锟酵拷锟� 锟斤拷锟斤拷确锟较o拷使锟斤拷锟斤拷锟接碉拷锟矫伙拷锟斤拷锟斤拷权锟睫讹拷锟斤拷锟斤拷锟街达拷锟� UPDATE 锟斤拷锟筋。
锟斤拷 GTID 锟斤拷锟斤拷时锟斤拷锟津开达拷锟襟报告。
Example #2 Plugin config: SQL for client-side GTID injection
{ "myapp": { "master": { "master_0": { "host": "localhost", "socket": "\/tmp\/mysql.sock" } }, "slave": { "slave_0": { "host": "127.0.0.1", "port": "3306" } }, "global_transaction_id_injection":{ "on_commit":"UPDATE test.trx SET trx_id = trx_id + 1", "report_error":true } } }
Example #3 Transparent global transaction ID injection
<?php
$mysqli = new mysqli("myapp", "username", "password", "database");
if (!$mysqli)
/* Of course, your error handling is nicer... */
die(sprintf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()));
/* auto commit mode, transaction on master, GTID must be incremented */
if (!$mysqli->query("DROP TABLE IF EXISTS test"))
die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error));
/* auto commit mode, transaction on master, GTID must be incremented */
if (!$mysqli->query("CREATE TABLE test(id INT)"))
die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error));
/* auto commit mode, transaction on master, GTID must be incremented */
if (!$mysqli->query("INSERT INTO test(id) VALUES (1)"))
die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error));
/* auto commit mode, read on slave, no increment */
if (!($res = $mysqli->query("SELECT id FROM test")))
die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error));
var_dump($res->fetch_assoc());
?>
锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�
array(1) { ["id"]=> string(1) "1" }
锟斤拷锟斤拷姆锟斤拷锟斤拷锟斤拷锟� 3 锟斤拷锟斤拷锟斤拷锟� master 锟较o拷锟斤拷锟角讹拷锟斤拷锟斤拷 autocommit 锟斤拷执锟叫o拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 3 锟斤拷 GTID 锟斤拷锟斤拷锟接★拷每锟轿诧拷锟斤拷锟斤拷锟斤拷锟街达拷锟斤拷锟斤拷锟斤拷前锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟叫碉拷 UPDATE 锟借定 锟斤拷锟斤拷 GTID锟斤拷
锟斤拷锟斤拷锟斤拷锟斤拷洌拷锟轿拷锟� SELECT 锟斤拷洌拷锟斤拷锟斤拷锟斤拷锟� master 锟斤拷执锟叫o拷 锟斤拷锟皆诧拷锟斤拷锟斤拷锟斤拷 master 锟斤拷锟斤拷 GTID锟斤拷
Note: 锟斤拷锟斤拷 SQL 锟斤拷 GTID 锟斤拷锟斤拷锟叫э拷实墓锟斤拷锟�
锟节客伙拷锟斤拷通锟斤拷 GTID 模锟斤拷锟斤拷每锟斤拷 SQL 执锟叫碉拷时锟斤拷锟斤拷锟角猴拷没锟斤拷效锟绞碉拷锟斤拷锟斤拷锟斤拷 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷为锟斤拷锟杰癸拷锟斤拷锟斤拷锟剿碉拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷为锟斤拷执锟斤拷效锟绞o拷锟斤拷要锟斤拷实锟绞碉拷 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷使锟矫★拷锟斤拷锟斤拷锟节憋拷锟斤拷锟斤拷锟揭碉拷锟斤拷锟斤拷效锟绞碉拷锟斤拷锟斤拷锟斤拷
Example #4 Plugin config: SQL for fetching GTID
{ "myapp": { "master": { "master_0": { "host": "localhost", "socket": "\/tmp\/mysql.sock" } }, "slave": { "slave_0": { "host": "127.0.0.1", "port": "3306" } }, "global_transaction_id_injection":{ "on_commit":"UPDATE test.trx SET trx_id = trx_id + 1", "fetch_last_gtid" : "SELECT MAX(trx_id) FROM test.trx", "report_error":true } } }
Example #5 Obtaining GTID after injection
<?php
$mysqli = new mysqli("myapp", "username", "password", "database");
if (!$mysqli)
/* Of course, your error handling is nicer... */
die(sprintf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()));
/* auto commit mode, transaction on master, GTID must be incremented */
if (!$mysqli->query("DROP TABLE IF EXISTS test"))
die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error));
printf("GTID after transaction %s\n", mysqlnd_ms_get_last_gtid($mysqli));
/* auto commit mode, transaction on master, GTID must be incremented */
if (!$mysqli->query("CREATE TABLE test(id INT)"))
die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error));
printf("GTID after transaction %s\n", mysqlnd_ms_get_last_gtid($mysqli));
?>
锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�
GTID after transaction 7 GTID after transaction 8
应锟矫匡拷锟斤拷通锟斤拷锟斤拷锟斤拷锟饺★拷锟斤拷一锟斤拷写锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 GTID锟斤拷锟斤拷锟斤拷mysqlnd_ms_get-last-gtid() 通锟斤拷锟斤拷锟斤拷锟斤拷锟侥硷拷锟斤拷 global_transaction_id_injection 锟铰斤拷锟斤拷 锟斤拷锟斤拷锟� fetch_last-gtid 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟揭伙拷锟� 写锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 GTID锟斤拷锟斤拷锟斤拷应锟斤拷锟斤拷 GTID 锟斤拷锟接猴拷锟斤拷谩锟�
锟斤拷锟斤拷锟斤拷应锟斤拷锟斤拷锟斤拷锟皆硷拷锟斤拷锟斤拷锟斤拷些锟斤拷锟杰诧拷锟斤拷锟斤拷锟秸碉拷 SQL 锟斤拷洌拷佣锟斤拷锟斤拷锟� GTID锟斤拷锟斤拷锟揭o拷使锟矫猴拷锟斤拷 锟斤拷锟斤拷锟斤拷锟缴的斤拷锟斤拷询 GTID 迁锟狡碉拷锟斤拷锟斤拷应锟斤拷锟叫★拷锟斤拷锟界,使锟斤拷锟轿猴拷 MySQL 锟斤拷锟矫碉拷 GTID锟斤拷
锟斤拷锟斤拷展锟斤拷锟斤拷一锟斤拷 SQL 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟� GTID 锟斤拷锟竭憋拷实锟斤拷执锟叫得碉拷锟斤拷 GTID 锟斤拷锟斤拷锟斤拷锟斤拷荨锟� 锟斤拷 SELECT 锟斤拷 锟斤拷询 GTID 之锟戒,锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟侥客伙拷锟斤拷执锟斤拷 SQL 锟斤拷洌拷佣锟斤拷锟斤拷锟斤拷锟� GTID锟斤拷锟斤拷锟皆伙拷玫锟� GTID 锟斤拷锟杰憋拷实锟斤拷锟斤拷锟捷达拷
Example #6 Plugin config: Checking for a certain GTID
{ "myapp": { "master": { "master_0": { "host": "localhost", "socket": "\/tmp\/mysql.sock" } }, "slave": { "slave_0": { "host": "127.0.0.1", "port": "3306" } }, "global_transaction_id_injection":{ "on_commit":"UPDATE test.trx SET trx_id = trx_id + 1", "fetch_last_gtid" : "SELECT MAX(trx_id) FROM test.trx", "check_for_gtid" : "SELECT trx_id FROM test.trx WHERE trx_id >= #GTID", "report_error":true } } }
Example #7 Session consistency service level and GTID combined
<?php
$mysqli = new mysqli("myapp", "username", "password", "database");
if (!$mysqli)
/* Of course, your error handling is nicer... */
die(sprintf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()));
/* autocommit 模式锟铰o拷锟斤拷 master 执锟叫o拷锟斤拷锟斤拷锟斤拷锟斤拷 GTID */
if (!$mysqli->query("DROP TABLE IF EXISTS test") ||
!$mysqli->query("CREATE TABLE test(id INT)") ||
!$mysqli->query("INSERT INTO test(id) VALUES (1)"))
die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error));
/* 锟斤拷取锟斤拷锟揭伙拷锟叫达拷锟斤拷 GTID */
$gtid = mysqlnd_ms_get_last_gtid($mysqli);
/* Session 一锟斤拷锟皆o拷锟斤拷锟皆达拷 slave 锟斤拷取锟斤拷锟斤拷锟斤拷只锟斤拷 master 锟斤拷取 */
if (false == mysqlnd_ms_set_qos($mysqli, MYSQLND_MS_QOS_CONSISTENCY_SESSION, MYSQLND_MS_QOS_OPTION_GTID, $gtid)) {
die(sprintf("[006] [%d] %s\n", $mysqli->errno, $mysqli->error));
}
/* Either run on master or a slave which has replicated the INSERT */
if (!($res = $mysqli->query("SELECT id FROM test"))) {
die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error));
}
var_dump($res->fetch_assoc());
?>
通锟斤拷 mysqlnd_ms_get_last_gtid() 锟斤拷取锟斤拷 GTID 锟斤拷锟皆憋拷锟斤拷锟斤拷 Session 一锟斤拷锟皆凤拷锟今级憋拷通锟斤拷 mysqlnd_ms_set_qos() 锟借定 Session 一锟斤拷锟皆凤拷锟今级憋拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟饺⌒达拷锟斤拷锟斤拷锟捷★拷锟节凤拷锟斤拷锟叫o拷 通锟斤拷锟叫讹拷 INSERT 锟角凤拷锟窖撅拷锟斤拷同锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 SELECT 锟斤拷锟侥革拷锟斤拷锟斤拷锟斤拷锟叫讹拷取锟斤拷锟捷o拷
锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟叫碉拷锟斤拷锟斤拷 slave 锟斤拷锟斤拷锟斤拷锟斤拷通锟斤拷锟介看 GTID 锟斤拷锟叫碉拷值锟斤拷锟叫讹拷锟角凤拷 INSERT 锟窖撅拷锟斤拷同锟斤拷锟斤拷锟斤拷锟侥凤拷锟斤拷锟斤拷 global_transaction_id_injection 锟铰斤拷锟叫o拷使锟斤拷 check_for_gtid 锟斤拷锟斤拷锟斤拷锟藉。 锟斤拷注锟解,锟斤拷锟斤拷一锟街碉拷效锟斤拷锟剿凤拷锟斤拷源锟侥凤拷锟斤拷锟斤拷 锟斤拷 master 锟侥讹拷取压锟斤拷锟杰达拷锟绞憋拷锟接︼拷每锟斤拷锟斤拷锟斤拷堑牟锟斤拷锟斤拷锟斤拷址锟绞斤拷锟斤拷锟斤拷锟斤拷投锟饺⊙癸拷锟斤拷锟�
使锟矫凤拷锟斤拷锟斤拷锟剿碉拷 GTID
锟皆达拷 MySQL 5.6.5-m8 锟芥本锟斤拷始锟斤拷MySQL 锟斤拷锟斤拷同锟斤拷锟斤拷始支锟街凤拷锟斤拷锟斤拷锟剿碉拷 GTID锟斤拷GTID 锟斤拷 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟缴凤拷锟斤拷锟斤拷锟斤拷锟狡o拷锟矫伙拷锟斤拷锟皆诧拷锟劫癸拷锟斤拷锟斤拷些锟斤拷锟解。锟斤拷也锟斤拷锟斤拷说锟斤拷锟斤拷锟斤拷要锟斤拷锟斤拷锟斤拷魏锟� 锟斤拷锟捷匡拷锟斤拷锟斤拷诩锟铰� GTID锟斤拷也锟斤拷锟斤拷锟斤拷锟斤拷 on_commit 锟斤拷锟斤拷锟斤拷锟酵伙拷锟斤拷模锟斤拷 锟斤拷 GTID 锟斤拷锟斤拷锟斤拷要使锟矫★拷
锟酵伙拷锟剿匡拷锟斤拷顺锟斤拷使锟斤拷 GTID 锟斤拷锟� Session 一锟斤拷锟皆凤拷锟斤拷锟斤拷锟斤拷姆锟绞斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟� GTID 模锟斤拷 锟斤拷一锟斤拷锟侥★拷锟斤拷同锟斤拷锟斤拷 check_for_gtid 锟斤拷 fetch_last_gtid 锟斤拷锟斤拷锟斤拷要锟斤拷锟斤拷锟斤拷锟矫★拷 锟斤拷注锟解,MySQL 5.6.5-m8 锟斤拷一锟斤拷锟叫凤拷锟芥本锟斤拷锟斤拷锟斤拷执锟斤拷细锟斤拷锟斤拷实锟绞碉拷锟斤拷锟叫版本锟斤拷锟斤拷锟斤拷些锟斤拷锟杰匡拷锟斤拷锟叫改变。
使锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷茫锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷酃锟斤拷锟斤拷魏锟揭伙拷锟斤拷疟锟斤拷锟斤拷芄锟斤拷锟斤拷梅锟斤拷锟斤拷锟斤拷说锟� GTID 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 锟斤拷锟斤拷 mysqlnd_ms_get_last_gtid() 锟斤拷 mysqlnd_ms_set_qos() 锟斤拷锟斤拷也一锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷同锟斤拷锟斤拷锟节o拷 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟矫简单碉拷顺锟斤拷锟斤拷锟叫o拷锟斤拷锟角诧拷锟斤拷一锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷识锟脚猴拷锟斤拷锟斤拷锟斤拷锟街碉拷锟街凤拷锟斤拷锟斤拷 锟斤拷锟皆o拷锟矫伙拷锟斤拷锟斤拷锟杰简单碉拷通锟斤拷 mysqlnd_ms_get_last_gtid() 锟矫碉拷锟斤拷顺锟斤拷锟叫讹拷 GTID锟斤拷 锟斤拷锟斤拷注锟斤拷锟斤拷 MySQL 5.6.9 锟芥本锟斤拷始 GTID_DONE 锟窖撅拷锟斤拷 GTID_EXECUTED 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 锟斤拷锟斤拷锟叫o拷应锟斤拷锟斤拷锟斤拷应锟斤拷锟斤拷锟�
Example #8 使锟斤拷 MySQL 5.6.5-m8 锟斤拷锟斤拷 GTID
{ "myapp": { "master": { "master_0": { "host": "localhost", "socket": "\/tmp\/mysql.sock" } }, "slave": { "slave_0": { "host": "127.0.0.1", "port": "3306" } }, "global_transaction_id_injection":{ "fetch_last_gtid" : "SELECT @@GLOBAL.GTID_DONE AS trx_id FROM DUAL", "check_for_gtid" : "SELECT GTID_SUBSET('#GTID', @@GLOBAL.GTID_DONE) AS trx_id FROM DUAL", "report_error":true } } }