# Test the detection of innodb_data_file_path mismatch. --source include/not_valgrind.inc # Can be 0, depends on where the mysqld process was killed call mtr.add_suppression("File '.*tablespaces.open..*' size is 0 bytes. Must be at least 12 bytes"); let MYSQLD_DATADIR= `select @@datadir`; let OLD_IBDATA= `select @@innodb_data_file_path`; let NEW_IBDATA_PREFIX= `select replace(@@innodb_data_file_path, 'ibdata1:12M:autoextend', 'ibdata1:12M')`; let NEW_CNF= $MYSQLTEST_VARDIR/tmp/new-my.cnf; if ($OLD_IBDATA == $NEW_IBDATA_PREFIX) { --skip Needs default innodb_data_file_path } let NEW_CNF_VARS = $MYSQLTEST_VARDIR/tmp/config.txt; perl; my $cmd = $ENV{MYSQLD_CMD}; my $cnf = $cmd; my $new_cnf = $ENV{NEW_CNF}; $cnf =~ s/.*--defaults-file=([^ ]*).*/$1/ || die "no --defaults-file in $cmd"; $cmd =~ s/--defaults-file=([^ ]*)/--defaults-file=$ENV{NEW_CNF}/ || die; $ENV{NEW_IBDATA_PREFIX} =~ s/:[0-9]+[MG]$//; my @files = split(';', $ENV{NEW_IBDATA_PREFIX}); my $file = $ENV{MYSQLD_DATADIR} . '/' . $files[$#files]; my $size = (stat($file))[7] || die "cannot stat $file"; open(FILE, ">$ENV{NEW_CNF_VARS}") || die "cannot open $ENV{NEW_CNF_VARS}"; print FILE "let NEW_CMD= $cmd;\n"; close(FILE); my $path = "$ENV{NEW_IBDATA_PREFIX}:" . ($size / 1048576) . "M;foo:1M"; open(CNF, "<$cnf") || die "cannot read $cnf"; my @rec= ; close(CNF); open(NEW_CNF, ">$new_cnf") || die "cannot write $new_cnf"; foreach (@rec){ print NEW_CNF; if($_ =~ /\[mysqld\]/){ print NEW_CNF "innodb_data_file_path=$path;\n"; } } close(NEW_CNF); EOF --source $NEW_CNF_VARS --remove_file $NEW_CNF_VARS CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB; --disable_query_log # Work around Bug#18605064 INNODB CREATES NEW DATA FILE BEFORE APPLYING REDO LOG call mtr.add_suppression("Tablespace size stored in header is [0-9]* pages, but the sum of data file sizes is [0-9]* pages"); --enable_query_log # Kill the server to inject faults. --source include/kill_mysqld.inc let SEARCH_FILE= $MYSQLTEST_VARDIR/log/my_restart.err; let $old_mysqld=$MYSQLD_CMD --console > $SEARCH_FILE 2>&1; let $new_mysqld=$NEW_CMD --console > $SEARCH_FILE 2>&1; --echo # Fault 1: Extra file in innodb_data_file_path --source include/start_mysqld.inc SHOW TABLES; --source include/shutdown_mysqld.inc --echo # Recovery and clean shutdown with old data file path # Empty the undo logs and the change buffer with innodb_fast_shutdown=0. # Otherwise, log_write_requests=0 could be violated after the last restart. --error 1 --exec $old_mysqld --innodb-fast-shutdown=0 --innodb-nonexistent-option let SEARCH_PATTERN= \[ERROR\] \[[^]]*\] \[[^]]*\] unknown option '--innodb-nonexistent-option'; --source include/search_pattern.inc --remove_file $SEARCH_FILE # Create empty data file perl; die unless open(FILE, ">$ENV{MYSQLD_DATADIR}/foo"); print FILE "\0" x 1048576; close(FILE); EOF --echo # Start with new data file path --exec echo "restart: --defaults-file=$NEW_CNF" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc --disable_reconnect INSERT INTO t1 VALUES (1); # Kill the server to inject faults. --source include/kill_mysqld.inc --echo # Fault 2: Missing file in innodb_data_file_path --source include/start_mysqld.inc SHOW TABLES; --source include/shutdown_mysqld.inc let SEARCH_FILE= $MYSQLTEST_VARDIR/log/my_restart.err; --echo # Recovery and shutdown with innodb-force-recovery (ignore unknown file) --error 1 --exec $old_mysqld --innodb-force-recovery=1 --innodb-fast-shutdown=0 --innodb-nonexistent-option let SEARCH_PATTERN= \[ERROR\] \[[^]]*\] \[[^]]*\] unknown option '--innodb-nonexistent-option'; --source include/search_pattern.inc --remove_file $SEARCH_FILE --echo # Cleanup --remove_file $MYSQLD_DATADIR/foo --remove_file $NEW_CNF --source include/start_mysqld.inc --echo # No log should be generated while persistent tablespaces are idle --echo # FIXME: Something occasionally violates this (log_write_requests=1) CREATE TEMPORARY TABLE t (a SERIAL) ENGINE=InnoDB; SELECT * FROM t1; DROP TABLE t1; SELECT count>0 FROM information_schema.innodb_metrics WHERE name='log_write_requests';