mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 05:52:27 +01:00
8e589d1d06
stop/start slave When stopping and restarting the slave while it is replicating temporary tables, the server would crash or raise an assertion failure. This was due to the fact that although temporary tables are saved between slave threads restart, the reference to the thread in use (table->in_use) was not being properly updated when the restart happened (it would still reference the old/invalid thread instead of the new one). This patch addresses this issue by resetting the reference to the new slave thread on slave thread restart. mysql-test/r/rpl_temporary.result: Result file. mysql-test/t/rpl_temporary.test: Test case that checks that both failures go away. sql/slave.cc: Changed slave.cc to reset sql_thd reference in temporary tables.
154 lines
5.1 KiB
Text
154 lines
5.1 KiB
Text
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;
|
|
reset master;
|
|
SET @save_select_limit=@@session.sql_select_limit;
|
|
SET @@session.sql_select_limit=10, @@session.pseudo_thread_id=100;
|
|
ERROR 42000: Access denied; you need the SUPER privilege for this operation
|
|
SELECT @@session.sql_select_limit = @save_select_limit;
|
|
@@session.sql_select_limit = @save_select_limit
|
|
1
|
|
SET @@session.sql_select_limit=10, @@session.sql_log_bin=0;
|
|
ERROR 42000: Access denied; you need the SUPER privilege for this operation
|
|
SELECT @@session.sql_select_limit = @save_select_limit;
|
|
@@session.sql_select_limit = @save_select_limit
|
|
1
|
|
SET @@session.pseudo_thread_id=100;
|
|
SET @@session.pseudo_thread_id=connection_id();
|
|
SET @@session.sql_log_bin=0;
|
|
SET @@session.sql_log_bin=1;
|
|
drop table if exists t1,t2;
|
|
create table t1(f int);
|
|
create table t2(f int);
|
|
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
|
|
create temporary table t3(f int);
|
|
insert into t3 select * from t1 where f<6;
|
|
create temporary table t3(f int);
|
|
insert into t2 select count(*) from t3;
|
|
insert into t3 select * from t1 where f>=4;
|
|
drop temporary table t3;
|
|
insert into t2 select count(*) from t3;
|
|
drop temporary table t3;
|
|
select * from t2;
|
|
f
|
|
5
|
|
7
|
|
show binlog events;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
|
|
master-bin.000001 # Query 1 # use `test`; drop table if exists t1,t2
|
|
master-bin.000001 # Query 1 # use `test`; create table t1(f int)
|
|
master-bin.000001 # Query 1 # use `test`; create table t2(f int)
|
|
master-bin.000001 # Query 1 # use `test`; insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)
|
|
master-bin.000001 # Query 1 # use `test`; create temporary table t3(f int)
|
|
master-bin.000001 # Query 1 # use `test`; insert into t3 select * from t1 where f<6
|
|
master-bin.000001 # Query 1 # use `test`; create temporary table t3(f int)
|
|
master-bin.000001 # Query 1 # use `test`; insert into t2 select count(*) from t3
|
|
master-bin.000001 # Query 1 # use `test`; insert into t3 select * from t1 where f>=4
|
|
master-bin.000001 # Query 1 # use `test`; drop temporary table t3
|
|
master-bin.000001 # Query 1 # use `test`; insert into t2 select count(*) from t3
|
|
master-bin.000001 # Query 1 # use `test`; drop temporary table t3
|
|
drop table t1, t2;
|
|
use test;
|
|
SET TIMESTAMP=1040323920;
|
|
create table t1(f int);
|
|
SET TIMESTAMP=1040323931;
|
|
create table t2(f int);
|
|
SET TIMESTAMP=1040323938;
|
|
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
|
|
SET TIMESTAMP=1040323945;
|
|
SET @@session.pseudo_thread_id=1;
|
|
create temporary table t3(f int);
|
|
SET TIMESTAMP=1040323952;
|
|
SET @@session.pseudo_thread_id=1;
|
|
insert into t3 select * from t1 where f<6;
|
|
SET TIMESTAMP=1040324145;
|
|
SET @@session.pseudo_thread_id=2;
|
|
create temporary table t3(f int);
|
|
SET TIMESTAMP=1040324186;
|
|
SET @@session.pseudo_thread_id=1;
|
|
insert into t2 select count(*) from t3;
|
|
SET TIMESTAMP=1040324200;
|
|
SET @@session.pseudo_thread_id=2;
|
|
insert into t3 select * from t1 where f>=4;
|
|
SET TIMESTAMP=1040324211;
|
|
SET @@session.pseudo_thread_id=1;
|
|
drop temporary table t3;
|
|
SET TIMESTAMP=1040324219;
|
|
SET @@session.pseudo_thread_id=2;
|
|
insert into t2 select count(*) from t3;
|
|
SET TIMESTAMP=1040324224;
|
|
SET @@session.pseudo_thread_id=2;
|
|
drop temporary table t3;
|
|
select * from t2;
|
|
f
|
|
5
|
|
7
|
|
drop table t1,t2;
|
|
create temporary table t3 (f int);
|
|
create temporary table t4 (f int);
|
|
create table t5 (f int);
|
|
drop table if exists t999;
|
|
create temporary table t999(
|
|
id int,
|
|
user char(255),
|
|
host char(255),
|
|
db char(255),
|
|
Command char(255),
|
|
time int,
|
|
State char(255),
|
|
info char(255)
|
|
);
|
|
LOAD DATA INFILE "./tmp/bl_dump_thread_id" into table t999;
|
|
drop table t999;
|
|
insert into t4 values (1);
|
|
kill `select id from information_schema.processlist where command='Binlog Dump'`;
|
|
insert into t5 select * from t4;
|
|
select * from t5 /* must be 1 after reconnection */;
|
|
f
|
|
1
|
|
drop temporary table t4;
|
|
drop table t5;
|
|
set @@session.pseudo_thread_id=100;
|
|
create temporary table t101 (id int);
|
|
create temporary table t102 (id int);
|
|
set @@session.pseudo_thread_id=200;
|
|
create temporary table t201 (id int);
|
|
create temporary table `t``201` (id int);
|
|
create temporary table `#sql_not_user_table202` (id int);
|
|
set @@session.pseudo_thread_id=300;
|
|
create temporary table t301 (id int);
|
|
create temporary table t302 (id int);
|
|
create temporary table `#sql_not_user_table303` (id int);
|
|
create table t1(f int);
|
|
insert into t1 values (1);
|
|
select * from t1 /* must be 1 */;
|
|
f
|
|
1
|
|
drop table t1;
|
|
select * from t1;
|
|
a
|
|
1
|
|
drop table t1;
|
|
DROP TABLE IF EXISTS t1;
|
|
CREATE TEMPORARY TABLE t1 (a char(1));
|
|
INSERT INTO t1 VALUES ('a');
|
|
include/stop_slave.inc
|
|
include/start_slave.inc
|
|
INSERT INTO t1 VALUES ('b');
|
|
DROP TABLE IF EXISTS t1;
|
|
CREATE TEMPORARY TABLE `t1`(`a` tinyint,`b` char(1))engine=myisam;
|
|
INSERT INTO `t1` set `a`=128,`b`='128';
|
|
Warnings:
|
|
Warning 1264 Out of range value adjusted for column 'a' at row 1
|
|
Warning 1265 Data truncated for column 'b' at row 1
|
|
include/stop_slave.inc
|
|
include/start_slave.inc
|
|
INSERT INTO `t1` set `a`=128,`b`='128';
|
|
Warnings:
|
|
Warning 1264 Out of range value adjusted for column 'a' at row 1
|
|
Warning 1265 Data truncated for column 'b' at row 1
|
|
DROP TABLE t1;
|