205 lines
9.6 KiB
Plaintext
205 lines
9.6 KiB
Plaintext
|
|
let newdir= $MYSQLTEST_VARDIR/tmp/log_corruption;
|
|
--mkdir $newdir
|
|
--mkdir $newdir/mysql
|
|
write_file $newdir/mysql/plugin.frm;
|
|
EOF
|
|
|
|
let SEARCH_FILE = $newdir/my_restart.err;
|
|
let $args=--no-defaults --innodb_dedicated_server=OFF --datadir=$newdir --secure-file-priv="" --loose-skip-auto-generate-certs --loose-skip-sha256-password-auto-generate-rsa-keys --loose-console --loose-skip-log-bin --log-error-verbosity=3 > $SEARCH_FILE 2>&1 ;
|
|
|
|
--echo # redo log from before we started versioning in MySQL 5.7.9
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption.zip -d $newdir > $SEARCH_FILE
|
|
--error 1,42
|
|
--exec $MYSQLD $args
|
|
let SEARCH_PATTERN=Unsupported redo log format \(0\). The redo log was created before MySQL 5\.7\.9.*;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # redo log from before MySQL 8.0.3, with corrupted log block
|
|
--remove_file $newdir/ib_logfile0
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption0.zip -d $newdir > $SEARCH_FILE
|
|
--error 1,42
|
|
--exec $MYSQLD $args
|
|
let SEARCH_PATTERN=Upgrade after a crash is not supported.*;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # redo log from MySQL 8.0.3, but with invalid header checksum
|
|
--remove_file $newdir/ib_logfile0
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption1.zip -d $newdir > $SEARCH_FILE
|
|
--error 1,42
|
|
--exec $MYSQLD $args
|
|
let SEARCH_PATTERN=Invalid redo log header checksum;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # distant future redo log format, with valid header checksum
|
|
--remove_file $newdir/ib_logfile0
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption2.zip -d $newdir > $SEARCH_FILE
|
|
--error 1,42
|
|
--exec $MYSQLD $args
|
|
let SEARCH_PATTERN=Unknown redo log format \(4294967295\).*;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # redo log from MySQL 8.0.3, with corrupted log checkpoint
|
|
--remove_file $newdir/ib_logfile0
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption3.zip -d $newdir > $SEARCH_FILE
|
|
--error 1,42
|
|
--exec $MYSQLD $args
|
|
let SEARCH_PATTERN=No valid checkpoint found.*corrupted redo log;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # valid 5.7.9 header, valid checkpoint 1, all-zero (invalid) checkpoint 2,
|
|
--echo # invalid block checksum,
|
|
--echo # thus we cannot determine if the redo log is logically clean.
|
|
--remove_file $newdir/ib_logfile0
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption4.zip -d $newdir > $SEARCH_FILE
|
|
# Anything below innodb_force_recovery=6 must find a valid redo log.
|
|
# Missing tablespace files are tolerated already with innodb_force_recovery=1.
|
|
--error 1,42
|
|
--exec $MYSQLD $args --innodb-force-recovery=5
|
|
let SEARCH_PATTERN=Database upgrade cannot be accomplished with innodb_force_recovery > 0;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # --innodb-force-recovery=6 (skip the entire redo log)
|
|
--error 1,42
|
|
--exec $MYSQLD $args --innodb-force-recovery=6
|
|
let SEARCH_PATTERN=Database upgrade cannot be accomplished in read-only mode;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # valid 5.7.9 header, valid checkpoint 1, all-zero (invalid) checkpoint 2, invalid block number
|
|
--remove_file $newdir/ib_logfile0
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption4a.zip -d $newdir > $SEARCH_FILE
|
|
# Anything below innodb_force_recovery=6 must find a valid redo log.
|
|
# Missing tablespace files are tolerated already with innodb_force_recovery=1.
|
|
--echo # Start with innodb-force-recovery=5
|
|
--error 1,42
|
|
--exec $MYSQLD $args --innodb-force-recovery=5
|
|
let SEARCH_PATTERN=Database upgrade cannot be accomplished with innodb_force_recovery > 0;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # Start with --innodb-force-recovery=6 (skip the entire redo log)
|
|
--error 1,42
|
|
--exec $MYSQLD $args --innodb-force-recovery=6
|
|
let SEARCH_PATTERN=Database upgrade cannot be accomplished in read-only mode;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # valid 8.0.3 header, valid checkpoint 1, all-zero (invalid) checkpoint 2, invalid block checksum
|
|
--remove_file $newdir/ib_logfile0
|
|
# Make server believe this is 8.0 datadir
|
|
--move_file $newdir/mysql/plugin.frm $newdir/mysql/plugin.frm.old
|
|
write_file $newdir/mysql.ibd;
|
|
EOF
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption4b.zip -d $newdir > $SEARCH_FILE
|
|
--error 1,42
|
|
--exec $MYSQLD $args --innodb-force-recovery=5
|
|
let SEARCH_PATTERN=Log block 2372 at lsn 1213952 has valid header, but checksum field contains 144444122, should be 3362026715;
|
|
--source include/search_pattern.inc
|
|
let SEARCH_PATTERN=Data Dictionary initialization failed;
|
|
--source include/search_pattern.inc
|
|
--remove_file $newdir/mysql.ibd
|
|
--move_file $newdir/mysql/plugin.frm.old $newdir/mysql/plugin.frm
|
|
|
|
--echo # --innodb-force-recovery=6 (skip the entire redo log)
|
|
--error 1,42
|
|
--exec $MYSQLD $args --innodb-force-recovery=6
|
|
let SEARCH_PATTERN=Database upgrade cannot be accomplished in read-only mode;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # valid 5.7.9 header, valid checkpoint 1, no matching MLOG_CHECKSUM
|
|
--remove_file $newdir/ib_logfile0
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption4c.zip -d $newdir > $SEARCH_FILE
|
|
--error 1,42
|
|
--exec $MYSQLD $args
|
|
let SEARCH_PATTERN=Upgrade after a crash is not supported\\. This redo log was created with malicious intentions, or perhaps\\.;
|
|
--source include/search_pattern.inc
|
|
let SEARCH_PATTERN=Data Dictionary initialization failed;
|
|
--source include/search_pattern.inc
|
|
--echo # --innodb-force-recovery=6 (skip the entire redo log)
|
|
--error 1,42
|
|
--exec $MYSQLD $args --innodb-force-recovery=6
|
|
let SEARCH_PATTERN=Database upgrade cannot be accomplished in read-only mode;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # upgrade: valid 5.7.9 header, valid checkpoint 1, logically non empty
|
|
--echo # redo log
|
|
--remove_file $newdir/ib_logfile0
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption4d.zip -d $newdir > $SEARCH_FILE
|
|
--error 1,42
|
|
--exec $MYSQLD $args --innodb-log-file-size=4M
|
|
let SEARCH_PATTERN=Upgrade after a crash is not supported.*;
|
|
--source include/search_pattern.inc
|
|
|
|
# Replace database with 1M redo logs from before MySQL 8.0.3
|
|
--remove_file $newdir/ib_logfile0
|
|
--remove_file $newdir/ib_logfile1
|
|
--remove_file $newdir/ibdata1
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption.zip -d $newdir > $SEARCH_FILE
|
|
|
|
--echo # Test a corrupted record.
|
|
--echo # current header, valid checkpoint 1, all-zero (invalid) checkpoint 2
|
|
--remove_file $newdir/ib_logfile0
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption5.zip -d $newdir > $SEARCH_FILE
|
|
--error 1,42
|
|
--exec $MYSQLD $args
|
|
let SEARCH_PATTERN=############### CORRUPT LOG RECORD FOUND ###############;
|
|
--source include/search_pattern.inc
|
|
let SEARCH_PATTERN=Log record type 56, page 0:0\\. Log parsing proceeded successfully up to 1213964\\. Previous log record type 128, is multi 0 Recv offset 0, prev 0;
|
|
--source include/search_pattern.inc
|
|
let SEARCH_PATTERN= len 22. hex 38000000000012860cb7809781e80006626f67757300. asc 8 bogus ;
|
|
--source include/search_pattern.inc
|
|
let SEARCH_PATTERN=Set innodb_force_recovery to ignore this error;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # Test a corrupted record.
|
|
--echo # valid header, invalid checkpoint 1, valid checkpoint 2
|
|
--remove_file $newdir/ib_logfile0
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption6.zip -d $newdir > $SEARCH_FILE
|
|
--error 1,42
|
|
--exec $MYSQLD $args
|
|
let SEARCH_PATTERN=The log file was created by mysqlbackup --apply-log at MEB was here!!!1!\\. The following crash recovery is part of a normal restore\\.;
|
|
--source include/search_pattern.inc
|
|
let SEARCH_PATTERN=############### CORRUPT LOG RECORD FOUND ###############;
|
|
--source include/search_pattern.inc
|
|
let SEARCH_PATTERN=Log record type 56, page 0:0\\. Log parsing proceeded successfully up to 1213964\\. Previous log record type 128, is multi 0 Recv offset 0, prev 0;
|
|
--source include/search_pattern.inc
|
|
let SEARCH_PATTERN=Hex dump starting 0 bytes before and ending 22 bytes after the corrupted record;
|
|
--source include/search_pattern.inc
|
|
let SEARCH_PATTERN= len 22. hex 38000000000012860cb7809781e80006626f67757300. asc 8 bogus ;
|
|
--source include/search_pattern.inc
|
|
let SEARCH_PATTERN=Set innodb_force_recovery to ignore this error;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # Test a corrupted record with creator field very long.
|
|
# This file was created in such a way that checksums agree, but the creator field
|
|
# and all subsequent bytes are non-zero, which might cause buffer overrun if one
|
|
# simply tried to copy the creator string in a way which expects '\0'-terminated string
|
|
--remove_file $newdir/ib_logfile0
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption6b.zip -d $newdir > $SEARCH_FILE
|
|
--error 1,42
|
|
--exec $MYSQLD $args
|
|
# The important thing here is that the field for creator has 32 bytes, and the file actually contains
|
|
# MEB45678901234567890123456789012
|
|
# which is 32 non-zero bytes (the string is thus not '\0'-terminated).
|
|
# Moreover the following bytes, up to 2k-byte boundary are also non-zero, which means that
|
|
# the whole read portion of header does not contain '\0'.
|
|
# We expect this last '2' to be replaced with '\0' for safety.
|
|
# If it is not replaced by '\0' then the output will contain the rest of header
|
|
# and also a part of stack variables until first '\0'.
|
|
let SEARCH_PATTERN=The log file was created by mysqlbackup --apply-log at MEB4567890123456789012345678901\\. The following crash recovery is part of a normal restore\\.;
|
|
--source include/search_pattern.inc
|
|
|
|
--echo # Upgrade: valid 5.7.9 header, valid checkpoint 1, logically empty
|
|
--echo # redo log
|
|
--force-rmdir $newdir
|
|
--mkdir $newdir
|
|
--mkdir $newdir/mysql
|
|
write_file $newdir/mysql/plugin.frm;
|
|
EOF
|
|
|
|
--exec unzip $MYSQL_TEST_DIR/suite/innodb/t/log_corruption7.zip -d $newdir > $SEARCH_FILE
|
|
--error 1
|
|
--exec $MYSQLD $args
|
|
let SEARCH_PATTERN=Upgrading redo log: 2\\*.* bytes, LSN=1319985;
|
|
--source include/search_pattern.inc
|
|
|
|
--force-rmdir $newdir
|