mirror of
https://github.com/MariaDB/server.git
synced 2025-08-29 00:08:14 +03:00
Actual error number returned from the query depends what point corrupted page is accessed, is it accessed when we read one of the pages for result set or is it accessed during background page read.
81 lines
2.0 KiB
Plaintext
81 lines
2.0 KiB
Plaintext
#
|
|
# Test opening a corrupted table.
|
|
#
|
|
|
|
-- source include/not_encrypted.inc
|
|
|
|
call mtr.add_suppression("InnoDB: Table \"test\".\"t1\" is corrupted. Please drop the table and recreate.");
|
|
call mtr.add_suppression("InnoDB: Cannot open table test/t1 from the internal data dictionary of InnoDB though the .frm file for the table exists. See http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting.html for how you can resolve the problem.");
|
|
call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t1 page \[page id: space=[0-9]+, page number=[0-9]+\]. You may have to recover from a backup.");
|
|
|
|
# Don't test under embedded
|
|
source include/not_embedded.inc;
|
|
# Require InnoDB
|
|
source include/have_innodb.inc;
|
|
|
|
--echo # Create and populate the table to be corrupted
|
|
|
|
--disable_warnings
|
|
set global innodb_file_per_table=ON;
|
|
--enable_warnings
|
|
|
|
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 1712,1932
|
|
SELECT * FROM t1;
|
|
|
|
--error 1034,1712,1932
|
|
INSERT INTO t1(b) VALUES('abcdef');
|
|
|
|
--error 1712,1932
|
|
UPDATE t1 set b = 'deadbeef' where a = 1;
|
|
|
|
--echo # Cleanup, this must be possible
|
|
DROP TABLE t1;
|