Skip to content

Commit a2f345b

Browse files
author
Sven Sandberg
committed
WL#7083 step 6.4. GTID-violations: User-visible changes for counters of GTID-violating transactions.
This patch introduces the following user-visible changes related to the counters that keep track of the number of ongoing GTID-violating transactions: - Generate error when user tries to change from GTID_MODE=OFF_PERMISSIVE to ON_PERMISSIVE, when there are ongoing GTID-violating transactions using GTID_NEXT=AUTOMATIC. - Generate error when user tries to change from ENFORCE_GTID_CONSISTENCY=WARN or OFF to ON, if there are ongoing GTID- violating transactions. - Generate error when user tries to change from ENFORCE_GTID_CONSISTENCY=OFF to WARN, if there are ongoing GTID- violating transactions. - When debug mode is enabled, the counters are visible as the status variables AUTOMATIC_GTID_VIOLATING_TRANSACTION_COUNT and ANONYMOUS_GTID_VIOLATING_TRANSACTION_COUNT. @mysqld.cc - Two new status variables. @errmsg-utf8.txt - Two new error messages. @sys_vars.h - Three new error conditions.
1 parent 02112f5 commit a2f345b

File tree

5 files changed

+480
-2
lines changed

5 files changed

+480
-2
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
include/rpl_init.inc [topology=none]
2+
include/rpl_default_connections.inc
3+
CALL mtr.add_suppression("Statement violates GTID consistency:");
4+
CREATE TABLE innodb (a INT) ENGINE = InnoDB;
5+
CREATE TABLE myisam (a INT) ENGINE = MyISAM;
6+
==== AUTOMATIC, GTID-consistent: all modes ok ====
7+
[connection master]
8+
BEGIN;
9+
INSERT INTO innodb VALUES (1);
10+
[connection master1]
11+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = WARN;
12+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
13+
SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
14+
SET GLOBAL GTID_MODE = ON_PERMISSIVE;
15+
SET GLOBAL GTID_MODE = ON;
16+
[connection master]
17+
COMMIT;
18+
[connection master]
19+
BEGIN;
20+
INSERT INTO innodb VALUES (1);
21+
[connection master1]
22+
SET GLOBAL GTID_MODE = ON_PERMISSIVE;
23+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = OFF;
24+
SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
25+
SET GLOBAL GTID_MODE = OFF;
26+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = WARN;
27+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = OFF;
28+
[connection master]
29+
COMMIT;
30+
==== AUTOMATIC, GTID-violating: only OFF and OFF_PERMISSIVE ok ====
31+
[connection master]
32+
BEGIN;
33+
INSERT INTO innodb VALUES (1);
34+
INSERT INTO myisam VALUES (1);
35+
[connection master1]
36+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = WARN;
37+
Warnings:
38+
Warning 3117 There are ongoing transactions that violate GTID consistency.
39+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
40+
ERROR HY000: Cannot set ENFORCE_GTID_CONSISTENCY = ON because there are ongoing transactions that violate GTID consistency.
41+
SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
42+
SET GLOBAL GTID_MODE = ON_PERMISSIVE;
43+
ERROR HY000: SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE is not allowed because there are ongoing transactions that use GTID_NEXT = 'AUTOMATIC', which violate GTID consistency. Adjust your workload to be GTID-consistent before setting @@GLOBAL.GTID_MODE = ON_PERMISSIVE. See the Manual for @@GLOBAL.ENFORCE_GTID_CONSISTENCY for details.
44+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = OFF;
45+
[connection master]
46+
COMMIT;
47+
SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
48+
[connection master]
49+
BEGIN;
50+
INSERT INTO innodb VALUES (1);
51+
INSERT INTO myisam VALUES (1);
52+
[connection master1]
53+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = WARN;
54+
Warnings:
55+
Warning 3117 There are ongoing transactions that violate GTID consistency.
56+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
57+
ERROR HY000: Cannot set ENFORCE_GTID_CONSISTENCY = ON because there are ongoing transactions that violate GTID consistency.
58+
SET GLOBAL GTID_MODE = ON_PERMISSIVE;
59+
ERROR HY000: SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE is not allowed because there are ongoing transactions that use GTID_NEXT = 'AUTOMATIC', which violate GTID consistency. Adjust your workload to be GTID-consistent before setting @@GLOBAL.GTID_MODE = ON_PERMISSIVE. See the Manual for @@GLOBAL.ENFORCE_GTID_CONSISTENCY for details.
60+
SET GLOBAL GTID_MODE = OFF;
61+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = OFF;
62+
[connection master]
63+
COMMIT;
64+
==== ANONYMOUS, GTID-consistent: all except ON are ok ====
65+
[connection master]
66+
SET GTID_NEXT = 'ANONYMOUS';
67+
BEGIN;
68+
INSERT INTO innodb VALUES (1);
69+
[connection master1]
70+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = WARN;
71+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
72+
SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
73+
SET GLOBAL GTID_MODE = ON_PERMISSIVE;
74+
SET GLOBAL GTID_MODE = ON;
75+
ERROR HY000: SET @@GLOBAL.GTID_MODE = ON is not allowed because there are ongoing, anonymous transactions. Before setting @@GLOBAL.GTID_MODE = ON, wait until SHOW STATUS LIKE 'ANONYMOUS_TRANSACTION_COUNT' shows zero on all servers. Then wait for all existing, anonymous transactions to replicate to all slaves, and then execute SET @@GLOBAL.GTID_MODE = ON on all servers. See the Manual for details.
76+
[connection master]
77+
COMMIT;
78+
[connection master]
79+
SET GTID_NEXT = 'ANONYMOUS';
80+
BEGIN;
81+
INSERT INTO innodb VALUES (1);
82+
[connection master1]
83+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = WARN;
84+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
85+
SET GLOBAL GTID_MODE = ON;
86+
ERROR HY000: SET @@GLOBAL.GTID_MODE = ON is not allowed because there are ongoing, anonymous transactions. Before setting @@GLOBAL.GTID_MODE = ON, wait until SHOW STATUS LIKE 'ANONYMOUS_TRANSACTION_COUNT' shows zero on all servers. Then wait for all existing, anonymous transactions to replicate to all slaves, and then execute SET @@GLOBAL.GTID_MODE = ON on all servers. See the Manual for details.
87+
SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
88+
SET GLOBAL GTID_MODE = OFF;
89+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = OFF;
90+
[connection master]
91+
COMMIT;
92+
==== ANONYMOUS, GTID-violating: all except ON are ok ====
93+
[connection master]
94+
SET GTID_NEXT = 'ANONYMOUS';
95+
BEGIN;
96+
INSERT INTO innodb VALUES (1);
97+
INSERT INTO myisam VALUES (1);
98+
[connection master1]
99+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = WARN;
100+
Warnings:
101+
Warning 3117 There are ongoing transactions that violate GTID consistency.
102+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
103+
ERROR HY000: Cannot set ENFORCE_GTID_CONSISTENCY = ON because there are ongoing transactions that violate GTID consistency.
104+
SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
105+
SET GLOBAL GTID_MODE = ON_PERMISSIVE;
106+
SET GLOBAL GTID_MODE = ON;
107+
ERROR HY000: SET @@GLOBAL.GTID_MODE = ON is not allowed because there are ongoing, anonymous transactions. Before setting @@GLOBAL.GTID_MODE = ON, wait until SHOW STATUS LIKE 'ANONYMOUS_TRANSACTION_COUNT' shows zero on all servers. Then wait for all existing, anonymous transactions to replicate to all slaves, and then execute SET @@GLOBAL.GTID_MODE = ON on all servers. See the Manual for details.
108+
[connection master]
109+
COMMIT;
110+
[connection master]
111+
SET GTID_NEXT = 'ANONYMOUS';
112+
BEGIN;
113+
INSERT INTO innodb VALUES (1);
114+
INSERT INTO myisam VALUES (1);
115+
Warnings:
116+
Warning 1785 Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.
117+
[connection master1]
118+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = WARN;
119+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
120+
ERROR HY000: Cannot set ENFORCE_GTID_CONSISTENCY = ON because there are ongoing transactions that violate GTID consistency.
121+
SET GLOBAL GTID_MODE = ON;
122+
ERROR HY000: SET @@GLOBAL.GTID_MODE = ON is not allowed because there are ongoing, anonymous transactions. Before setting @@GLOBAL.GTID_MODE = ON, wait until SHOW STATUS LIKE 'ANONYMOUS_TRANSACTION_COUNT' shows zero on all servers. Then wait for all existing, anonymous transactions to replicate to all slaves, and then execute SET @@GLOBAL.GTID_MODE = ON on all servers. See the Manual for details.
123+
SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
124+
SET GLOBAL GTID_MODE = OFF;
125+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = OFF;
126+
[connection master]
127+
COMMIT;
128+
==== GTID transaction: all except OFF are ok ====
129+
SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
130+
[connection master]
131+
SET GTID_NEXT = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1';
132+
BEGIN;
133+
INSERT INTO innodb VALUES (1);
134+
[connection master1]
135+
SET GLOBAL GTID_MODE = OFF;
136+
ERROR HY000: SET @@GLOBAL.GTID_MODE = OFF is not allowed because there are ongoing transactions that have a GTID. Before you set @@GLOBAL.GTID_MODE = OFF, wait until SELECT @@GLOBAL.GTID_OWNED is empty on all servers. Then wait for all GTID-transactions to replicate to all servers, and then execute SET @@GLOBAL.GTID_MODE = OFF on all servers. See the Manual for details.
137+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = WARN;
138+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = OFF;
139+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
140+
SET GLOBAL GTID_MODE = ON_PERMISSIVE;
141+
SET GLOBAL GTID_MODE = ON;
142+
[connection master]
143+
COMMIT;
144+
[connection master]
145+
SET GTID_NEXT = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2';
146+
BEGIN;
147+
INSERT INTO innodb VALUES (1);
148+
[connection master1]
149+
SET GLOBAL GTID_MODE = ON_PERMISSIVE;
150+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = WARN;
151+
SET GLOBAL ENFORCE_GTID_CONSISTENCY = OFF;
152+
SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
153+
SET GLOBAL GTID_MODE = OFF;
154+
ERROR HY000: SET @@GLOBAL.GTID_MODE = OFF is not allowed because there are ongoing transactions that have a GTID. Before you set @@GLOBAL.GTID_MODE = OFF, wait until SELECT @@GLOBAL.GTID_OWNED is empty on all servers. Then wait for all GTID-transactions to replicate to all servers, and then execute SET @@GLOBAL.GTID_MODE = OFF on all servers. See the Manual for details.
155+
[connection master]
156+
COMMIT;
157+
SET GLOBAL GTID_MODE = OFF;
158+
SET GTID_NEXT = AUTOMATIC;
159+
DROP TABLE innodb, myisam;
160+
include/rpl_end.inc

0 commit comments

Comments
 (0)