mirror of
https://github.com/MariaDB/server.git
synced 2025-08-26 01:44:06 +03:00
Fix: === Backport Bug#11756194 to mysql-5.5. slave breaks if 'drop database' fails on master and mismatched tables on slave. 'DROP TABLE <deleted tables>' was binlogged when 'DROP DATABASE' failed and at least one table was deleted from the database. The log event would lead slave SQL thread stop if some of the tables did not exist on slave. After this patch, It is always binlogged with 'IF EXISTS' option.
261 lines
9.7 KiB
Plaintext
261 lines
9.7 KiB
Plaintext
set binlog_format=statement;
|
|
reset master;
|
|
create database testing_1;
|
|
use testing_1;
|
|
create table t1 (a int);
|
|
create function sf1 (a int) returns int return a+1;
|
|
create trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a);
|
|
create procedure sp1 (a int) insert into t1 values(a);
|
|
drop database testing_1;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # create database testing_1
|
|
master-bin.000001 # Query # # use `testing_1`; create table t1 (a int)
|
|
master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` FUNCTION `sf1`(a int) RETURNS int(11)
|
|
return a+1
|
|
master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a)
|
|
master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` PROCEDURE `sp1`(a int)
|
|
insert into t1 values(a)
|
|
master-bin.000001 # Query # # drop database testing_1
|
|
use test;
|
|
reset master;
|
|
create temporary table tt1 (a int);
|
|
create table t1 (a int);
|
|
insert into t1 values (1);
|
|
drop database if exists mysqltest1;
|
|
insert into t1 values (1);
|
|
drop table tt1, t1;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `test`; create temporary table tt1 (a int)
|
|
master-bin.000001 # Query # # use `test`; create table t1 (a int)
|
|
master-bin.000001 # Query # # BEGIN
|
|
master-bin.000001 # Query # # use `test`; insert into t1 values (1)
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Query # # drop database if exists mysqltest1
|
|
master-bin.000001 # Query # # BEGIN
|
|
master-bin.000001 # Query # # use `test`; insert into t1 values (1)
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Query # # use `test`; DROP TEMPORARY TABLE `tt1` /* generated by server */
|
|
master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */
|
|
FLUSH STATUS;
|
|
|
|
# 'DROP TABLE IF EXISTS <deleted tables>' is binlogged
|
|
# when 'DROP DATABASE' fails and at least one table is deleted
|
|
# from the database.
|
|
RESET MASTER;
|
|
CREATE DATABASE testing_1;
|
|
USE testing_1;
|
|
CREATE TABLE t1(c1 INT);
|
|
CREATE TABLE t2(c1 INT);
|
|
# Create a file in the database directory
|
|
SELECT 'hello' INTO OUTFILE 'fake_file.FAKE_FILE';
|
|
|
|
# 'DROP DATABASE' will fail if there is any other file in the the
|
|
# database directory
|
|
DROP DATABASE testing_1;
|
|
ERROR HY000: Error dropping database (can't rmdir './testing_1/', errno: 17)
|
|
|
|
# Remove the fake file.
|
|
# Now we can drop the database.
|
|
DROP DATABASE testing_1;
|
|
#
|
|
# Bug#11765416 58381: FAILED DROP DATABASE CAN BREAK STATEMENT
|
|
# BASED REPLICATION
|
|
#
|
|
USE test;
|
|
DROP DATABASE IF EXISTS db1;
|
|
DROP TABLE IF EXISTS t3;
|
|
CREATE DATABASE db1;
|
|
CREATE TABLE db1.t1 (a INT);
|
|
CREATE TABLE db1.t2 (b INT, KEY(b)) engine=innodb;
|
|
CREATE TABLE t3 (a INT, KEY (a), FOREIGN KEY(a) REFERENCES db1.t2(b))
|
|
engine=innodb;
|
|
RESET MASTER;
|
|
DROP DATABASE db1;
|
|
ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails
|
|
SHOW TABLES FROM db1;
|
|
Tables_in_db1
|
|
t2
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `db1`; DROP TABLE IF EXISTS `t1`
|
|
DROP TABLE t3;
|
|
DROP DATABASE db1;
|
|
set binlog_format=mixed;
|
|
reset master;
|
|
create database testing_1;
|
|
use testing_1;
|
|
create table t1 (a int);
|
|
create function sf1 (a int) returns int return a+1;
|
|
create trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a);
|
|
create procedure sp1 (a int) insert into t1 values(a);
|
|
drop database testing_1;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # create database testing_1
|
|
master-bin.000001 # Query # # use `testing_1`; create table t1 (a int)
|
|
master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` FUNCTION `sf1`(a int) RETURNS int(11)
|
|
return a+1
|
|
master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a)
|
|
master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` PROCEDURE `sp1`(a int)
|
|
insert into t1 values(a)
|
|
master-bin.000001 # Query # # drop database testing_1
|
|
use test;
|
|
reset master;
|
|
create temporary table tt1 (a int);
|
|
create table t1 (a int);
|
|
insert into t1 values (1);
|
|
drop database if exists mysqltest1;
|
|
insert into t1 values (1);
|
|
drop table tt1, t1;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `test`; create temporary table tt1 (a int)
|
|
master-bin.000001 # Query # # use `test`; create table t1 (a int)
|
|
master-bin.000001 # Query # # BEGIN
|
|
master-bin.000001 # Query # # use `test`; insert into t1 values (1)
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Query # # drop database if exists mysqltest1
|
|
master-bin.000001 # Query # # BEGIN
|
|
master-bin.000001 # Query # # use `test`; insert into t1 values (1)
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Query # # use `test`; DROP TEMPORARY TABLE `tt1` /* generated by server */
|
|
master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */
|
|
FLUSH STATUS;
|
|
|
|
# 'DROP TABLE IF EXISTS <deleted tables>' is binlogged
|
|
# when 'DROP DATABASE' fails and at least one table is deleted
|
|
# from the database.
|
|
RESET MASTER;
|
|
CREATE DATABASE testing_1;
|
|
USE testing_1;
|
|
CREATE TABLE t1(c1 INT);
|
|
CREATE TABLE t2(c1 INT);
|
|
# Create a file in the database directory
|
|
SELECT 'hello' INTO OUTFILE 'fake_file.FAKE_FILE';
|
|
|
|
# 'DROP DATABASE' will fail if there is any other file in the the
|
|
# database directory
|
|
DROP DATABASE testing_1;
|
|
ERROR HY000: Error dropping database (can't rmdir './testing_1/', errno: 17)
|
|
|
|
# Remove the fake file.
|
|
# Now we can drop the database.
|
|
DROP DATABASE testing_1;
|
|
#
|
|
# Bug#11765416 58381: FAILED DROP DATABASE CAN BREAK STATEMENT
|
|
# BASED REPLICATION
|
|
#
|
|
USE test;
|
|
DROP DATABASE IF EXISTS db1;
|
|
DROP TABLE IF EXISTS t3;
|
|
CREATE DATABASE db1;
|
|
CREATE TABLE db1.t1 (a INT);
|
|
CREATE TABLE db1.t2 (b INT, KEY(b)) engine=innodb;
|
|
CREATE TABLE t3 (a INT, KEY (a), FOREIGN KEY(a) REFERENCES db1.t2(b))
|
|
engine=innodb;
|
|
RESET MASTER;
|
|
DROP DATABASE db1;
|
|
ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails
|
|
SHOW TABLES FROM db1;
|
|
Tables_in_db1
|
|
t2
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `db1`; DROP TABLE IF EXISTS `t1`
|
|
DROP TABLE t3;
|
|
DROP DATABASE db1;
|
|
set binlog_format=row;
|
|
reset master;
|
|
create database testing_1;
|
|
use testing_1;
|
|
create table t1 (a int);
|
|
create function sf1 (a int) returns int return a+1;
|
|
create trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a);
|
|
create procedure sp1 (a int) insert into t1 values(a);
|
|
drop database testing_1;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # create database testing_1
|
|
master-bin.000001 # Query # # use `testing_1`; create table t1 (a int)
|
|
master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` FUNCTION `sf1`(a int) RETURNS int(11)
|
|
return a+1
|
|
master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` trigger tr1 before insert on t1 for each row insert into t2 values (2*new.a)
|
|
master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost` PROCEDURE `sp1`(a int)
|
|
insert into t1 values(a)
|
|
master-bin.000001 # Query # # drop database testing_1
|
|
use test;
|
|
reset master;
|
|
create temporary table tt1 (a int);
|
|
create table t1 (a int);
|
|
insert into t1 values (1);
|
|
drop database if exists mysqltest1;
|
|
insert into t1 values (1);
|
|
drop table tt1, t1;
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `test`; create table t1 (a int)
|
|
master-bin.000001 # Query # # BEGIN
|
|
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Query # # drop database if exists mysqltest1
|
|
master-bin.000001 # Query # # BEGIN
|
|
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
|
master-bin.000001 # Query # # COMMIT
|
|
master-bin.000001 # Query # # DROP TEMPORARY TABLE IF EXISTS `test`.`tt1` /* generated by server */
|
|
master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */
|
|
FLUSH STATUS;
|
|
|
|
# 'DROP TABLE IF EXISTS <deleted tables>' is binlogged
|
|
# when 'DROP DATABASE' fails and at least one table is deleted
|
|
# from the database.
|
|
RESET MASTER;
|
|
CREATE DATABASE testing_1;
|
|
USE testing_1;
|
|
CREATE TABLE t1(c1 INT);
|
|
CREATE TABLE t2(c1 INT);
|
|
# Create a file in the database directory
|
|
SELECT 'hello' INTO OUTFILE 'fake_file.FAKE_FILE';
|
|
|
|
# 'DROP DATABASE' will fail if there is any other file in the the
|
|
# database directory
|
|
DROP DATABASE testing_1;
|
|
ERROR HY000: Error dropping database (can't rmdir './testing_1/', errno: 17)
|
|
|
|
# Remove the fake file.
|
|
# Now we can drop the database.
|
|
DROP DATABASE testing_1;
|
|
#
|
|
# Bug#11765416 58381: FAILED DROP DATABASE CAN BREAK STATEMENT
|
|
# BASED REPLICATION
|
|
#
|
|
USE test;
|
|
DROP DATABASE IF EXISTS db1;
|
|
DROP TABLE IF EXISTS t3;
|
|
CREATE DATABASE db1;
|
|
CREATE TABLE db1.t1 (a INT);
|
|
CREATE TABLE db1.t2 (b INT, KEY(b)) engine=innodb;
|
|
CREATE TABLE t3 (a INT, KEY (a), FOREIGN KEY(a) REFERENCES db1.t2(b))
|
|
engine=innodb;
|
|
RESET MASTER;
|
|
DROP DATABASE db1;
|
|
ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails
|
|
SHOW TABLES FROM db1;
|
|
Tables_in_db1
|
|
t2
|
|
show binlog events from <binlog_start>;
|
|
Log_name Pos Event_type Server_id End_log_pos Info
|
|
master-bin.000001 # Query # # use `db1`; DROP TABLE IF EXISTS `t1`
|
|
DROP TABLE t3;
|
|
DROP DATABASE db1;
|
|
show databases;
|
|
Database
|
|
information_schema
|
|
mtr
|
|
mysql
|
|
performance_schema
|
|
test
|