mirror of
https://github.com/MariaDB/server.git
synced 2025-09-03 20:43:11 +03:00
An INSERT query log event is preceeded by an INSERT_ID intvar event if the INSERT allocates a new auto_increment value. But if we ignore the INSERT due to --replicate-ignore-table or similar, then the INSERT_ID event is still executed, and the set value of INSERT_ID lingers around in the slave sql thread THD object indefinitely until the next INSERT that happens to need allocation of a new auto_increment value. Normally this does not cause problems as such following INSERT would normally come with its own INSERT_ID event. In this bug, the user had a trigger on the slave which was missing on the master, and this trigger had an INSERT which could be affected. In any case, it seems better to not leave a stray INSERT_ID hanging around in the sql thread THD indefinitely. Note that events can also be skipped from apply_event_and_update_pos(); however it is not possible in that code to skip the INSERT without also skipping the INSERT_ID event.
344 lines
6.4 KiB
Plaintext
344 lines
6.4 KiB
Plaintext
stop slave;
|
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
|
reset master;
|
|
reset slave;
|
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
|
start slave;
|
|
create table t1 (a int not null auto_increment,b int, primary key (a)) engine=myisam auto_increment=3;
|
|
insert into t1 values (NULL,1),(NULL,2),(NULL,3);
|
|
select * from t1;
|
|
a b
|
|
12 1
|
|
22 2
|
|
32 3
|
|
select * from t1;
|
|
a b
|
|
12 1
|
|
22 2
|
|
32 3
|
|
drop table t1;
|
|
create table t1 (a int not null auto_increment,b int, primary key (a)) engine=myisam;
|
|
insert into t1 values (1,1),(NULL,2),(3,3),(NULL,4);
|
|
delete from t1 where b=4;
|
|
insert into t1 values (NULL,5),(NULL,6);
|
|
select * from t1;
|
|
a b
|
|
1 1
|
|
2 2
|
|
3 3
|
|
22 5
|
|
32 6
|
|
select * from t1;
|
|
a b
|
|
1 1
|
|
2 2
|
|
3 3
|
|
22 5
|
|
32 6
|
|
drop table t1;
|
|
set @@session.auto_increment_increment=100, @@session.auto_increment_offset=10;
|
|
show variables like "auto_inc%";
|
|
Variable_name Value
|
|
auto_increment_increment 100
|
|
auto_increment_offset 10
|
|
create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
|
|
insert into t1 values (NULL),(5),(NULL);
|
|
insert into t1 values (250),(NULL);
|
|
select * from t1;
|
|
a
|
|
5
|
|
10
|
|
110
|
|
250
|
|
310
|
|
insert into t1 values (1000);
|
|
set @@insert_id=400;
|
|
insert into t1 values(NULL),(NULL);
|
|
select * from t1;
|
|
a
|
|
5
|
|
10
|
|
110
|
|
250
|
|
310
|
|
400
|
|
410
|
|
1000
|
|
select * from t1;
|
|
a
|
|
5
|
|
10
|
|
110
|
|
250
|
|
310
|
|
400
|
|
410
|
|
1000
|
|
drop table t1;
|
|
create table t1 (a int not null auto_increment, primary key (a)) engine=innodb;
|
|
insert into t1 values (NULL),(5),(NULL);
|
|
insert into t1 values (250),(NULL);
|
|
select * from t1;
|
|
a
|
|
5
|
|
10
|
|
110
|
|
250
|
|
310
|
|
insert into t1 values (1000);
|
|
set @@insert_id=400;
|
|
insert into t1 values(NULL),(NULL);
|
|
select * from t1;
|
|
a
|
|
5
|
|
10
|
|
110
|
|
250
|
|
310
|
|
400
|
|
410
|
|
1000
|
|
select * from t1;
|
|
a
|
|
5
|
|
10
|
|
110
|
|
250
|
|
310
|
|
400
|
|
410
|
|
1000
|
|
drop table t1;
|
|
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
|
|
create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
|
|
insert into t1 values (NULL),(5),(NULL),(NULL);
|
|
insert into t1 values (500),(NULL),(502),(NULL),(NULL);
|
|
select * from t1;
|
|
a
|
|
1
|
|
5
|
|
6
|
|
7
|
|
500
|
|
501
|
|
502
|
|
503
|
|
504
|
|
set @@insert_id=600;
|
|
insert into t1 values(600),(NULL),(NULL);
|
|
ERROR 23000: Duplicate entry '600' for key 'PRIMARY'
|
|
set @@insert_id=600;
|
|
insert ignore into t1 values(600),(NULL),(NULL),(610),(NULL);
|
|
select * from t1;
|
|
a
|
|
1
|
|
5
|
|
6
|
|
7
|
|
500
|
|
501
|
|
502
|
|
503
|
|
504
|
|
600
|
|
610
|
|
611
|
|
select * from t1;
|
|
a
|
|
1
|
|
5
|
|
6
|
|
7
|
|
500
|
|
501
|
|
502
|
|
503
|
|
504
|
|
600
|
|
610
|
|
611
|
|
drop table t1;
|
|
set @@session.auto_increment_increment=10, @@session.auto_increment_offset=1;
|
|
create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
|
|
insert into t1 values(2),(12),(22),(32),(42);
|
|
insert into t1 values (NULL),(NULL);
|
|
insert into t1 values (3),(NULL),(NULL);
|
|
select * from t1;
|
|
a
|
|
1
|
|
3
|
|
11
|
|
21
|
|
31
|
|
select * from t1;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
11
|
|
12
|
|
21
|
|
22
|
|
31
|
|
32
|
|
42
|
|
drop table t1;
|
|
create table t1 (a tinyint not null auto_increment primary key) engine=myisam;
|
|
insert into t1 values(103);
|
|
set auto_increment_increment=11;
|
|
set auto_increment_offset=4;
|
|
insert into t1 values(null);
|
|
insert into t1 values(null);
|
|
insert into t1 values(null);
|
|
ERROR 23000: Duplicate entry '125' for key 'PRIMARY'
|
|
select a, mod(a-@@auto_increment_offset,@@auto_increment_increment) from t1 order by a;
|
|
a mod(a-@@auto_increment_offset,@@auto_increment_increment)
|
|
103 0
|
|
114 0
|
|
125 0
|
|
create table t2 (a tinyint unsigned not null auto_increment primary key) engine=myisam;
|
|
set auto_increment_increment=10;
|
|
set auto_increment_offset=1;
|
|
set insert_id=1000;
|
|
insert into t2 values(null);
|
|
Warnings:
|
|
Warning 1264 Out of range value for column 'a' at row 1
|
|
select a, mod(a-@@auto_increment_offset,@@auto_increment_increment) from t2 order by a;
|
|
a mod(a-@@auto_increment_offset,@@auto_increment_increment)
|
|
251 0
|
|
create table t3 like t1;
|
|
set auto_increment_increment=1000;
|
|
set auto_increment_offset=700;
|
|
insert into t3 values(null);
|
|
Warnings:
|
|
Warning 1264 Out of range value for column 'a' at row 1
|
|
select * from t3 order by a;
|
|
a
|
|
127
|
|
select * from t1 order by a;
|
|
a
|
|
103
|
|
114
|
|
125
|
|
select * from t2 order by a;
|
|
a
|
|
251
|
|
select * from t3 order by a;
|
|
a
|
|
127
|
|
drop table t1,t2,t3;
|
|
set auto_increment_increment=1;
|
|
set auto_increment_offset=1;
|
|
CREATE TABLE t1 (id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=innodb;
|
|
INSERT INTO t1 VALUES (NULL), (NULL), (NULL);
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
|
|
PRIMARY KEY (`id`)
|
|
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
|
|
show create table t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
|
|
PRIMARY KEY (`id`)
|
|
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
|
|
drop table t1;
|
|
stop slave;
|
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
|
reset master;
|
|
reset slave;
|
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
|
start slave;
|
|
DROP TABLE IF EXISTS t1;
|
|
DROP TABLE IF EXISTS t2;
|
|
CREATE TABLE t1 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=innodb;
|
|
CREATE TABLE t2 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=myisam;
|
|
SET SQL_MODE='';
|
|
INSERT INTO t1 VALUES(NULL);
|
|
INSERT INTO t2 VALUES(NULL);
|
|
SELECT * FROM t1;
|
|
id
|
|
1
|
|
SELECT * FROM t2;
|
|
id
|
|
1
|
|
INSERT INTO t1 VALUES();
|
|
INSERT INTO t2 VALUES();
|
|
SELECT * FROM t1;
|
|
id
|
|
1
|
|
2
|
|
SELECT * FROM t2;
|
|
id
|
|
1
|
|
2
|
|
INSERT INTO t1 VALUES(0);
|
|
INSERT INTO t2 VALUES(0);
|
|
SELECT * FROM t1;
|
|
id
|
|
1
|
|
2
|
|
3
|
|
SELECT * FROM t2;
|
|
id
|
|
1
|
|
2
|
|
3
|
|
SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO;
|
|
INSERT INTO t1 VALUES(0);
|
|
INSERT INTO t2 VALUES(0);
|
|
SELECT * FROM t1;
|
|
id
|
|
0
|
|
1
|
|
2
|
|
3
|
|
SELECT * FROM t2;
|
|
id
|
|
0
|
|
1
|
|
2
|
|
3
|
|
INSERT INTO t1 VALUES(4);
|
|
INSERT INTO t2 VALUES(4);
|
|
FLUSH LOGS;
|
|
Comparing tables master:test.t1 and slave:test.t1
|
|
Comparing tables master:test.t2 and slave:test.t2
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
Comparing tables master:test.t1 and slave:test.t1
|
|
Comparing tables master:test.t2 and slave:test.t2
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
SET SQL_MODE='';
|
|
CREATE TABLE t1(s VARCHAR(10)) ENGINE=myisam;
|
|
CREATE TABLE t_ignored1(id INT AUTO_INCREMENT PRIMARY KEY) ENGINE=myisam;
|
|
CREATE TABLE test.slave_only(id INT AUTO_INCREMENT PRIMARY KEY) ENGINE=myisam;
|
|
INSERT INTO slave_only VALUES(NULL);
|
|
CREATE TRIGGER t1_update AFTER UPDATE ON t1 FOR EACH ROW INSERT INTO slave_only VALUES(NULL);
|
|
INSERT INTO t_ignored1 VALUES(NULL);
|
|
INSERT INTO t1 VALUES('s');
|
|
UPDATE t1 SET s='s1';
|
|
SELECT * FROM t1;
|
|
s
|
|
s1
|
|
CREATE TABLE t_ignored2(id INT AUTO_INCREMENT PRIMARY KEY) ENGINE=myisam;
|
|
STOP SLAVE;
|
|
SET GLOBAL sql_slave_skip_counter = 2;
|
|
START SLAVE;
|
|
INSERT INTO t_ignored2 VALUES(NULL);
|
|
UPDATE t1 SET s='s2';
|
|
SELECT * FROM t1;
|
|
s
|
|
s2
|
|
SHOW TABLES LIKE 't\_ignored_';
|
|
Tables_in_test (t\_ignored_)
|
|
t_ignored2
|
|
SELECT * FROM t_ignored2;
|
|
id
|
|
DROP TABLE slave_only;
|
|
DROP TABLE t1;
|
|
DROP TABLE t_ignored1;
|
|
DROP TABLE t_ignored2;
|