mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-24412 InnoDB: Upgrade after a crash is not supported
recv_log_recover_10_4(): Widen the operand of bitwise and to 64 bits, so that the upgrade check will work when the redo log record is located more than 4 gigabytes from the start of the first file.
This commit is contained in:
@@ -69,6 +69,14 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||
COUNT(*)
|
||||
1
|
||||
FOUND 3 /InnoDB: Upgrading redo log:/ in mysqld.1.err
|
||||
# Empty large multi-file redo log from after MariaDB 10.2.2
|
||||
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
|
||||
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
|
||||
WHERE engine = 'innodb'
|
||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||
COUNT(*)
|
||||
1
|
||||
FOUND 4 /InnoDB: Upgrading redo log:/ in mysqld.1.err
|
||||
# redo log from "after" MariaDB 10.2.2, but with invalid header checksum
|
||||
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption
|
||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||
@@ -179,7 +187,7 @@ WHERE engine = 'innodb'
|
||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||
COUNT(*)
|
||||
1
|
||||
FOUND 5 /InnoDB: Upgrading redo log:/ in mysqld.1.err
|
||||
FOUND 6 /InnoDB: Upgrading redo log:/ in mysqld.1.err
|
||||
# Minimal MariaDB 10.1.21 encrypted redo log
|
||||
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
|
||||
SELECT COUNT(*) `1` FROM INFORMATION_SCHEMA.ENGINES WHERE engine='innodb'
|
||||
|
@@ -69,6 +69,14 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||
COUNT(*)
|
||||
1
|
||||
FOUND 3 /InnoDB: Upgrading redo log:/ in mysqld.1.err
|
||||
# Empty large multi-file redo log from after MariaDB 10.2.2
|
||||
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
|
||||
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
|
||||
WHERE engine = 'innodb'
|
||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||
COUNT(*)
|
||||
1
|
||||
FOUND 4 /InnoDB: Upgrading redo log:/ in mysqld.1.err
|
||||
# redo log from "after" MariaDB 10.2.2, but with invalid header checksum
|
||||
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption
|
||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||
@@ -179,7 +187,7 @@ WHERE engine = 'innodb'
|
||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||
COUNT(*)
|
||||
1
|
||||
FOUND 5 /InnoDB: Upgrading redo log:/ in mysqld.1.err
|
||||
FOUND 6 /InnoDB: Upgrading redo log:/ in mysqld.1.err
|
||||
# Minimal MariaDB 10.1.21 encrypted redo log
|
||||
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5
|
||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||
|
@@ -291,6 +291,42 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||
--source include/search_pattern_in_file.inc
|
||||
--let $restart_parameters= $dirs
|
||||
|
||||
--echo # Empty large multi-file redo log from after MariaDB 10.2.2
|
||||
perl;
|
||||
do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl";
|
||||
my $polynomial = 0x82f63b78; # CRC-32C
|
||||
|
||||
die unless open OUT, "+<", "$ENV{bugdir}/ib_logfile0";
|
||||
binmode OUT;
|
||||
$_= pack("Nx[5]nx[5]", 1, 0x1286) . "BogoDB 4.3.2.1" . chr(0) x 478;
|
||||
print OUT $_, pack("N", mycrc32($_, 0, $polynomial));
|
||||
# checkpoint page 1 and all-zero checkpoint 2
|
||||
$_= pack("x[13]nCNNx[484]", 0x1286, 12, 2, 0x80c);
|
||||
print OUT $_, pack("N", mycrc32($_, 0, $polynomial));
|
||||
print OUT chr(0) x 1024;
|
||||
die unless seek(OUT, 0x1FFFFFFFF, 0);
|
||||
print OUT chr(0);
|
||||
close OUT or die;
|
||||
die unless open OUT, ">", "$ENV{bugdir}/ib_logfile1";
|
||||
binmode OUT;
|
||||
die unless seek(OUT, 0x800, 0); # the first 2048 bytes are unused!
|
||||
$_= pack("Nnnx[500]", 0x80000944, 12, 12);
|
||||
print OUT $_, pack("N", mycrc32($_, 0, $polynomial));
|
||||
die unless seek(OUT, 0x1FFFFFFFF, 0);
|
||||
print OUT chr(0);
|
||||
close OUT or die;
|
||||
EOF
|
||||
|
||||
--let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=2m
|
||||
--source include/start_mysqld.inc
|
||||
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
|
||||
WHERE engine = 'innodb'
|
||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||
--source include/shutdown_mysqld.inc
|
||||
--let SEARCH_PATTERN= InnoDB: Upgrading redo log:
|
||||
--source include/search_pattern_in_file.inc
|
||||
--let $restart_parameters= $dirs
|
||||
|
||||
--remove_file $bugdir/ib_logfile0
|
||||
--move_file $bugdir/ib_logfile $bugdir/ib_logfile0
|
||||
|
||||
|
@@ -1412,7 +1412,7 @@ static dberr_t recv_log_recover_10_4()
|
||||
return DB_CORRUPTION;
|
||||
}
|
||||
|
||||
recv_sys.read(source_offset & ~(OS_FILE_LOG_BLOCK_SIZE - 1),
|
||||
recv_sys.read(source_offset & ~lsn_t(OS_FILE_LOG_BLOCK_SIZE - 1),
|
||||
{buf, OS_FILE_LOG_BLOCK_SIZE});
|
||||
|
||||
ulint crc = log_block_calc_checksum_crc32(buf);
|
||||
|
Reference in New Issue
Block a user