-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Description of how DROP DATABASE works after this patch - Collect list of tables - DDL log tables as they are dropped - DDL log drop database - Delete db.opt - Delete data directory - Log either DROP TABLE or DROP DATABASE to binary log - De active ddl log entry This is in line of how things where before (minus ddl logging) except that we delete db.opt file last to not loose it if DROP DATABASE fails. On recovery we have to ensure that all dropped tables are logged in binary log and that they are properly dropped (as with atomic drop table). No new tables be dropped as part of recovery. Recovery of active drop database ddl log entry: - If drop database was logged to ddl log but was not found in the binary log: - drop the db.opt file and database directory. - Log DROP DATABASE to binary log - If drop database was not logged to ddl log - Update binary log with DROP TABLE of the dropped tables. If table list is longer than max_allowed_packet, then the query will be split into multiple DROP TABLE/VIEW queries. Other things: - Added DDL_LOG_STATE and 'current database' as arguments to mysql_rm_table_no_locks(). This was needed to be able to combine ddl logging of DROP DATABASE and DROP TABLE and make the generated DROP TABLE statements shorter. - To make the DROP TABLE statement created by ddl log shorter, I changed the binlogged query to use current directory and omit the directory part for all tables in the current directory. - Merged some DROP TABLE and DROP VIEW code in ddl logger. This was done to be able get separate DROP VIEW and DROP TABLE statements in the binary log. - Added a 'recovery_state' variable to remember the state of dropped tables and views. - Moved out code that drops database objects (stored procedures) from mysql_rm_db_internal() to drop_database_objects() for better code reuse. - Made mysql_rm_db_internal() global so that could be used by the ddl recovery code.
- Loading branch information
Showing
18 changed files
with
910 additions
and
282 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
call mtr.add_suppression("InnoDB: .* does not exist in the InnoDB internal"); | ||
"engine: aria crash point: ddl_log_drop_before_delete_table position: 1" | ||
t1v.frm | ||
t2.MAD | ||
t2.MAI | ||
t2.frm | ||
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation | ||
foo STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` PROCEDURE `foo`() | ||
insert into test.t1 values (42) latin1 latin1_swedish_ci latin1_swedish_ci | ||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `t1` /* generated by ddl recovery */ | ||
"engine: aria crash point: ddl_log_drop_before_delete_table position: 2" | ||
t1v.frm | ||
t2.MAD | ||
t2.MAI | ||
t2.frm | ||
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation | ||
foo STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` PROCEDURE `foo`() | ||
insert into test.t1 values (42) latin1 latin1_swedish_ci latin1_swedish_ci | ||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `t1` /* generated by ddl recovery */ | ||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `t1v` /* generated by ddl recovery */ | ||
"engine: aria crash point: ddl_log_drop_before_delete_table position: 3" | ||
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation | ||
foo STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` PROCEDURE `foo`() | ||
insert into test.t1 values (42) latin1 latin1_swedish_ci latin1_swedish_ci | ||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `t1`,`t2` /* generated by ddl recovery */ | ||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `t1v` /* generated by ddl recovery */ | ||
"engine: aria crash point: ddl_log_drop_after_drop_tables position: 1" | ||
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation | ||
foo STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` PROCEDURE `foo`() | ||
insert into test.t1 values (42) latin1 latin1_swedish_ci latin1_swedish_ci | ||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `t1`,`t2` /* generated by ddl recovery */ | ||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `t1v` /* generated by ddl recovery */ | ||
"engine: aria crash point: ddl_log_drop_before_ha_drop_database position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: aria crash point: ddl_log_drop_before_drop_db_routines position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: aria crash point: ddl_log_drop_after_drop_db_routines position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: aria crash point: ddl_log_drop_before_drop_option_file position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: aria crash point: ddl_log_drop_before_drop_dir position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: aria crash point: ddl_log_drop_after_drop_dir position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: aria crash point: ddl_log_drop_before_binlog position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: aria crash point: ddl_log_drop_after_binlog position: 1" | ||
master-bin.000001 # Query # # DROP DATABASE test2 | ||
"engine: innodb crash point: ddl_log_drop_before_delete_table position: 1" | ||
t1v.frm | ||
t2.frm | ||
t2.ibd | ||
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation | ||
foo STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` PROCEDURE `foo`() | ||
insert into test.t1 values (42) latin1 latin1_swedish_ci latin1_swedish_ci | ||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `t1` /* generated by ddl recovery */ | ||
"engine: innodb crash point: ddl_log_drop_before_delete_table position: 2" | ||
t1v.frm | ||
t2.frm | ||
t2.ibd | ||
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation | ||
foo STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` PROCEDURE `foo`() | ||
insert into test.t1 values (42) latin1 latin1_swedish_ci latin1_swedish_ci | ||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `t1` /* generated by ddl recovery */ | ||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `t1v` /* generated by ddl recovery */ | ||
"engine: innodb crash point: ddl_log_drop_before_delete_table position: 3" | ||
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation | ||
foo STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` PROCEDURE `foo`() | ||
insert into test.t1 values (42) latin1 latin1_swedish_ci latin1_swedish_ci | ||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `t1`,`t2` /* generated by ddl recovery */ | ||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `t1v` /* generated by ddl recovery */ | ||
"engine: innodb crash point: ddl_log_drop_after_drop_tables position: 1" | ||
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation | ||
foo STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`root`@`localhost` PROCEDURE `foo`() | ||
insert into test.t1 values (42) latin1 latin1_swedish_ci latin1_swedish_ci | ||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `t1`,`t2` /* generated by ddl recovery */ | ||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `t1v` /* generated by ddl recovery */ | ||
"engine: innodb crash point: ddl_log_drop_before_ha_drop_database position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: innodb crash point: ddl_log_drop_before_drop_db_routines position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: innodb crash point: ddl_log_drop_after_drop_db_routines position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: innodb crash point: ddl_log_drop_before_drop_option_file position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: innodb crash point: ddl_log_drop_before_drop_dir position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: innodb crash point: ddl_log_drop_after_drop_dir position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: innodb crash point: ddl_log_drop_before_binlog position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
"engine: innodb crash point: ddl_log_drop_after_binlog position: 1" | ||
master-bin.000001 # Query # # DROP DATABASE test2 | ||
Warnings: | ||
Note 1008 Can't drop database 'test2'; database doesn't exist |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
--source include/have_debug.inc | ||
--source include/have_innodb.inc | ||
--source include/have_log_bin.inc | ||
--source include/not_valgrind.inc | ||
|
||
# | ||
# Testing of atomic DROP DATABASE with crashes in a lot of different places | ||
# | ||
|
||
call mtr.add_suppression("InnoDB: .* does not exist in the InnoDB internal"); | ||
let $MYSQLD_DATADIR= `SELECT @@datadir`; | ||
|
||
let $engine_count=2; | ||
let $engines='aria','innodb'; | ||
|
||
let $crash_count=10; | ||
let $crash_points='ddl_log_drop_before_delete_table','ddl_log_drop_after_drop_tables','ddl_log_drop_before_ha_drop_database','ddl_log_drop_before_drop_db_routines','ddl_log_drop_after_drop_db_routines','ddl_log_drop_before_drop_option_file','ddl_log_drop_before_drop_dir','ddl_log_drop_after_drop_dir','ddl_log_drop_before_binlog','ddl_log_drop_after_binlog'; | ||
|
||
let $old_debug=`select @@debug_dbug`; | ||
|
||
let $e=0; | ||
let $keep_include_silent=1; | ||
let $grep_script=DROP; | ||
--disable_query_log | ||
|
||
while ($e < $engine_count) | ||
{ | ||
inc $e; | ||
let $engine=`select ELT($e, $engines)`; | ||
let $default_engine=$engine; | ||
let $extra_option=; | ||
|
||
if ($engine == "aria") | ||
{ | ||
let $extra_option=transactional=1; | ||
} | ||
if ($engine == "aria_notrans") | ||
{ | ||
let $default_engine="aria"; | ||
let $extra_option=transactional=0; | ||
} | ||
|
||
# Number of tables that should be dropped (we try to crash after each drop) | ||
let $drops=3; | ||
|
||
let $c=0; | ||
while ($c < $crash_count) | ||
{ | ||
inc $c; | ||
let $crash=`select ELT($c, $crash_points)`; | ||
let $r=0; | ||
while ($r < $drops) | ||
{ | ||
inc $r; | ||
create database test2; | ||
use test2; | ||
--eval set @@default_storage_engine=$default_engine; | ||
--eval create table t1 (a int not null) $extra_option; | ||
create view t1v as select * from t1; | ||
--eval create table t2 (b int not null) $extra_option; | ||
create procedure foo() | ||
insert into test.t1 values (42); | ||
|
||
flush tables; | ||
use test; | ||
|
||
RESET MASTER; | ||
|
||
echo "engine: $engine crash point: $crash position: $r"; | ||
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect | ||
--disable_reconnect | ||
--eval set @@debug_dbug="+d,$crash",@debug_crash_counter=$r | ||
let $errno=0; | ||
--error 0,2013 | ||
DROP DATABASE test2; | ||
let $error=$errno; | ||
--enable_reconnect | ||
--source include/wait_until_connected_again.inc | ||
--disable_query_log | ||
--eval set @@debug_dbug="$old_debug" | ||
|
||
if ($error == 0) | ||
{ | ||
echo "No crash!"; | ||
} | ||
use test; | ||
# Check which tables still exists | ||
--error 0,1 | ||
--list_files $MYSQLD_DATADIR/test2 t* | ||
--error 0,ER_SP_DOES_NOT_EXIST | ||
show create procedure test2.foo; | ||
|
||
--let $binlog_file=master-bin.000001 | ||
--source include/show_binlog_events.inc | ||
if ($error) | ||
{ | ||
--let $binlog_file=master-bin.000002 | ||
--source include/show_binlog_events.inc | ||
} | ||
# Really drop the tables. The warnings will show what was dropped | ||
--disable_warnings | ||
--error 0, ER_DB_DROP_EXISTS | ||
DROP DATABASE test2; | ||
--enable_warnings | ||
} | ||
# We only need to test drops for all tables for the first crash point | ||
let $drops=1; | ||
} | ||
} | ||
drop database if exists test2; | ||
|
||
--enable_query_log |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
--max-allowed-packet=1024 --net-buffer-length=1024 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
"engine: aria crash point: ddl_log_drop_after_drop_tables position: 1" | ||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `tABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB`,`tACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC`,`tADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD`,`tAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE`,`tAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF`,`tAGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG`,`tAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH`,`tAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII`,`tAJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ`,`tAKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK`,`tALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL` /* generated by ddl recovery */ | ||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `tABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBv`,`tACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCv`,`tADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDv`,`tAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEv`,`tAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFv`,`tAGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGv`,`tAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHv`,`tAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIv`,`tAJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv`,`tAKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKv` /* generated by ddl recovery */ | ||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `tAMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM`,`tANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN`,`tAOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO`,`tAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP`,`tAQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ`,`tARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR`,`tASSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS`,`tATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT`,`tAUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`,`tAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV`,`tAWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW` /* generated by ddl recovery */ | ||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `tALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLv`,`tAMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMv`,`tANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNv`,`tAOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOv`,`tAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPv`,`tAQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQv`,`tARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRv`,`tASSSSSSSSSSSSSSSSSSSSSSSSSSSSSSv`,`tATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTv`,`tAUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUv`,`tAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVv` /* generated by ddl recovery */ | ||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `tAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`,`tAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY`,`tAZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ`,`tBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`,`tBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB`,`tBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC`,`tBDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD`,`tBEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE` /* generated by ddl recovery */ | ||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `tAWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWv`,`tAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXv`,`tAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYv`,`tAZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZv`,`tBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv`,`tBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBv`,`tBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCv`,`tBDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDv`,`tBEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEv` /* generated by ddl recovery */ | ||
"engine: aria crash point: ddl_log_drop_before_binlog position: 1" | ||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */ | ||
Warnings: | ||
Note 1008 Can't drop database 'test2'; database doesn't exist |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
--source include/have_debug.inc | ||
--source include/have_log_bin.inc | ||
--source include/not_valgrind.inc | ||
|
||
# | ||
# Testing of atomic DROP DATABASE when the generated query could be too long | ||
# | ||
|
||
let $engine_count=1; | ||
let $engines='aria'; | ||
|
||
let $crash_count=2; | ||
let $crash_points='ddl_log_drop_after_drop_tables','ddl_log_drop_before_binlog'; | ||
|
||
let $max_tables=30; | ||
|
||
let $old_debug=`select @@debug_dbug`; | ||
|
||
let $keep_include_silent=1; | ||
let $grep_script=DROP; | ||
--disable_query_log | ||
|
||
let $e=0; | ||
while ($e < $engine_count) | ||
{ | ||
inc $e; | ||
let $engine=`select ELT($e, $engines)`; | ||
let $default_engine=$engine; | ||
let $extra_option=; | ||
|
||
if ($engine == "aria") | ||
{ | ||
let $extra_option=transactional=1; | ||
} | ||
if ($engine == "aria_notrans") | ||
{ | ||
let $default_engine="aria"; | ||
let $extra_option=transactional=0; | ||
} | ||
|
||
let $c=0; | ||
while ($c < $crash_count) | ||
{ | ||
inc $c; | ||
let $crash=`select ELT($c, $crash_points)`; | ||
let $r=0; | ||
while ($r < 1) | ||
{ | ||
inc $r; | ||
create database test2; | ||
use test2; | ||
--eval set @@default_storage_engine=$default_engine | ||
let $t=0; | ||
while ($t < $max_tables) | ||
{ | ||
inc $t; | ||
let $name=`select concat("t",char(floor(65+$t/26)),repeat(char(65+mod($t,26)),60))`; | ||
let $view=`select concat("t",char(floor(65+$t/26)),repeat(char(65+mod($t,26)),30),'v')`; | ||
--eval create table $name (a int not null) $extra_option | ||
--eval create view $view as select * from $name | ||
} | ||
|
||
flush tables; | ||
use test; | ||
|
||
RESET MASTER; | ||
|
||
echo "engine: $engine crash point: $crash position: $r"; | ||
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect | ||
--disable_reconnect | ||
--eval set @@debug_dbug="+d,$crash",@debug_crash_counter=$r | ||
let $errno=0; | ||
--error 0,2013 | ||
DROP DATABASE test2; | ||
let $error=$errno; | ||
--enable_reconnect | ||
--source include/wait_until_connected_again.inc | ||
--disable_query_log | ||
--eval set @@debug_dbug="$old_debug" | ||
|
||
if ($error == 0) | ||
{ | ||
echo "No crash!"; | ||
} | ||
use test; | ||
# Check which tables still exists | ||
--error 0,1 | ||
--list_files $MYSQLD_DATADIR/test2 t* | ||
--error 0,ER_SP_DOES_NOT_EXIST | ||
|
||
--let $binlog_file=master-bin.000001 | ||
--source include/show_binlog_events.inc | ||
if ($error) | ||
{ | ||
--let $binlog_file=master-bin.000002 | ||
--source include/show_binlog_events.inc | ||
} | ||
# Really drop the tables. The warnings will show what was dropped | ||
--disable_warnings | ||
--error 0, ER_DB_DROP_EXISTS | ||
DROP DATABASE test2; | ||
--enable_warnings | ||
} | ||
} | ||
} | ||
drop database if exists test2; | ||
|
||
--enable_query_log |
Oops, something went wrong.