--source include/have_file_key_management.inc --source include/innodb_page_size.inc call mtr.add_suppression("\\[ERROR\\] InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=3\\] in file '.*test.t1\\.ibd' cannot be decrypted."); call mtr.add_suppression("\\[ERROR\\] InnoDB: Table `test`\\.`t1` has an unreadable root page"); CREATE TABLE t1(c VARCHAR(128)) ENGINE INNODB, encrypted=yes; insert into t1 select repeat('a',100); let MYSQLD_DATADIR=`select @@datadir`; let INNODB_PAGE_SIZE=`select @@innodb_page_size`; --source include/shutdown_mysqld.inc --echo # Corrupt the table perl; use strict; use warnings; use Fcntl qw(:DEFAULT :seek); do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl"; my $ps = $ENV{INNODB_PAGE_SIZE}; sysopen IBD_FILE, "$ENV{MYSQLD_DATADIR}/test/t1.ibd", O_RDWR || die "Cannot open t1.ibd\n"; sysread(IBD_FILE, $_, 58) || die "Cannot read t1.ibd\n"; my $space = unpack("x[34]N", $_); my $full_crc32 = unpack("N",substr($_,54,4)) & 0x10; # FIL_SPACE_FLAGS sysseek(IBD_FILE, $ps * 3, SEEK_SET) || die "Cannot seek t1.ibd\n"; # better to have a valid page number (3) my $page = pack("x[4]Nx[18]Nx[4]N", 3, 1, $space) . chr(0) x ($ps - 38); my $polynomial = 0x82f63b78; # CRC-32C if ($full_crc32) { # no possibility of bug here my $ck = mycrc32(substr($page, 0, $ps - 4), 0, $polynomial); substr($page, $ps - 4, 4) = pack("N", $ck); } else { my $ck= pack("N",mycrc32(substr($page, 4, 22), 0, $polynomial) ^ mycrc32(substr($page, 38, $ps - 38 - 8), 0, $polynomial)); substr($page,0,4)=$ck; substr($page,$ps-8,4)=$ck; # trigger the bug by having the same "post-encryption" checksum! substr($page,30,4)=$ck; } die unless syswrite(IBD_FILE, $page, $ps) == $ps; close IBD_FILE; EOF --source include/start_mysqld.inc echo # xtrabackup backup; let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; let $backuplog=$MYSQLTEST_VARDIR/tmp/backup.log; let $expect_error= 1; if (`select @@innodb_checksum_algorithm LIKE '%full_crc32'`) { let $expect_error= 0; } --disable_result_log --error $expect_error exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --extended-validation --target-dir=$targetdir --core-file > $backuplog; --enable_result_log --let SEARCH_PATTERN=Database page corruption detected.* --let SEARCH_FILE=$backuplog --source include/search_pattern_in_file.inc remove_file $backuplog; rmdir $targetdir; # Due to very constructed nature of the "corruption" (faking checksums), the "corruption" won't be found without --extended-validation --disable_result_log exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; --enable_result_log drop table t1; rmdir $targetdir;