mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
This is actually an existing problem in the old binlog implementation, and this patch is applicable to old binlog also. The problem is that RESET MASTER can run concurrently with binlog dump threads / connected slaves. This will remove the binlog from under the feet of the reader, which can cause all sorts of strange behaviour. This patch fixes the problem by disallowing to run RESET MASTER when dump threads (or other RESET MASTER or SHOW BINARY LOGS) are running. An error is thrown in this case, user must stop slaves and/or kill dump threads to make the RESET MASTER go through. A slave that connects in the middle of RESET MASTER will wait for it to complete. Fix a lot of test cases to kill any lingering dump threads before doing RESET MASTER, mostly just by sourcing include/kill_binlog_dump_threads.inc. Signed-off-by: Kristian Nielsen <knielsen@knielsen-hq.org>
168 lines
4.3 KiB
Plaintext
168 lines
4.3 KiB
Plaintext
include/master-slave.inc
|
|
[connection master]
|
|
set @my_time_zone= @@global.time_zone;
|
|
set timestamp=100000000;
|
|
create table t1 (t timestamp, n int not null auto_increment, PRIMARY KEY(n));
|
|
create table t2 (t char(32), n int not null auto_increment, PRIMARY KEY(n));
|
|
connection slave;
|
|
select @@time_zone;
|
|
@@time_zone
|
|
Japan
|
|
connection master;
|
|
select @@time_zone;
|
|
@@time_zone
|
|
Europe/Moscow
|
|
insert into t1 values ('20050101000000', NULL), ('20050611093902',NULL);
|
|
insert into t1 values ('20040101000000',NULL), ('20040611093902',NULL);
|
|
SELECT * FROM t1 ORDER BY n;
|
|
t n
|
|
2005-01-01 00:00:00 1
|
|
2005-06-11 09:39:02 2
|
|
2004-01-01 00:00:00 3
|
|
2004-06-11 09:39:02 4
|
|
connection slave;
|
|
SELECT * FROM t1 ORDER BY n;
|
|
t n
|
|
2005-01-01 06:00:00 1
|
|
2005-06-11 14:39:02 2
|
|
2004-01-01 06:00:00 3
|
|
2004-06-11 14:39:02 4
|
|
connection master;
|
|
delete from t1;
|
|
set time_zone='Europe/Moscow';
|
|
insert into t1 values ('20040101000000',NULL), ('20040611093902',NULL);
|
|
SELECT * FROM t1 ORDER BY n;
|
|
t n
|
|
2004-01-01 00:00:00 5
|
|
2004-06-11 09:39:02 6
|
|
connection slave;
|
|
set time_zone='Europe/Moscow';
|
|
SELECT * FROM t1 ORDER BY n;
|
|
t n
|
|
2004-01-01 00:00:00 5
|
|
2004-06-11 09:39:02 6
|
|
connection master;
|
|
connection master;
|
|
delete from t1;
|
|
set time_zone='UTC';
|
|
load data infile '../../std_data/rpl_timezone2.dat' ignore into table t1;
|
|
Warnings:
|
|
Warning 1265 Data truncated for column 't' at row 1
|
|
Warning 1261 Row 1 doesn't contain data for all columns
|
|
Warning 1265 Data truncated for column 't' at row 2
|
|
Warning 1261 Row 2 doesn't contain data for all columns
|
|
SELECT * FROM t1 ORDER BY n;
|
|
t n
|
|
0000-00-00 00:00:00 7
|
|
0000-00-00 00:00:00 8
|
|
connection slave;
|
|
set time_zone='UTC';
|
|
SELECT * FROM t1 ORDER BY n;
|
|
t n
|
|
0000-00-00 00:00:00 7
|
|
0000-00-00 00:00:00 8
|
|
set time_zone='Europe/Moscow';
|
|
connection master;
|
|
set time_zone='Europe/Moscow';
|
|
delete from t1;
|
|
insert into t1 values ('20040101000000',NULL), ('20040611093902',NULL);
|
|
set time_zone='MET';
|
|
insert into t2 (select * from t1);
|
|
SELECT * FROM t1 ORDER BY n;
|
|
t n
|
|
2003-12-31 22:00:00 9
|
|
2004-06-11 07:39:02 10
|
|
connection slave;
|
|
SELECT * FROM t2 ORDER BY n;
|
|
t n
|
|
2003-12-31 22:00:00 9
|
|
2004-06-11 07:39:02 10
|
|
connection master;
|
|
delete from t2;
|
|
set timestamp=1000072000;
|
|
insert into t2 values (current_timestamp,NULL), (current_date,NULL), (current_time,NULL);
|
|
connection slave;
|
|
SELECT * FROM t2 ORDER BY n;
|
|
t n
|
|
2001-09-09 23:46:40 11
|
|
2001-09-09 12
|
|
23:46:40 13
|
|
connection master;
|
|
delete from t2;
|
|
insert into t2 values (from_unixtime(1000000000),NULL),
|
|
(unix_timestamp('2001-09-09 03:46:40'),NULL);
|
|
SELECT * FROM t2 ORDER BY n;
|
|
t n
|
|
2001-09-09 03:46:40 14
|
|
1000000000 15
|
|
connection slave;
|
|
SELECT * FROM t2 ORDER BY n;
|
|
t n
|
|
2001-09-09 03:46:40 14
|
|
1000000000 15
|
|
connection master;
|
|
set global time_zone='MET';
|
|
delete from t2;
|
|
set time_zone='UTC';
|
|
insert into t2 values(convert_tz('2004-01-01 00:00:00','MET',@@time_zone),NULL);
|
|
insert into t2 values(convert_tz('2005-01-01 00:00:00','MET','Japan'),NULL);
|
|
SELECT * FROM t2 ORDER BY n;
|
|
t n
|
|
2003-12-31 23:00:00 16
|
|
2005-01-01 08:00:00 17
|
|
connection slave;
|
|
SELECT * FROM t2 ORDER BY n;
|
|
t n
|
|
2003-12-31 23:00:00 16
|
|
2005-01-01 08:00:00 17
|
|
connection master;
|
|
drop table t1, t2;
|
|
connection slave;
|
|
connection master;
|
|
set global time_zone= @my_time_zone;
|
|
End of 4.1 tests
|
|
connection master;
|
|
CREATE TABLE t1 (a INT, b TIMESTAMP);
|
|
INSERT INTO t1 VALUES (1, NOW());
|
|
SET @@session.time_zone='Japan';
|
|
UPDATE IGNORE t1 SET b= '1970-01-01 08:59:59' WHERE a= 1;
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a b
|
|
1 0000-00-00 00:00:00
|
|
connection slave;
|
|
SET @@session.time_zone='Japan';
|
|
SELECT * FROM t1 ORDER BY a;
|
|
a b
|
|
1 0000-00-00 00:00:00
|
|
SET @@session.time_zone = default;
|
|
connection master;
|
|
DROP TABLE t1;
|
|
SET @@session.time_zone = default;
|
|
connection slave;
|
|
include/stop_slave.inc
|
|
connection master;
|
|
include/kill_binlog_dump_threads.inc
|
|
reset master;
|
|
CREATE TABLE t1 (date timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, a int(11) default NULL);
|
|
SET @@session.time_zone='+01:00';
|
|
insert into t1 values('2008-12-23 19:39:39',1);
|
|
connection master1;
|
|
SET @@session.time_zone='+02:00';
|
|
insert delayed into t1 values ('2008-12-23 19:39:39',2);
|
|
flush table t1;
|
|
flush logs;
|
|
select * from t1;
|
|
date a
|
|
2008-12-23 20:39:39 1
|
|
2008-12-23 19:39:39 2
|
|
DROP TABLE t1;
|
|
connection master1;
|
|
select * from t1 order by a;
|
|
date a
|
|
2008-12-23 20:39:39 1
|
|
2008-12-23 19:39:39 2
|
|
DROP TABLE t1;
|
|
SET @@session.time_zone = default;
|
|
include/rpl_end.inc
|
|
End of 5.0 tests
|