MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
binlog_innodb.inc
1 
2 SET BINLOG_FORMAT=MIXED;
3 
4 RESET MASTER;
5 
6 CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=INNODB;
7 INSERT INTO t1 VALUES (1,1),(2,2),(3,3),(4,4),(5,5),(6,6);
8 
9 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
10 BEGIN;
11 # Should be logged as statement
12 UPDATE t1 SET b = 2*a WHERE a > 1;
13 COMMIT;
14 
15 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
16 BEGIN;
17 # Should be logged as rows
18 UPDATE t1 SET b = a * a WHERE a > 3;
19 COMMIT;
20 
21 # Check that errors are generated when trying to use READ COMMITTED
22 # transaction isolation level in STATEMENT binlog mode.
23 
24 SET BINLOG_FORMAT=STATEMENT;
25 
26 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
27 BEGIN;
28 error ER_BINLOG_STMT_MODE_AND_ROW_ENGINE;
29 UPDATE t1 SET b = 1*a WHERE a > 1;
30 COMMIT;
31 
32 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
33 BEGIN;
34 error ER_BINLOG_STMT_MODE_AND_ROW_ENGINE;
35 UPDATE t1 SET b = 2*a WHERE a > 2;
36 COMMIT;
37 
38 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
39 BEGIN;
40 UPDATE t1 SET b = 3*a WHERE a > 3;
41 COMMIT;
42 
43 SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
44 BEGIN;
45 UPDATE t1 SET b = 4*a WHERE a > 4;
46 COMMIT;
47 
48 SET BINLOG_FORMAT=MIXED;
49 
50 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
51 BEGIN;
52 UPDATE t1 SET b = 1*a WHERE a > 1;
53 COMMIT;
54 
55 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
56 BEGIN;
57 UPDATE t1 SET b = 2*a WHERE a > 2;
58 COMMIT;
59 
60 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
61 BEGIN;
62 UPDATE t1 SET b = 3*a WHERE a > 3;
63 COMMIT;
64 
65 SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
66 BEGIN;
67 UPDATE t1 SET b = 4*a WHERE a > 4;
68 COMMIT;
69 
70 SET BINLOG_FORMAT=ROW;
71 
72 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
73 BEGIN;
74 UPDATE t1 SET b = 1*a WHERE a > 1;
75 COMMIT;
76 
77 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
78 BEGIN;
79 UPDATE t1 SET b = 2*a WHERE a > 2;
80 COMMIT;
81 
82 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
83 BEGIN;
84 UPDATE t1 SET b = 3*a WHERE a > 3;
85 COMMIT;
86 
87 SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
88 BEGIN;
89 UPDATE t1 SET b = 4*a WHERE a > 4;
90 COMMIT;
91 
92 source include/show_binlog_events.inc;
93 
94 DROP TABLE t1;
95 
96 
97 #
98 # Let us test binlog_cache_use and binlog_cache_disk_use status vars.
99 # Actually this test has nothing to do with innodb per se, it just requires
100 # transactional table.
101 #
102 flush status;
103 show status like "binlog_cache_use";
104 show status like "binlog_cache_disk_use";
105 
106 create table t1 (a int) engine=innodb;
107 
108 # Now we are going to create transaction which is long enough so its
109 # transaction binlog will be flushed to disk...
110 let $1=2000;
111 disable_query_log;
112 begin;
113 while ($1)
114 {
115  eval insert into t1 values( $1 );
116  dec $1;
117 }
118 commit;
119 enable_query_log;
120 show status like "binlog_cache_use";
121 show status like "binlog_cache_disk_use";
122 
123 # Transaction which should not be flushed to disk and so should not
124 # increase binlog_cache_disk_use.
125 begin;
126 delete from t1;
127 commit;
128 show status like "binlog_cache_use";
129 show status like "binlog_cache_disk_use";
130 drop table t1;
131 
132 #
133 # Bug#27716 multi-update did partially and has not binlogged
134 #
135 
136 CREATE TABLE `t1` (
137  `a` int(11) NOT NULL auto_increment,
138  `b` int(11) default NULL,
139  PRIMARY KEY (`a`)
140 ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
141 
142 CREATE TABLE `t2` (
143  `a` int(11) NOT NULL auto_increment,
144  `b` int(11) default NULL,
145  PRIMARY KEY (`a`)
146 ) ENGINE=INNODB DEFAULT CHARSET=latin1 ;
147 
148 # A. testing multi_update::send_eof() execution branch
149 insert into t1 values (1,1),(2,2);
150 insert into t2 values (1,1),(4,4);
151 reset master;
152 --error ER_DUP_ENTRY
153 UPDATE t2,t1 SET t2.a=t1.a+2;
154 # check
155 select * from t2 /* must be (3,1), (4,4) */;
156 --echo # There must no UPDATE in binlog;
157 source include/show_binlog_events.inc;
158 
159 # B. testing multi_update::send_error() execution branch
160 delete from t1;
161 delete from t2;
162 insert into t1 values (1,2),(3,4),(4,4);
163 insert into t2 values (1,2),(3,4),(4,4);
164 reset master;
165 --error ER_DUP_ENTRY
166 UPDATE t2,t1 SET t2.a=t2.b where t2.a=t1.a;
167 --echo # There must be no UPDATE query event;
168 source include/show_binlog_events.inc;
169 
170 # cleanup bug#27716
171 drop table t1, t2;