mirror of
https://github.com/MariaDB/server.git
synced 2025-02-12 00:15:35 +01:00
81 lines
2.2 KiB
Text
81 lines
2.2 KiB
Text
#
|
|
# Test opening a corrupted table.
|
|
#
|
|
# Restarting is not supported under embedded
|
|
-- source include/not_embedded.inc
|
|
# Require InnoDB
|
|
-- source include/have_innodb.inc
|
|
-- source include/not_encrypted.inc
|
|
|
|
--disable_query_log
|
|
call mtr.add_suppression("InnoDB: Table `test`\\.`t1` is corrupted\\. Please drop the table and recreate\\.");
|
|
call mtr.add_suppression("InnoDB: Failed to read page [1-9][0-9]* from file '.*test.t1\\.ibd'");
|
|
call mtr.add_suppression("InnoDB: We detected index corruption in an InnoDB type table");
|
|
call mtr.add_suppression("Index for table 't1' is corrupt; try to repair it");
|
|
call mtr.add_suppression("InnoDB: File '.*test/t1\\.ibd' is corrupted");
|
|
--enable_query_log
|
|
|
|
--echo # Ensure that purge will not crash on the table after we corrupt it.
|
|
SET GLOBAL innodb_fast_shutdown=0;
|
|
|
|
--echo # Create and populate the table to be corrupted
|
|
|
|
CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB;
|
|
INSERT INTO t1 (b) VALUES ('corrupt me');
|
|
--disable_query_log
|
|
--let $i = 10
|
|
while ($i)
|
|
{
|
|
INSERT INTO t1 (b) VALUES (REPEAT('abcdefghijklmnopqrstuvwxyz', 100));
|
|
dec $i;
|
|
}
|
|
--enable_query_log
|
|
INSERT INTO t1 (b) VALUES ('corrupt me');
|
|
|
|
let $MYSQLD_DATADIR=`select @@datadir`;
|
|
let t1_IBD = $MYSQLD_DATADIR/test/t1.ibd;
|
|
|
|
--source include/shutdown_mysqld.inc
|
|
|
|
--echo # Corrupt the table
|
|
|
|
perl;
|
|
use strict;
|
|
use warnings;
|
|
use Fcntl qw(:DEFAULT :seek);
|
|
|
|
my $ibd_file = $ENV{'t1_IBD'};
|
|
|
|
my $chunk;
|
|
my $len;
|
|
|
|
sysopen IBD_FILE, $ibd_file, O_RDWR || die "Unable to open $ibd_file";
|
|
|
|
while ($len = sysread IBD_FILE, $chunk, 1024)
|
|
{
|
|
if ($chunk =~ s/corrupt me/korrupt me/)
|
|
{
|
|
print "Munged a string.\n";
|
|
sysseek IBD_FILE, -$len, SEEK_CUR;
|
|
syswrite IBD_FILE, $chunk, $len;
|
|
}
|
|
}
|
|
|
|
close IBD_FILE;
|
|
EOF
|
|
|
|
--source include/start_mysqld.inc
|
|
|
|
--echo # Now t1 is corrupted but we should not crash
|
|
|
|
--error ER_GET_ERRNO,ER_NOT_KEYFILE,ER_INDEX_CORRUPT,ER_NO_SUCH_TABLE_IN_ENGINE
|
|
SELECT * FROM t1;
|
|
|
|
--error 126,ER_GET_ERRNO,ER_NOT_KEYFILE,ER_INDEX_CORRUPT,ER_NO_SUCH_TABLE_IN_ENGINE
|
|
INSERT INTO t1(b) VALUES('abcdef');
|
|
|
|
--error ER_GET_ERRNO,ER_NOT_KEYFILE,ER_INDEX_CORRUPT,ER_NO_SUCH_TABLE_IN_ENGINE
|
|
UPDATE t1 set b = 'deadbeef' where a = 1;
|
|
|
|
--echo # Cleanup, this must be possible
|
|
DROP TABLE t1;
|