BUG#46565 - repair of partition fail for archive engine
There was no way to repair corrupt ARCHIVE data file, when unrecoverable data loss is inevitable. With this fix REPAIR ... EXTENDED attempts to restore as much rows as possible, ignoring unrecoverable data. Normal REPAIR is still able to repair meta-data file only.
This commit is contained in:
parent
84917914e0
commit
bb3f75bdbc
@ -12737,3 +12737,22 @@ SELECT * FROM t1;
|
||||
ERROR HY000: Can't find file: 't1' (errno: 2)
|
||||
DROP TABLE t1;
|
||||
ERROR 42S02: Unknown table 't1'
|
||||
#
|
||||
# BUG#46565 - repair of partition fail for archive engine
|
||||
#
|
||||
# Installing corrupted table files for t1.
|
||||
SELECT * FROM t1;
|
||||
ERROR HY000: Table 't1' is marked as crashed and should be repaired
|
||||
REPAIR TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 repair error Corrupt
|
||||
SELECT * FROM t1;
|
||||
ERROR HY000: Table 't1' is marked as crashed and should be repaired
|
||||
REPAIR TABLE t1 EXTENDED;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 repair status OK
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
DROP TABLE t1;
|
||||
|
BIN
mysql-test/std_data/bug46565.ARZ
Normal file
BIN
mysql-test/std_data/bug46565.ARZ
Normal file
Binary file not shown.
BIN
mysql-test/std_data/bug46565.frm
Normal file
BIN
mysql-test/std_data/bug46565.frm
Normal file
Binary file not shown.
@ -1655,3 +1655,26 @@ FLUSH TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # BUG#46565 - repair of partition fail for archive engine
|
||||
--echo #
|
||||
--echo # Installing corrupted table files for t1.
|
||||
# bug46565 was created, filled and damaged as following:
|
||||
# CREATE TABLE bug46565(a INT) ENGINE=archive;
|
||||
# INSERT INTO bug46565 VALUES(1);
|
||||
# FLUSH TABLE bug46565;
|
||||
# INSERT INTO bug46565 VALUES(2),(3);
|
||||
# FLUSH TABLE bug46565;
|
||||
# dd if=bug46565.ARZ of=std_data/bug46565.ARZ bs=1 count=8670
|
||||
copy_file std_data/bug46565.frm $MYSQLD_DATADIR/test/t1.frm;
|
||||
copy_file std_data/bug46565.ARZ $MYSQLD_DATADIR/test/t1.ARZ;
|
||||
--error ER_CRASHED_ON_USAGE
|
||||
SELECT * FROM t1;
|
||||
REPAIR TABLE t1;
|
||||
--error ER_CRASHED_ON_USAGE
|
||||
SELECT * FROM t1;
|
||||
REPAIR TABLE t1 EXTENDED;
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
@ -1269,13 +1269,12 @@ int ha_archive::rnd_pos(uchar * buf, uchar *pos)
|
||||
|
||||
/*
|
||||
This method repairs the meta file. It does this by walking the datafile and
|
||||
rewriting the meta file. Currently it does this by calling optimize with
|
||||
the extended flag.
|
||||
rewriting the meta file. If EXTENDED repair is requested, we attempt to
|
||||
recover as much data as possible.
|
||||
*/
|
||||
int ha_archive::repair(THD* thd, HA_CHECK_OPT* check_opt)
|
||||
{
|
||||
DBUG_ENTER("ha_archive::repair");
|
||||
check_opt->flags= T_EXTEND;
|
||||
int rc= optimize(thd, check_opt);
|
||||
|
||||
if (rc)
|
||||
@ -1369,7 +1368,14 @@ int ha_archive::optimize(THD* thd, HA_CHECK_OPT* check_opt)
|
||||
DBUG_PRINT("ha_archive", ("recovered %llu archive rows",
|
||||
(unsigned long long)share->rows_recorded));
|
||||
|
||||
if (rc && rc != HA_ERR_END_OF_FILE)
|
||||
/*
|
||||
If REPAIR ... EXTENDED is requested, try to recover as much data
|
||||
from data file as possible. In this case if we failed to read a
|
||||
record, we assume EOF. This allows massive data loss, but we can
|
||||
hardly do more with broken zlib stream. And this is the only way
|
||||
to restore at least what is still recoverable.
|
||||
*/
|
||||
if (rc && rc != HA_ERR_END_OF_FILE && !(check_opt->flags & T_EXTEND))
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user