polardbxengine/mysql-test/suite/innodb/t/log_file_system.test

144 lines
4.1 KiB
Plaintext

# 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= <CNF>;
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';