mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
158 lines
4.1 KiB
SQL
158 lines
4.1 KiB
SQL
#
|
|
# REPAIR TABLE statements
|
|
#
|
|
# Note: the output is likely to be different for the engine under test,
|
|
# in which case rdiff will be needed. Or, the output might say that
|
|
# the storage engine does not support REPAIR.
|
|
#
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1,t2;
|
|
--enable_warnings
|
|
|
|
--source create_table.inc
|
|
INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b');
|
|
--let $table_name = t2
|
|
--source create_table.inc
|
|
|
|
REPAIR TABLE t1;
|
|
if ($mysql_errname)
|
|
{
|
|
--source unexpected_result.inc
|
|
}
|
|
INSERT INTO t1 (a,b) VALUES (3,'c');
|
|
INSERT INTO t2 (a,b) VALUES (4,'d');
|
|
REPAIR NO_WRITE_TO_BINLOG TABLE t1, t2;
|
|
INSERT INTO t2 (a,b) VALUES (5,'e'),(6,'f');
|
|
REPAIR LOCAL TABLE t2;
|
|
INSERT INTO t1 (a,b) VALUES (7,'g'),(8,'h');
|
|
INSERT INTO t2 (a,b) VALUES (9,'i');
|
|
REPAIR LOCAL TABLE t2, t1 EXTENDED;
|
|
INSERT INTO t1 (a,b) VALUES (10,'j');
|
|
INSERT INTO t2 (a,b) VALUES (11,'k');
|
|
REPAIR TABLE t1, t2 QUICK USE_FRM;
|
|
INSERT INTO t1 (a,b) VALUES (12,'l');
|
|
INSERT INTO t2 (a,b) VALUES (13,'m');
|
|
REPAIR NO_WRITE_TO_BINLOG TABLE t1, t2 QUICK EXTENDED USE_FRM;
|
|
FLUSH TABLE t1;
|
|
|
|
let my_datadir = `SELECT @@datadir`;
|
|
|
|
# Now we'll override all table files except for frm.
|
|
# Some engines are more enduring to table files corruption
|
|
# than others, so the result of the following INSERT and REPAIR
|
|
# will be different for different engines
|
|
|
|
--perl
|
|
@files = glob "$ENV{my_datadir}/test/t1.*";
|
|
foreach (@files)
|
|
{
|
|
next if /.frm$/;
|
|
rename($_,"$_.save");
|
|
open(FILE,">$_") || print "Could not open $_\n" && exit;
|
|
print FILE "";
|
|
close(FILE);
|
|
}
|
|
EOF
|
|
|
|
# We don't worry so much about the INSERT or SELECT result,
|
|
# it's REPAIR that we are after.
|
|
# The preceding INSERT, however, helps to trigger
|
|
# a bit more internals
|
|
--let $error_codes = 0,130,ER_FAILED_READ_FROM_PAR_FILE,ER_OPEN_AS_READONLY
|
|
INSERT INTO t1 (a,b) VALUES (14,'n');
|
|
--source check_errors.inc
|
|
CHECK TABLE t1;
|
|
--let $error_codes = 0,130,ER_FAILED_READ_FROM_PAR_FILE,ER_OPEN_AS_READONLY
|
|
SELECT a,b FROM t1;
|
|
--source check_errors.inc
|
|
--enable_warnings
|
|
REPAIR TABLE t1;
|
|
|
|
--perl
|
|
@files = glob "$ENV{my_datadir}/test/t1.*.save";
|
|
foreach (@files)
|
|
{
|
|
$nm = $_;
|
|
$nm =~ s/\.save$//;
|
|
rename($_,$nm);
|
|
}
|
|
EOF
|
|
|
|
DROP TABLE t1, t2;
|
|
|
|
--let $continue = 1
|
|
--source have_default_index.inc
|
|
|
|
if ($have_default_index)
|
|
{
|
|
call mtr.add_suppression("Got an error from thread_id=.*");
|
|
call mtr.add_suppression("MySQL thread id .*, query id .* localhost.*root Checking table");
|
|
call mtr.add_suppression(" '\..test.t1'");
|
|
call mtr.add_suppression("Couldn't repair table: test.t1");
|
|
|
|
# In 10.2 with log_warnings=2 the error message is printed to the error log
|
|
call mtr.add_suppression("Table 't1' is marked as crashed.*");
|
|
|
|
--let $create_definition = a $int_indexed_col, b $char_col, $default_index (a)
|
|
--source create_table.inc
|
|
REPAIR TABLE t1;
|
|
INSERT INTO t1 (a,b) VALUES (7,'g'),(8,'h');
|
|
REPAIR TABLE t1 EXTENDED;
|
|
INSERT INTO t1 (a,b) VALUES (10,'j');
|
|
REPAIR TABLE t1 USE_FRM;
|
|
|
|
# We will take files one by one (except for frm file),
|
|
# save the file, update the table, then restore the file
|
|
# and check the table.
|
|
# Results here can be very different depending on the engine.
|
|
|
|
let $my_errno = 0;
|
|
|
|
--list_files $my_datadir/test
|
|
|
|
while (!$my_errno)
|
|
{
|
|
--error 0,2
|
|
--perl
|
|
use File::Copy;
|
|
@files = glob "$ENV{my_datadir}/test/t1*";
|
|
foreach (@files)
|
|
{
|
|
next if /.(?:frm|save|done)$/;
|
|
next if -e "$_.done";
|
|
copy($_,"$_.save");
|
|
exit 0;
|
|
}
|
|
# No more files
|
|
exit 2;
|
|
EOF
|
|
let $my_errno = $errno;
|
|
if (!$my_errno)
|
|
{
|
|
--let $error_codes = 0,144
|
|
INSERT INTO t1 (a,b) VALUES (14,'n'),(15,'o');
|
|
--source check_errors.inc
|
|
FLUSH TABLE t1;
|
|
--replace_result $my_datadir <DATADIR>
|
|
--perl
|
|
use File::Copy;
|
|
@files = glob "$ENV{my_datadir}/test/t1*.save";
|
|
$nm = $files[0];
|
|
$nm =~ s/\.save$//;
|
|
print "Restoring $nm\n";
|
|
copy($files[0],"$nm.done");
|
|
rename($files[0],$nm);
|
|
EOF
|
|
CHECK TABLE t1;
|
|
--let $error_codes = 0,ER_NOT_KEYFILE,144
|
|
SELECT a,b FROM t1;
|
|
--source check_errors.inc
|
|
}
|
|
}
|
|
DROP TABLE t1;
|
|
}
|
|
|
|
--remove_files_wildcard $my_datadir/test t1*
|
|
|
|
|