# # 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;