# REPAIR USE_FRM is not implemented for partitioned tables. # Test what happens if we exchange a crashed partition with a table SHOW VARIABLES LIKE 'myisam_recover_options'; Variable_name Value myisam_recover_options OFF CREATE TABLE t (a INT, KEY (a)) ENGINE=MyISAM; CREATE TABLE tp (a INT, KEY (a)) ENGINE=MyISAM PARTITION BY RANGE (a) (PARTITION pCrashed VALUES LESS THAN (15), PARTITION pMAX VALUES LESS THAN MAXVALUE); INSERT INTO t VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); INSERT INTO tp VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); FLUSH TABLES; # replacing tp#P#pCrashed.MYI with a corrupt + unclosed one created by doing: # 'create table t1 (a int key(a))' head -c1024 t1.MYI > corrupt_t1.MYI CHECK TABLE tp; Table Op Msg_type Msg_text test.tp check warning 1 client is using or hasn't closed the table properly test.tp check error Size of indexfile is: 1024 Should be: 2048 test.tp check warning Size of datafile is: 77 Should be: 7 test.tp check error Partition pCrashed returned error test.tp check error Corrupt ALTER TABLE tp EXCHANGE PARTITION pCrashed WITH TABLE t; ERROR HY000: Table './test/tp#P#pCrashed' is marked as crashed and should be repaired REPAIR TABLE tp; Table Op Msg_type Msg_text test.tp repair warning Number of rows changed from 1 to 11 test.tp repair status OK CHECK TABLE tp; Table Op Msg_type Msg_text test.tp check status OK ALTER TABLE tp EXCHANGE PARTITION pCrashed WITH TABLE t; CHECK TABLE t; Table Op Msg_type Msg_text test.t check status OK CHECK TABLE tp; Table Op Msg_type Msg_text test.tp check status OK FLUSH TABLES; CHECK TABLE t; Table Op Msg_type Msg_text test.t check warning 1 client is using or hasn't closed the table properly test.t check error Size of indexfile is: 1024 Should be: 2048 test.t check warning Size of datafile is: 77 Should be: 7 test.t check error Corrupt ALTER TABLE tp EXCHANGE PARTITION pCrashed WITH TABLE t; ERROR HY000: Table './test/t' is marked as crashed and should be repaired REPAIR TABLE t; Table Op Msg_type Msg_text test.t repair warning Number of rows changed from 1 to 11 test.t repair status OK CHECK TABLE t; Table Op Msg_type Msg_text test.t check status OK ALTER TABLE tp EXCHANGE PARTITION pCrashed WITH TABLE t; CHECK TABLE tp; Table Op Msg_type Msg_text test.tp check status OK CHECK TABLE t; Table Op Msg_type Msg_text test.t check status OK DROP TABLE t, tp; # test of non partitioned myisam for reference 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 CHECK TABLE t1_will_crash; Table Op Msg_type Msg_text test.t1_will_crash check warning 1 client is using or hasn't closed the table properly test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 test.t1_will_crash check warning Size of datafile is: 77 Should be: 7 test.t1_will_crash check error Corrupt REPAIR TABLE t1_will_crash; Table Op Msg_type Msg_text test.t1_will_crash repair warning Number of rows changed from 1 to 11 test.t1_will_crash repair status OK SELECT * FROM t1_will_crash; a 1 2 3 4 5 6 7 8 9 10 11 DROP TABLE t1_will_crash; # test of check/repair of a damaged partition's MYI-file 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; # test with CHECK/REPAIR TABLE # 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 CHECK TABLE t1_will_crash; Table Op Msg_type Msg_text test.t1_will_crash check warning 1 client is using or hasn't closed the table properly test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 test.t1_will_crash check warning Size of datafile is: 28 Should be: 7 test.t1_will_crash check error Partition p1 returned error test.t1_will_crash check error Corrupt REPAIR TABLE t1_will_crash; Table Op Msg_type Msg_text test.t1_will_crash repair warning Number of rows changed from 1 to 4 test.t1_will_crash repair status OK SELECT * FROM t1_will_crash; a 1 2 3 4 5 6 7 8 9 10 11 FLUSH TABLES; # test with ALTER TABLE ... CHECK/REPAIR PARTITION # replacing t1_will_crash#P#p1.MYI with a corrupt + unclosed one ALTER TABLE t1_will_crash CHECK PARTITION p0, p2; Table Op Msg_type Msg_text test.t1_will_crash check status OK ALTER TABLE t1_will_crash CHECK PARTITION p0, p1; Table Op Msg_type Msg_text test.t1_will_crash check warning 1 client is using or hasn't closed the table properly test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 test.t1_will_crash check warning Size of datafile is: 28 Should be: 7 test.t1_will_crash check error Partition p1 returned error test.t1_will_crash check error Corrupt ALTER TABLE t1_will_crash CHECK PARTITION p1, p2; Table Op Msg_type Msg_text test.t1_will_crash check warning Table is marked as crashed test.t1_will_crash check warning 1 client is using or hasn't closed the table properly test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 test.t1_will_crash check warning Size of datafile is: 28 Should be: 7 test.t1_will_crash check error Partition p1 returned error test.t1_will_crash check error Corrupt ALTER TABLE t1_will_crash REPAIR PARTITION p0, p2; Table Op Msg_type Msg_text test.t1_will_crash repair status OK ALTER TABLE t1_will_crash REPAIR PARTITION p0, p1; Table Op Msg_type Msg_text test.t1_will_crash repair warning Number of rows changed from 1 to 4 test.t1_will_crash repair status OK SELECT * FROM t1_will_crash; a 1 2 3 4 5 6 7 8 9 10 11 DROP TABLE t1_will_crash; # test of check/repair of a damaged subpartition's MYI-file CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM PARTITION BY RANGE (a) SUBPARTITION BY HASH (a) SUBPARTITIONS 2 (PARTITION p0 VALUES LESS THAN (7), PARTITION p1 VALUES LESS THAN MAXVALUE); INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); SELECT * FROM t1_will_crash; a 1 2 3 4 5 6 7 8 9 10 11 FLUSH TABLES; # test with CHECK/REPAIR TABLE # replacing t1_will_crash#P#p1#SP#p1sp0.MYI with a corrupt + unclosed one CHECK TABLE t1_will_crash; Table Op Msg_type Msg_text test.t1_will_crash check warning 1 client is using or hasn't closed the table properly test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 test.t1_will_crash check warning Size of datafile is: 14 Should be: 7 test.t1_will_crash check error Subpartition p1sp0 returned error test.t1_will_crash check error Corrupt REPAIR TABLE t1_will_crash; Table Op Msg_type Msg_text test.t1_will_crash repair warning Number of rows changed from 1 to 2 test.t1_will_crash repair status OK SELECT * FROM t1_will_crash; a 1 2 3 4 5 6 7 8 9 10 11 FLUSH TABLES; # test with ALTER TABLE ... CHECK/REPAIR PARTITION # replacing t1_will_crash#P#p1#SP#p1sp0.MYI with a corrupt + unclosed one ALTER TABLE t1_will_crash CHECK PARTITION p0; Table Op Msg_type Msg_text test.t1_will_crash check status OK ALTER TABLE t1_will_crash CHECK PARTITION all; Table Op Msg_type Msg_text test.t1_will_crash check warning 1 client is using or hasn't closed the table properly test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 test.t1_will_crash check warning Size of datafile is: 14 Should be: 7 test.t1_will_crash check error Subpartition p1sp0 returned error test.t1_will_crash check error Corrupt ALTER TABLE t1_will_crash CHECK PARTITION p1; Table Op Msg_type Msg_text test.t1_will_crash check warning Table is marked as crashed test.t1_will_crash check warning 1 client is using or hasn't closed the table properly test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 test.t1_will_crash check warning Size of datafile is: 14 Should be: 7 test.t1_will_crash check error Subpartition p1sp0 returned error test.t1_will_crash check error Corrupt ALTER TABLE t1_will_crash REPAIR PARTITION p0; Table Op Msg_type Msg_text test.t1_will_crash repair status OK ALTER TABLE t1_will_crash REPAIR PARTITION p0, p1; Table Op Msg_type Msg_text test.t1_will_crash repair warning Number of rows changed from 1 to 2 test.t1_will_crash repair status OK SELECT * FROM t1_will_crash; a 1 2 3 4 5 6 7 8 9 10 11 DROP TABLE t1_will_crash; # test of check/repair of crashed partitions in variuos states CREATE TABLE t1_will_crash ( a VARCHAR(255), b INT, c LONGTEXT, PRIMARY KEY (a, b)) ENGINE=MyISAM PARTITION BY HASH (b) PARTITIONS 7; SELECT COUNT(*) FROM t1_will_crash; COUNT(*) 33 SELECT (b % 7) AS `partition`, COUNT(*) AS rows_cnt FROM t1_will_crash GROUP BY (b % 7); partition rows_cnt 0 2 1 5 2 5 3 5 4 4 5 4 6 8 SELECT (b % 7) AS `partition`, b, a, length(c) FROM t1_will_crash ORDER BY `partition`, b, a; partition b a length(c) 0 0 lost 64 0 7 z lost 64 1 1 abc 64 1 8 tuw 64 1 29 kkkkkkkkKkk 64 1 71 1 broken when head -c1024 on datafile 1024 1 71 eee 64 2 2 def 64 2 9 vxy 64 2 23 lll 64 2 30 2 crashed after _mi_mark_changed 64 2 79 ccc 64 3 3 ghi 64 3 10 aaa 64 3 17 nnn 64 3 24 3 crashed after write_record 64 3 73 ddd 64 4 4 pqr 64 4 11 bbb 64 4 18 4 crashed after flush_cached_blocks 64 4 67 fff 64 5 5 mno 64 5 19 mmm 64 5 40 5 still here since crash in next row in multirow insert? 64 5 89 a 64 6 6 jkl 64 6 13 ooo 64 6 27 6 row 7 (crash before completely written to datafile) 128 6 34 6 row 2 64 6 48 6 row 4 64 6 62 6 row 6 64 6 83 64 6 97 zzzzzZzzzzz 64 FLUSH TABLES; # truncating p0 to simulate an empty datafile (not recovered!) # replacing p1 with only the first 1024 bytes (not recovered!) # replacing p3 with a crashed one at the last row in first insert # (crashed right after *share->write_record()) # replacing p6 with a crashed MYD file (1) (splitted dynamic record) ANALYZE TABLE t1_will_crash; Table Op Msg_type Msg_text test.t1_will_crash analyze Warning Engine-independent statistics are not collected for column 'c' test.t1_will_crash analyze status Operation failed OPTIMIZE TABLE t1_will_crash; Table Op Msg_type Msg_text test.t1_will_crash optimize info Found row block followed by deleted block test.t1_will_crash optimize warning Number of rows changed from 8 to 7 test.t1_will_crash optimize status OK CHECK TABLE t1_will_crash; Table Op Msg_type Msg_text test.t1_will_crash check error Size of datafile is: 0 Should be: 164 test.t1_will_crash check error Partition p0 returned error test.t1_will_crash check error Corrupt REPAIR TABLE t1_will_crash; Table Op Msg_type Msg_text test.t1_will_crash repair warning Number of rows changed from 2 to 0 test.t1_will_crash repair info Found block that points outside data file at 344 test.t1_will_crash repair warning Number of rows changed from 5 to 4 test.t1_will_crash repair warning Number of rows changed from 0 to 5 test.t1_will_crash repair status OK SELECT COUNT(*) FROM t1_will_crash; COUNT(*) 29 SELECT (b % 7) AS `partition`, COUNT(*) AS rows_cnt FROM t1_will_crash GROUP BY (b % 7); partition rows_cnt 1 4 2 5 3 5 4 4 5 4 6 7 SELECT (b % 7) AS `partition`, b, a, length(c) FROM t1_will_crash ORDER BY `partition`, b, a; partition b a length(c) 1 1 abc 64 1 8 tuw 64 1 29 kkkkkkkkKkk 64 1 71 eee 64 2 2 def 64 2 9 vxy 64 2 23 lll 64 2 30 2 crashed after _mi_mark_changed 64 2 79 ccc 64 3 3 ghi 64 3 10 aaa 64 3 17 nnn 64 3 24 3 crashed after write_record 64 3 73 ddd 64 4 4 pqr 64 4 11 bbb 64 4 18 4 crashed after flush_cached_blocks 64 4 67 fff 64 5 5 mno 64 5 19 mmm 64 5 40 5 still here since crash in next row in multirow insert? 64 5 89 a 64 6 6 jkl 64 6 13 ooo 64 6 34 6 row 2 64 6 48 6 row 4 64 6 62 6 row 6 64 6 83 64 6 97 zzzzzZzzzzz 64 FLUSH TABLES; # # replacing p2 with crashed files (after _mi_mark_changed) ALTER TABLE t1_will_crash CHECK PARTITION p2; Table Op Msg_type Msg_text test.t1_will_crash check warning 1 client is using or hasn't closed the table properly test.t1_will_crash check status OK # crash was when index only marked as opened, no real corruption ALTER TABLE t1_will_crash CHECK PARTITION p2; Table Op Msg_type Msg_text test.t1_will_crash check status OK FLUSH TABLES; # # replacing p4 with updated but not closed index file ALTER TABLE t1_will_crash OPTIMIZE PARTITION p4; Table Op Msg_type Msg_text test.t1_will_crash optimize error Found key at page 2048 that points to record outside datafile test.t1_will_crash optimize error Partition p4 returned error test.t1_will_crash optimize status Operation failed ALTER TABLE t1_will_crash CHECK PARTITION p4; Table Op Msg_type Msg_text test.t1_will_crash check warning Table is marked as crashed and last repair failed test.t1_will_crash check warning 1 client is using or hasn't closed the table properly test.t1_will_crash check warning Size of datafile is: 368 Should be: 252 test.t1_will_crash check error Found 4 keys of 3 test.t1_will_crash check error Partition p4 returned error test.t1_will_crash check error Corrupt ALTER TABLE t1_will_crash REPAIR PARTITION p4; Table Op Msg_type Msg_text test.t1_will_crash repair warning Number of rows changed from 3 to 4 test.t1_will_crash repair status OK FLUSH TABLES; # # replacing p6 with a crashed MYD file (2) (splitted dynamic record) ALTER TABLE t1_will_crash CHECK PARTITION p6; Table Op Msg_type Msg_text test.t1_will_crash check warning Size of datafile is: 868 Should be: 604 test.t1_will_crash check error Unexpected byte: 0 at link: 340 test.t1_will_crash check error Partition p6 returned error test.t1_will_crash check error Corrupt ALTER TABLE t1_will_crash REPAIR PARTITION p6; Table Op Msg_type Msg_text test.t1_will_crash repair info Delete link points outside datafile at 340 test.t1_will_crash repair info Delete link points outside datafile at 340 test.t1_will_crash repair status OK SELECT (b % 7) AS `partition`, b, a, length(c) FROM t1_will_crash WHERE (b % 7) = 6 ORDER BY `partition`, b, a; partition b a length(c) 6 6 jkl 64 6 13 ooo 64 6 34 6 row 2 64 6 48 6 row 4 64 6 62 6 row 6 64 6 83 64 6 97 zzzzzZzzzzz 64 FLUSH TABLES; # # replacing p6 with a crashed MYD file (3) (splitted dynamic record) # Different results from the corrupt table, which can lead to dropping # of the not completely written rows when using REBUILD on a corrupt # table, depending if one reads via index or direct on datafile. # Since crash when reuse of deleted row space, CHECK MEDIUM or EXTENDED # is required (MEDIUM is default) to verify correct behavior! SELECT (b % 7) AS `partition`, b, a, length(c) FROM t1_will_crash WHERE (b % 7) = 6 ORDER BY `partition`, b, a; partition b a length(c) 6 6 jkl 64 6 13 ooo 64 6 34 6 row 2 64 6 83 64 6 97 zzzzzZzzzzz 64 SET @save_optimizer_switch= @@optimizer_switch; SET @@optimizer_switch='derived_merge=off'; SELECT (b % 7) AS `partition`, b, a FROM (SELECT b,a FROM t1_will_crash) q WHERE (b % 7) = 6 ORDER BY `partition`, b, a; partition b a 6 6 jkl 6 13 ooo 6 34 6 row 2 6 48 6 row 4 6 62 6 row 6 6 83 6 97 zzzzzZzzzzz SET @@optimizer_switch=@save_optimizer_switch; ALTER TABLE t1_will_crash CHECK PARTITION p6; Table Op Msg_type Msg_text test.t1_will_crash check warning Size of datafile is: 868 Should be: 604 test.t1_will_crash check error Record-count is not ok; is 8 Should be: 7 test.t1_will_crash check warning Found 10 key parts. Should be: 7 test.t1_will_crash check error Partition p6 returned error test.t1_will_crash check error Corrupt ALTER TABLE t1_will_crash REPAIR PARTITION p6; Table Op Msg_type Msg_text test.t1_will_crash repair warning Number of rows changed from 7 to 8 test.t1_will_crash repair status OK SELECT COUNT(*) FROM t1_will_crash; COUNT(*) 29 SELECT (b % 7) AS `partition`, COUNT(*) AS rows_cnt FROM t1_will_crash GROUP BY (b % 7); partition rows_cnt 1 4 2 4 3 5 4 4 5 4 6 8 SELECT (b % 7) AS `partition`, b, a, length(c) FROM t1_will_crash ORDER BY `partition`, b, a; partition b a length(c) 1 1 abc 64 1 8 tuw 64 1 29 kkkkkkkkKkk 64 1 71 eee 64 2 2 def 64 2 9 vxy 64 2 23 lll 64 2 79 ccc 64 3 3 ghi 64 3 10 aaa 64 3 17 nnn 64 3 24 3 crashed after write_record 64 3 73 ddd 64 4 4 pqr 64 4 11 bbb 64 4 18 4 crashed after flush_cached_blocks 64 4 67 fff 64 5 5 mno 64 5 19 mmm 64 5 40 5 still here since crash in next row in multirow insert? 64 5 89 a 64 6 6 jkl 64 6 13 ooo 64 6 27 6 row 7 (crash before completely written to datafile) 128 6 34 6 row 2 64 6 48 6 row 4 64 6 62 6 row 6 64 6 83 64 6 97 zzzzzZzzzzz 64 ALTER TABLE t1_will_crash CHECK PARTITION all EXTENDED; Table Op Msg_type Msg_text test.t1_will_crash check status OK DROP TABLE t1_will_crash;