1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB;
# Case 1: Server goes through graceful shutdown and is restarted
connection default;
INSERT INTO t1 VALUES (1);
Performing --wsrep-recover ...
Using --wsrep-start-position when starting mysqld ...
Expect 100-10-2
SELECT WSREP_LAST_SEEN_GTID();
WSREP_LAST_SEEN_GTID()
100-10-2
SELECT @@GLOBAL.gtid_binlog_pos;
@@GLOBAL.gtid_binlog_pos
100-10-2
SELECT * FROM t1;
f1
1
# Case 2: Server is killed after the transaction gets prepared
# but before it is written into binlog. As there is not GTID assigned,
# the transaction must be rolled back during recovery.
connect con, localhost, root;
SET DEBUG_SYNC = "ha_commit_trans_after_prepare SIGNAL reached WAIT_FOR continue";
INSERT INTO t1 VALUES (2);
connection default;
SET DEBUG_SYNC = "now WAIT_FOR reached";
# Kill the server
Performing --wsrep-recover ...
Using --wsrep-start-position when starting mysqld ...
Expect 100-10-2
SELECT WSREP_LAST_SEEN_GTID();
WSREP_LAST_SEEN_GTID()
100-10-2
SELECT @@GLOBAL.gtid_binlog_pos;
@@GLOBAL.gtid_binlog_pos
100-10-2
Expect 1
SELECT * FROM t1;
f1
1
disconnect con;
# Case 3: Server is killed after the transaction gets written into binlog
# but before it is committed in storage engine. In this case the
# transaction must be committed during recovery as it had a valid
# GTID assigned.
connect con, localhost, root;
SET DEBUG_SYNC = "commit_before_get_LOCK_commit_ordered SIGNAL reached WAIT_FOR continue";
INSERT INTO t1 VALUES (3);
connection default;
SET DEBUG_SYNC = "now WAIT_FOR reached";
# Kill the server
Performing --wsrep-recover ...
Using --wsrep-start-position when starting mysqld ...
Expect 100-10-3
SELECT WSREP_LAST_SEEN_GTID();
WSREP_LAST_SEEN_GTID()
100-10-3
SELECT @@GLOBAL.gtid_binlog_pos;
@@GLOBAL.gtid_binlog_pos
100-10-3
Expect 1 3
SELECT * FROM t1;
f1
1
3
disconnect con;
DROP TABLE t1;
|