1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
--echo #
--echo # Inject failures in order to get code coverage.
--echo # Use explicit undo tablespaces and make the implicit spaces inactive.
--echo #
--source include/have_debug.inc
--source include/have_innodb_default_undo_tablespaces.inc
LET $MYSQLD_DATADIR = `select @@datadir`;
# Do a slow shutdown and restart to clear out the undo logs
SET GLOBAL innodb_fast_shutdown = 0;
--let $shutdown_server_timeout = 300
--source include/restart_mysqld.inc
SET @old_truncate_frequency = @@innodb_purge_rseg_truncate_frequency;
SET GLOBAL innodb_purge_rseg_truncate_frequency=5;
--disable_query_log
call mtr.add_suppression("\\[Warning\\] .* Failed to truncate undo tablespace");
call mtr.add_suppression("\\[Warning\\] .* Purge reached the head of the history list");
call mtr.add_suppression("\\[ERROR\\] .* Error 65 opening newly created undo tablespace");
call mtr.add_suppression("\\[ERROR\\] .* Cannot create truncate log for undo tablespace");
--enable_query_log
CREATE UNDO TABLESPACE undo_003 ADD DATAFILE 'undo_003.ibu';
CREATE UNDO TABLESPACE undo_004 ADD DATAFILE 'undo_004.ibu';
CREATE UNDO TABLESPACE undo_005 ADD DATAFILE 'undo_005.ibu';
ALTER UNDO TABLESPACE innodb_undo_001 SET INACTIVE;
let $inactive_undo_space = innodb_undo_001;
source include/wait_until_undo_space_is_empty.inc;
ALTER UNDO TABLESPACE innodb_undo_002 SET INACTIVE;
let $inactive_undo_space = innodb_undo_002;
source include/wait_until_undo_space_is_empty.inc;
SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE SPACE_TYPE = 'Undo' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo #
--echo # Bug#28966457: IF CREATE UNDO TABLESPACE FAILS, INCOMPLETE UNDO
--echo # TABLESPACE SHOULD BE CLEANED UP
--echo #
--list_files $MYSQLD_DATADIR/ undo_006.ibu
SET GLOBAL DEBUG="+d,ib_undo_tablespace_create_fail";
--error ER_CREATE_FILEGROUP_FAILED
CREATE UNDO TABLESPACE undo_006 ADD DATAFILE 'undo_006.ibu';
SET GLOBAL DEBUG="-d,ib_undo_tablespace_create_fail";
SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE SPACE_TYPE = 'Undo' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Make sure file is not left behind in datadir
--list_files $MYSQLD_DATADIR/ undo_006.ibu
--echo #
--echo # Inject a failure to open an undo tablespace after it is created.
--echo # The file remains on disk along with the truncate log file.
--echo #
--list_files $MYSQLD_DATADIR/ undo_006.ibu
SET GLOBAL DEBUG="+d,ib_undo_tablespace_open_fail";
--error ER_CREATE_FILEGROUP_FAILED
CREATE UNDO TABLESPACE undo_006 ADD DATAFILE 'undo_006.ibu';
SET GLOBAL DEBUG="-d,ib_undo_tablespace_open_fail";
SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE SPACE_TYPE = 'Undo' ORDER BY NAME;
SELECT TABLESPACE_NAME, FILE_TYPE, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_NAME LIKE '%undo%' ORDER BY TABLESPACE_NAME;
--echo # Make sure file is not left behind in datadir
--list_files $MYSQLD_DATADIR/ undo_006.ibu
--echo #
--echo # Inject a failure to get the MDL during undo truncate.
--echo #
SET GLOBAL DEBUG="+d,ib_undo_trunc_fail_get_mdl";
ALTER UNDO TABLESPACE undo_003 SET INACTIVE;
let $inactive_undo_space = undo_003;
source include/wait_until_undo_space_is_empty.inc;
ALTER UNDO TABLESPACE undo_003 SET ACTIVE;
SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE SPACE_TYPE = 'Undo' ORDER BY NAME;
--echo #
--echo # Inject a failure to locate the undo space during undo truncate.
--echo #
SET GLOBAL DEBUG="+d,ib_undo_trunc_fail_marked_space";
ALTER UNDO TABLESPACE undo_003 SET INACTIVE;
let $inactive_undo_space = undo_003;
source include/wait_until_undo_space_is_empty.inc;
ALTER UNDO TABLESPACE undo_003 SET ACTIVE;
SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE SPACE_TYPE = 'Undo' ORDER BY NAME;
--echo #
--echo # Inject a failure to write the undo trunc log file.
--echo #
SET GLOBAL DEBUG="+d,ib_undo_trunc_fail_start_logging";
ALTER UNDO TABLESPACE undo_003 SET INACTIVE;
let $inactive_undo_space = undo_003;
source include/wait_until_undo_space_is_empty.inc;
ALTER UNDO TABLESPACE undo_003 SET ACTIVE;
SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE SPACE_TYPE = 'Undo' ORDER BY NAME;
--echo #
--echo # Inject a simulated fast shutdown during undo truncate. The injection
--echo # does't really shutdown, it just does not finish the truncate.
--echo #
SET GLOBAL DEBUG="+d,ib_undo_trunc_fail_fast_shutdown";
ALTER UNDO TABLESPACE undo_003 SET INACTIVE;
let $inactive_undo_space = undo_003;
source include/wait_until_undo_space_is_empty.inc;
ALTER UNDO TABLESPACE undo_003 SET ACTIVE;
SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE SPACE_TYPE = 'Undo' ORDER BY NAME;
--echo #
--echo # Inject a failure to actually truncate the undo space.
--echo #
SET GLOBAL DEBUG="+d,ib_undo_trunc_fail_truncate";
ALTER UNDO TABLESPACE undo_003 SET INACTIVE;
let $inactive_undo_space = undo_003;
source include/wait_until_undo_space_is_empty.inc;
ALTER UNDO TABLESPACE undo_003 SET ACTIVE;
SELECT NAME, SPACE_TYPE, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE SPACE_TYPE = 'Undo' ORDER BY NAME;
--echo #
--echo # Cleanup
--echo #
SET GLOBAL DEBUG="-d,ib_undo_trunc_fail_get_mdl";
SET GLOBAL DEBUG="-d,ib_undo_trunc_fail_marked_space";
SET GLOBAL DEBUG="-d,ib_undo_trunc_fail_start_logging";
SET GLOBAL DEBUG="-d,ib_undo_trunc_fail_fast_shutdown";
SET GLOBAL DEBUG="-d,ib_undo_trunc_fail_truncate";
ALTER UNDO TABLESPACE innodb_undo_001 SET ACTIVE;
ALTER UNDO TABLESPACE innodb_undo_002 SET ACTIVE;
ALTER UNDO TABLESPACE undo_003 SET INACTIVE;
ALTER UNDO TABLESPACE undo_004 SET INACTIVE;
ALTER UNDO TABLESPACE undo_005 SET INACTIVE;
let $inactive_undo_space = undo_003;
source include/wait_until_undo_space_is_empty.inc;
let $inactive_undo_space = undo_004;
source include/wait_until_undo_space_is_empty.inc;
let $inactive_undo_space = undo_005;
source include/wait_until_undo_space_is_empty.inc;
DROP UNDO TABLESPACE undo_003;
DROP UNDO TABLESPACE undo_004;
DROP UNDO TABLESPACE undo_005;
SET GLOBAL innodb_purge_rseg_truncate_frequency=@old_truncate_frequency;
|