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 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
|
################################################################################
# InnoDB: Reclaim disk space occupied by temporary tables online.
# This test case will test
# - Starting server with innodb_temp_tablespaces_dir system variable
# - Initial number of .ibt files and their size
# - Info population in INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES
# - New set of .ibt files getting allocated once initial set is exausted
# - Session tablespaces getting allocated for explicit temporary tables
# - Session tablespaces getting allocated for intrinsic temporary tables
# - Purpose/state of .ibt files getting displayed
# - Space getting reclaimed on disconnection
# - Test with invalid values of innodb_temp_tablespaces_dir
# - Disk full scenario
# - Creating workload and executing queries involving intrinsic tables
################################################################################
--source include/have_binlog_format_row.inc
--source include/have_debug.inc
--source include/have_innodb_16k.inc
--mkdir $MYSQLTEST_VARDIR/tmp/wl11613_dir/
let $restart_parameters = "restart: --innodb_temp_tablespaces_dir=$MYSQLTEST_VARDIR/tmp/wl11613_dir";
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
--source include/restart_mysqld.inc
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
SELECT @@innodb_temp_tablespaces_dir;
--echo # Check the initial number of .ibt files and their size
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;
--echo # Check connection_id() of session is populated correctly in
--echo # ID column of INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES WHERE ID = connection_id();
--echo # Check the default location of innodb_temp_tablespaces_dir
let $restart_parameters=;
--source include/restart_mysqld.inc
let $MYSQLD_DATADIR=`SELECT @@datadir`;
--replace_regex /\.[\\\/]#innodb_temp[\\\/]/#innodb_temp/
SELECT @@innodb_temp_tablespaces_dir;
# Using on disk tablespace for intrinsic optimiser tables
SET GLOBAL big_tables=ON;
--echo # Create a new connection.
connect (con1, localhost, root,,);
connection con1;
--echo # A session tablespace will be allocated to connection 1
--echo # for explicit temporary tables and state will be active
CREATE TEMPORARY TABLE test.t1(a INT, b BLOB);
CREATE TEMPORARY TABLE test.t2(a INT, b BLOB);
INSERT INTO t1 values (1, 'hello'), (2, 'hi'), (3, 'wl11613'), (4, 'temp'), (5, 'tablespace');
INSERT INTO t2 values (1, 'hello'), (2, 'hi'), (3, 'wl11613'), (4, 'temp'), (5, 'tablespace');
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
--echo # Create a new connection.
connect (con2, localhost, root,,);
connection con2;
--echo # A session tablespace will be allocated to connection 2
--echo # for explicit temporary tables
--echo # One more session tablespace will be allocated for intrinsic
--echo # temporary tables on executing select query from
--echo # INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES
--echo # State for both tablespaces would be active
--echo # The purpose for internal tablespace would be intrinsic
--echo # The purpose for tablespace for user defined temporary tables
--echo # would be USER
--echo # The purpose of inactive(unallocated) tablespaces would be none
CREATE TEMPORARY TABLE test.t1(a INT, b BLOB);
CREATE TEMPORARY TABLE test.t2(a INT, b BLOB);
INSERT INTO t1 values (1, 'hello'), (2, 'hi'), (3, 'wl11613'), (4, 'temp'), (5, 'tablespace');
INSERT INTO t2 values (1, 'hello'), (2, 'hi'), (3, 'wl11613'), (4, 'temp'), (5, 'tablespace');
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t2;
INSERT INTO t2 SELECT * FROM t1;
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;
--echo # Ensure entries in information_schema.processlist and
--echo # information_schema.innodb_session_temp_tablespaces are
--echo # in sync
SELECT USER, b.STATE, INFO, SIZE, a.STATE, PURPOSE FROM
INFORMATION_SCHEMA.PROCESSLIST a, INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES b
WHERE a.ID=b.ID ORDER BY SPACE;
# Creating more connections to see if a new set of session tablespaces
# get created once initial set of 10 ibt files get allocated.
--echo # Create a new connection.
connect (con3, localhost, root,,);
connection con3;
CREATE TEMPORARY TABLE test.t1(a INT, b BLOB);
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;
--echo # Create a new connection.
connect (con4, localhost, root,,);
connection con4;
CREATE TEMPORARY TABLE test.t1(a INT, b BLOB);
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;
--echo # Create a new connection.
connect (con5, localhost, root,,);
connection con5;
CREATE TEMPORARY TABLE test.t1(a INT, b BLOB);
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;
--echo # Create a new connection.
connect (con6, localhost, root,,);
connection con6;
--echo # This CREATE will cause 10 more session temporary tablespaces to be
--echo # created. Use a debug flag to simulate a failure in fallocate on Linux
--echo # so the code will fall back to setting the file size by writing zeros.
SET SESSION DEBUG = "+d,fil_create_temp_tablespace_fail_fallocate";
CREATE TEMPORARY TABLE test.t1(a INT, b BLOB);
SET SESSION DEBUG = "-d,fil_create_temp_tablespace_fail_fallocate";
# At this point, all 10 tablespaces have been allocated.
# On executing select query from INNODB_SESSION_TEMP_TABLESPACES,
# new set of 10 ibt files would be created
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;
disconnect con1;
disconnect con2;
disconnect con3;
disconnect con4;
disconnect con5;
disconnect con6;
--echo # Space would now be reclaimed and state for all sessions would be inactive
--echo # in INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES except for one
--echo # intrinsic tablespace for default connection when select query from
--echo # INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACE is executed from
--echo # default connection
connection default;
# wait for all the connections to go away and release the temporary tablespaces
let $wait_timeout= 60;
let $wait_condition= SELECT COUNT(*) = 1 from INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES WHERE STATE = 'ACTIVE';
--source include/wait_condition.inc
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;
--source include/shutdown_mysqld.inc
--echo "List files in #innodb_temp. It should be empty"
--list_files $MYSQLD_DATADIR/#innodb_temp/
--echo "Check if ibtmp1 exists in datadir. There should be no ibtmp1"
--error 1
--file_exists $MYSQLD_DATADIR/ibtmp1
# Note: Relative path for innodb_temp_tablespaces_dir is with respect to datadir.
# Any directory inside datadir is not allowed for innodb_temp_tablespaces_dir
--echo "Test with invalid values of innodb_temp_tablespaces_dir"
--echo "invalid abc dir"
--error 1,42
--exec $MYSQLD --datadir=$MYSQLD_DATADIR --innodb_temp_tablespaces_dir="abc"
--echo "invalid ./sys/ dir"
--error 1,42
--exec $MYSQLD --datadir=$MYSQLD_DATADIR --innodb_temp_tablespaces_dir="./sys/"
--echo "invalid /wl11613-do-not-exists/ dir"
--error 1,42
--exec $MYSQLD --datadir=$MYSQLD_DATADIR --innodb_temp_tablespaces_dir="/wl11613-do-not-exist/"
--echo "invalid empty \"\" "
--error 1,42
--exec $MYSQLD --datadir=$MYSQLD_DATADIR --innodb_temp_tablespaces_dir=""
--echo "invalid #innodb_temp "
--error 1,42
--exec $MYSQLD --datadir=$MYSQLD_DATADIR --innodb_temp_tablespaces_dir="#innodb_temp"
# Remove #innodb_temp directory manually and check if on next restart the
# directory is getting created or not. It should be created and server
# should successfully start
--rmdir $MYSQLD_DATADIR/#innodb_temp
let $restart_parameters=;
--source include/start_mysqld.inc
--echo "Check if ibtmp1 exists in datadir. It should be recreated on restart"
--file_exists $MYSQLD_DATADIR/ibtmp1
# Create a dummy file in #innodb_temp directory manually and see if
# this is shown in INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES
--write_file $MYSQLD_DATADIR/#innodb_temp/temp_11.ibt
test contents
EOF
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;
--echo # Simulating disk space full scenario
SET GLOBAL big_tables=ON;
--replace_regex /\.[\\\/]#innodb_temp[\\\/]/#innodb_temp/
SELECT @@innodb_temp_tablespaces_dir;
--echo # Create a new connection.
connect (con1, localhost, root,,);
connection con1;
SET SESSION DEBUG='+d,ibt_pool_exhausted';
--error ER_NO_SESSION_TEMP
CREATE TEMPORARY TABLE t1 (a INT);
SET SESSION DEBUG='-d,ibt_pool_exhausted';
CREATE TABLE t3(a INT, b BLOB);
INSERT INTO t3 VALUES (1, 'hi'), (2, 'hello');
SET SESSION DEBUG='+d,ibt_pool_exhausted';
--replace_regex /tablespace.*failed/tablespace failed/
--error ER_NO_SESSION_TEMP
INSERT INTO t3 SELECT * FROM t3;
SET SESSION DEBUG='-d,ibt_pool_exhausted';
--echo # Create Workload and execute queries involving intrinsic tables.
let $wl6737_auto_inc = auto_increment;
--disable_result_log
--disable_query_log
--source suite/innodb/include/create_workload_itt.inc
--source suite/innodb/include/query_workload_itt.inc
--enable_query_log
--enable_result_log
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;
disconnect con1;
connection default;
--sleep 2
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;
--source suite/innodb/include/drop_workload_itt.inc
SET GLOBAL big_tables=default;
--force-rmdir $MYSQLTEST_VARDIR/tmp/wl11613_dir/
# tablespace identifier for temporary tablespace is allowed
# with INNODB_STRICT_MODE ON as well as OFF
set @@innodb_strict_mode=0;
CREATE TEMPORARY table t1(a INT) TABLESPACE=innodb_temporary;
set @@innodb_strict_mode=1;
CREATE TEMPORARY table t2(a INT) TABLESPACE=innodb_temporary;
SHOW WARNINGS;
CREATE TEMPORARY TABLE t3 (a INT);
ALTER TABLE t3 TABLESPACE innodb_temporary;
SHOW WARNINGS;
--error ER_ILLEGAL_HA_CREATE_OPTION
CREATE TEMPORARY TABLE t4 (a INT) TABLESPACE=innodb_system;
--error ER_RESERVED_TABLESPACE_NAME
CREATE TEMPORARY TABLE t4 (a INT) TABLESPACE=mysql;
CREATE TABLESPACE tbs ADD DATAFILE 'tbs.ibd' engine=INNODB;
--error ER_ILLEGAL_HA_CREATE_OPTION
CREATE TEMPORARY TABLE t4 (a INT) TABLESPACE=tbs;
--replace_regex /\\#innodb_temp\\temp/\/#innodb_temp\/temp/
SELECT PATH, SIZE, STATE, PURPOSE FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES ORDER BY SPACE;
--echo #########################################################################
--echo # Cleanup
--echo #########################################################################
DROP TABLESPACE tbs;
--disable_query_log
call mtr.add_suppression("Unable to allocate temporary tablespace for this session");
call mtr.add_suppression("Failed to preallocate data for file");
--enable_query_log
|