Bug#35161: --myisam-recover does not work for partitioned MyISAM tables
Problem was that auto_repair, is_crashed and check_and_repair was not implemented in ha_partition. Solution, implemented them as loop over all partitions for is_crashed and check_and_repair, and using the first partition for auto_repair. (Recommit after fixing review comments) mysql-test/lib/mtr_report.pl: Bug#35161: --myisam-recover does not work for partitioned MyISAM tables Added filter for crashed tables, when testing auto repair mysql-test/std_data/corrupt_t1#P#p1.MYI: Bug#35161: --myisam-recover does not work for partitioned MyISAM tables Corrupt MYI file for testing auto repair mysql-test/std_data/corrupt_t1.MYI: Bug#35161: --myisam-recover does not work for partitioned MyISAM tables Corrupt MYI file for testing auto repair mysql-test/suite/parts/r/partition_repair_myisam.result: Bug#35161: --myisam-recover does not work for partitioned MyISAM tables Result file for testing auto repair of crashed myisam partitions mysql-test/suite/parts/t/partition_repair_myisam-master.opt: Bug#35161: --myisam-recover does not work for partitioned MyISAM tables opt file for testing auto repair of crashed myisam partitions mysql-test/suite/parts/t/partition_repair_myisam.test: Bug#35161: --myisam-recover does not work for partitioned MyISAM tables Test file for testing auto repair of crashed myisam partitions sql/ha_partition.cc: Bug#35161: --myisam-recover does not work for partitioned MyISAM tables Added auto_repair as returning the first partitions auto_repair Added is_crashed and check_and_repair as loop over all partitions sql/ha_partition.h: Bug#35161: --myisam-recover does not work for partitioned MyISAM tables Activating check_and_repair, auto_repair and is_crashed
This commit is contained in:
parent
41c80004ff
commit
ce30b928b7
@ -402,7 +402,10 @@ sub mtr_report_stats ($) {
|
|||||||
)) or
|
)) or
|
||||||
|
|
||||||
# Test case for Bug#31590 produces the following error:
|
# Test case for Bug#31590 produces the following error:
|
||||||
/Out of sort memory; increase server sort buffer size/
|
/Out of sort memory; increase server sort buffer size/ or
|
||||||
|
|
||||||
|
# Bug#35161, test of auto repair --myisam-recover
|
||||||
|
/able.*_will_crash/
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
next; # Skip these lines
|
next; # Skip these lines
|
||||||
|
BIN
mysql-test/std_data/corrupt_t1#P#p1.MYI
Normal file
BIN
mysql-test/std_data/corrupt_t1#P#p1.MYI
Normal file
Binary file not shown.
BIN
mysql-test/std_data/corrupt_t1.MYI
Normal file
BIN
mysql-test/std_data/corrupt_t1.MYI
Normal file
Binary file not shown.
56
mysql-test/suite/parts/r/partition_repair_myisam.result
Normal file
56
mysql-test/suite/parts/r/partition_repair_myisam.result
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11);
|
||||||
|
FLUSH TABLES;
|
||||||
|
# replacing t1.MYI with a corrupt + unclosed one created by doing:
|
||||||
|
# 'create table t1 (a int key(a))' head -c1024 t1.MYI > corrupt_t1.MYI
|
||||||
|
SELECT * FROM t1_will_crash;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
10
|
||||||
|
11
|
||||||
|
Warnings:
|
||||||
|
Error 145 Table './test/t1_will_crash' is marked as crashed and should be repaired
|
||||||
|
Error 1194 Table 't1_will_crash' is marked as crashed and should be repaired
|
||||||
|
Error 1034 1 client is using or hasn't closed the table properly
|
||||||
|
Error 1034 Size of indexfile is: 1024 Should be: 2048
|
||||||
|
Error 1034 Size of datafile is: 77 Should be: 7
|
||||||
|
Error 1034 Number of rows changed from 1 to 11
|
||||||
|
DROP TABLE t1_will_crash;
|
||||||
|
CREATE TABLE t1_will_crash (a INT, KEY (a))
|
||||||
|
ENGINE=MyISAM
|
||||||
|
PARTITION BY HASH(a)
|
||||||
|
PARTITIONS 3;
|
||||||
|
INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11);
|
||||||
|
FLUSH TABLES;
|
||||||
|
# replacing t1#P#p1.MYI with a corrupt + unclosed one created by doing:
|
||||||
|
# 'create table t1 (a int key(a)) partition by hash (a) partitions 3'
|
||||||
|
# head -c1024 t1#P#p1.MYI > corrupt_t1#P#p1.MYI
|
||||||
|
SELECT * FROM t1_will_crash;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
10
|
||||||
|
11
|
||||||
|
Warnings:
|
||||||
|
Error 145 Table './test/t1_will_crash#P#p1' is marked as crashed and should be repaired
|
||||||
|
Error 1194 Table 't1_will_crash' is marked as crashed and should be repaired
|
||||||
|
Error 1034 1 client is using or hasn't closed the table properly
|
||||||
|
Error 1034 Size of indexfile is: 1024 Should be: 2048
|
||||||
|
Error 1034 Size of datafile is: 28 Should be: 7
|
||||||
|
Error 1034 Number of rows changed from 1 to 4
|
||||||
|
DROP TABLE t1_will_crash;
|
@ -0,0 +1 @@
|
|||||||
|
--myisam-recover
|
30
mysql-test/suite/parts/t/partition_repair_myisam.test
Normal file
30
mysql-test/suite/parts/t/partition_repair_myisam.test
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
--source include/have_partition.inc
|
||||||
|
--disable_warnings
|
||||||
|
--disable_query_log
|
||||||
|
drop table if exists t1_will_crash;
|
||||||
|
--enable_query_log
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11);
|
||||||
|
FLUSH TABLES;
|
||||||
|
--echo # replacing t1.MYI with a corrupt + unclosed one created by doing:
|
||||||
|
--echo # 'create table t1 (a int key(a))' head -c1024 t1.MYI > corrupt_t1.MYI
|
||||||
|
--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash.MYI
|
||||||
|
--copy_file std_data/corrupt_t1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash.MYI
|
||||||
|
SELECT * FROM t1_will_crash;
|
||||||
|
DROP TABLE t1_will_crash;
|
||||||
|
CREATE TABLE t1_will_crash (a INT, KEY (a))
|
||||||
|
ENGINE=MyISAM
|
||||||
|
PARTITION BY HASH(a)
|
||||||
|
PARTITIONS 3;
|
||||||
|
INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11);
|
||||||
|
FLUSH TABLES;
|
||||||
|
--echo # replacing t1#P#p1.MYI with a corrupt + unclosed one created by doing:
|
||||||
|
--echo # 'create table t1 (a int key(a)) partition by hash (a) partitions 3'
|
||||||
|
--echo # head -c1024 t1#P#p1.MYI > corrupt_t1#P#p1.MYI
|
||||||
|
--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYI
|
||||||
|
--copy_file std_data/corrupt_t1#P#p1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYI
|
||||||
|
SELECT * FROM t1_will_crash;
|
||||||
|
DROP TABLE t1_will_crash;
|
@ -1129,6 +1129,70 @@ int ha_partition::handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Check and repair the table if neccesary
|
||||||
|
|
||||||
|
@param thd Thread object
|
||||||
|
|
||||||
|
@retval TRUE Error/Not supported
|
||||||
|
@retval FALSE Success
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool ha_partition::check_and_repair(THD *thd)
|
||||||
|
{
|
||||||
|
handler **file= m_file;
|
||||||
|
DBUG_ENTER("ha_partition::check_and_repair");
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ((*file)->ha_check_and_repair(thd))
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
} while (*(++file));
|
||||||
|
DBUG_RETURN(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@breif Check if the table can be automatically repaired
|
||||||
|
|
||||||
|
@retval TRUE Can be auto repaired
|
||||||
|
@retval FALSE Cannot be auto repaired
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool ha_partition::auto_repair() const
|
||||||
|
{
|
||||||
|
DBUG_ENTER("ha_partition::auto_repair");
|
||||||
|
|
||||||
|
/*
|
||||||
|
As long as we only support one storage engine per table,
|
||||||
|
we can use the first partition for this function.
|
||||||
|
*/
|
||||||
|
DBUG_RETURN(m_file[0]->auto_repair());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@breif Check if the table is crashed
|
||||||
|
|
||||||
|
@retval TRUE Crashed
|
||||||
|
@retval FALSE Not crashed
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool ha_partition::is_crashed() const
|
||||||
|
{
|
||||||
|
handler **file= m_file;
|
||||||
|
DBUG_ENTER("ha_partition::is_crashed");
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if ((*file)->is_crashed())
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
} while (*(++file));
|
||||||
|
DBUG_RETURN(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Prepare by creating a new partition
|
Prepare by creating a new partition
|
||||||
|
|
||||||
|
@ -935,6 +935,9 @@ public:
|
|||||||
virtual int analyze_partitions(THD *thd);
|
virtual int analyze_partitions(THD *thd);
|
||||||
virtual int check_partitions(THD *thd);
|
virtual int check_partitions(THD *thd);
|
||||||
virtual int repair_partitions(THD *thd);
|
virtual int repair_partitions(THD *thd);
|
||||||
|
virtual bool check_and_repair(THD *thd);
|
||||||
|
virtual bool auto_repair() const;
|
||||||
|
virtual bool is_crashed() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt,
|
int handle_opt_partitions(THD *thd, HA_CHECK_OPT *check_opt,
|
||||||
@ -950,12 +953,9 @@ public:
|
|||||||
virtual int restore(THD* thd, HA_CHECK_OPT *check_opt);
|
virtual int restore(THD* thd, HA_CHECK_OPT *check_opt);
|
||||||
virtual int assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt);
|
virtual int assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt);
|
||||||
virtual int preload_keys(THD *thd, HA_CHECK_OPT *check_opt);
|
virtual int preload_keys(THD *thd, HA_CHECK_OPT *check_opt);
|
||||||
virtual bool check_and_repair(THD *thd);
|
|
||||||
virtual int dump(THD* thd, int fd = -1);
|
virtual int dump(THD* thd, int fd = -1);
|
||||||
virtual int net_read_dump(NET* net);
|
virtual int net_read_dump(NET* net);
|
||||||
virtual uint checksum() const;
|
virtual uint checksum() const;
|
||||||
virtual bool is_crashed() const;
|
|
||||||
virtual bool auto_repair() const;
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user