2008-08-19 11:44:22 +02:00
|
|
|
# REPAIR USE_FRM is not implemented for partitioned tables.
|
|
|
|
# test of non partitioned myisam for reference
|
2008-07-07 17:54:42 +02:00
|
|
|
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
|
2008-08-19 11:44:22 +02:00
|
|
|
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
|
2008-07-07 17:54:42 +02:00
|
|
|
SELECT * FROM t1_will_crash;
|
|
|
|
a
|
|
|
|
1
|
|
|
|
2
|
|
|
|
3
|
|
|
|
4
|
|
|
|
5
|
|
|
|
6
|
|
|
|
7
|
|
|
|
8
|
|
|
|
9
|
|
|
|
10
|
|
|
|
11
|
|
|
|
DROP TABLE t1_will_crash;
|
2008-08-19 11:44:22 +02:00
|
|
|
# test of check/repair of a damaged partition's MYI-file
|
2008-07-07 17:54:42 +02:00
|
|
|
CREATE TABLE t1_will_crash (a INT, KEY (a))
|
|
|
|
ENGINE=MyISAM
|
2008-08-19 11:44:22 +02:00
|
|
|
PARTITION BY HASH (a)
|
2008-07-07 17:54:42 +02:00
|
|
|
PARTITIONS 3;
|
|
|
|
INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11);
|
|
|
|
FLUSH TABLES;
|
2008-08-19 11:44:22 +02:00
|
|
|
# test with CHECK/REPAIR TABLE
|
2008-07-07 17:54:42 +02:00
|
|
|
# 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
|
2008-08-19 11:44:22 +02:00
|
|
|
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
|
2008-07-07 17:54:42 +02:00
|
|
|
SELECT * FROM t1_will_crash;
|
|
|
|
a
|
|
|
|
1
|
|
|
|
2
|
|
|
|
3
|
|
|
|
4
|
|
|
|
5
|
|
|
|
6
|
|
|
|
7
|
|
|
|
8
|
|
|
|
9
|
|
|
|
10
|
|
|
|
11
|
2008-08-19 11:44:22 +02:00
|
|
|
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 FROM t1_will_crash GROUP BY (b % 7);
|
|
|
|
partition rows
|
|
|
|
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 status OK
|
|
|
|
OPTIMIZE TABLE t1_will_crash;
|
|
|
|
Table Op Msg_type Msg_text
|
|
|
|
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 FROM t1_will_crash GROUP BY (b % 7);
|
|
|
|
partition rows
|
|
|
|
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
|
|
|
|
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
|
Fix for: LP #634955: Assert in _ma_update_at_original_place()
Added locking of lock mutex when updating status in external_unlock() for Aria and MyISAM tables.
Fixed that 'source' command doesn't cause mysql command line tool to exit on error.
DEBUG_EXECUTE() and DEBUG_EVALUATE_IF() should not execute things based on wildcards. (Allows one to run --debug with mysql-test-run scripts that uses @debug)
Fixed several core dump, deadlock and crashed table bugs in handling of LOCK TABLE with MERGE tables:
- Added priority of locks to avoid crashes with MERGE tables.
- Added thr_lock_merge() to allow one to merge two results of thr_lock().
Fixed 'not found row' bug in REPLACE with Aria tables.
Mark MyISAM tables that are part of MERGE with HA_OPEN_MERGE_TABLE and set the locks to have priority THR_LOCK_MERGE_PRIV.
- By sorting MERGE tables last in thr_multi_unlock() it's safer to release and relock them many times (can happen when TRIGGERS are created)
Avoid printing (null) in debug file (to easier find out wrong NULL pointer usage with %s).
client/mysql.cc:
Fixed that 'source' command doesn't cause mysql command line tool to exit on error.
client/mysqltest.cc:
Don't send NULL to fn_format(). (Can cause crash on Solaris when using --debug)
dbug/dbug.c:
DEBUG_EXECUTE() and DEBUG_EVALUATE_IF() should not execute things based on wildcards.
include/my_base.h:
Added flag to signal if one opens a MERGE table.
Added extra() command to signal that one is not part of a MERGE table anymore.
include/thr_lock.h:
Added priority for locks (needed to fix bug in thr_lock when using MERGE tables)
Added option to thr_unlock() if get_status() should be called.
Added prototype for thr_merge_locks().
mysql-test/mysql-test-run.pl:
Ignore crashed table warnings for tables named 'crashed'.
mysql-test/r/merge.result:
Renamed triggers to make debugging easier.
Added some CHECK TABLES to catch errors earlier.
Additional tests.
mysql-test/r/merge_debug.result:
Test of error handling when reopening MERGE tables.
mysql-test/r/udf_query_cache.result:
Added missing flush status
mysql-test/suite/parts/r/partition_repair_myisam.result:
Update results
mysql-test/t/merge.test:
Renamed triggers to make debugging easier.
Added some CHECK TABLES to catch errors earlier.
Additional tests.
mysql-test/t/merge_debug.test:
Test of error handling when reopening MERGE tables.
mysql-test/t/udf_query_cache.test:
Added missing flush status
mysys/my_getopt.c:
Removed not used variable
mysys/my_symlink2.c:
Changed (null) to (NULL) to make it easier to find NULL arguments to DBUG_PRINT() functions.
(On linux, NULL to sprintf is printed 'null')
mysys/thr_lock.c:
Added priority of locks to avoid crashes with MERGE tables.
Added thr_lock_merge() to allow one to merge two results of thr_lock().
- This is needed for MyISAM as all locked table must share the same status. If not, you will not see newly inserted rows in other instances of the table.
If calling thr_unlock() with THR_UNLOCK_UPDATE_STATUS, call update_status() and restore_status() for the locks. This is needed in some rare cases where we call thr_unlock() followed by thr_lock() without calling external_unlock/external_lock in between.
Simplify loop in thr_multi_lock().
Added 'start_trans', which is called at end of thr_multi_lock() when all locks are taken.
- This was needed by Aria to ensure that transaction is started when we got all locks, not at get_status(). Without this, some rows could not be visible when we lock two tables at the same time, causing REPLACE using two tables to fail unexpectedly.
sql/handler.cc:
Add an assert() in handler::print_error() for "impossible errors" (like table is crashed) when --debug-assert-if-crashed-table is used.
sql/lock.cc:
Simplify mysql_lock_tables() code if get_lock_data() returns 0 locks.
Added new parameter to thr_multi_unlock()
In mysql_unlock_read_tables(), call first externa_unlock(), then thr_multi_unlock(); This is same order as we do in mysql_unlock_tables().
Don't abort locks in mysql_lock_abort() for merged tables when a MERGE table is deleted; Would cause a spin lock.
Added call to thr_merge_locks() in mysql_lock_merge() to ensure consistency in thr_locks().
- New locks of same type and table is stored after the old lock to ensure that we get the status from the original lock.
sql/mysql_priv.h:
Added debug_assert_if_crashed_table
sql/mysqld.cc:
Added --debug-assert-if-crashed-table
sql/parse_file.cc:
Don't print '(null)' in DBUG_PRINT of no dir given
sql/set_var.cc:
Increase default size of buffer for @debug variable.
sql/sql_base.cc:
In case of error from reopen_table() in reopen_tables(), call unlock_open_table() and restart loop.
- This fixed bug when we twice deleted same table from open_cache.
Don't take name lock for already name locked table in open_unireg_entry().
- Fixed bug when doing repair in reopen_table().
- In detach_merge_children(), always detach if 'clear_refs' is given. We can't trust parent->children_attached as this function can be called twice, first time with clear_refs set to 0.
sql/sql_class.cc:
Changed printing of (null) to "" in set_thd_proc_info()
sql/sql_parse.cc:
Added DBUG
sql/sql_trigger.cc:
Don't call unlink_open_table() if reopen_table() fails as the table may already be freed.
storage/maria/ma_bitmap.c:
Fixed DBUG_ASSERT() in allocate_tail()
storage/maria/ma_blockrec.c:
Fixed wrong calculation of row length for very small rows in undo_row_update().
- Fixes ASSERT() when doing undo.
storage/maria/ma_blockrec.h:
Added _ma_block_start_trans() and _ma_block_start_trans_no_versioning()
storage/maria/ma_locking.c:
Call _ma_update_status_with_lock() when releasing write locks.
- Fixes potential problem with updating status without the proper lock.
storage/maria/ma_open.c:
Changed to use start_trans() instead of get_status() to ensure that we see all rows in all locked tables when we got the locks.
- Fixed 'not found row' bug in REPLACE with Aria tables.
storage/maria/ma_state.c:
Added _ma_update_status_with_lock() and _ma_block_start_trans().
This is to ensure that we see all rows in all locked tables when we got the locks.
storage/maria/ma_state.h:
Added _ma_update_status_with_lock()
storage/maria/ma_write.c:
More DBUG_PRINT
storage/myisam/mi_check.c:
Fixed error message
storage/myisam/mi_extra.c:
Added HA_EXTRA_DETACH_CHILD:
- Detach MyISAM table to not be part of MERGE table (remove flag & lock priority).
storage/myisam/mi_locking.c:
Call mi_update_status_with_lock() when releasing write locks.
- Fixes potential problem with updating status without the proper lock.
Change to use new HA_OPEN_MERGE_TABLE flag to test if MERGE table.
Added mi_fix_status(), called by thr_merge().
storage/myisam/mi_open.c:
Added marker if part of MERGE table.
Call mi_fix_status() in thr_lock() for transactional tables.
storage/myisam/myisamdef.h:
Change my_once_flag to uint, as it stored different values than just 0/1
Added 'open_flag' to store state given to mi_open()
storage/myisammrg/ha_myisammrg.cc:
Add THR_LOCK_MERGE_PRIV to THR_LOCK_DATA to get MERGE locks sorted after other types of locks.
storage/myisammrg/myrg_locking.c:
Remove windows specific code.
storage/myisammrg/myrg_open.c:
Use HA_OPEN_MERGE_TABLE to mi_open().
Set HA_OPEN_MERGE_TABLE for linked MyISAM tables.
storage/xtradb/buf/buf0buf.c:
Fixed compiler warning
storage/xtradb/buf/buf0lru.c:
Initialize variable that could be used not initialized.
2010-11-02 17:22:57 +02:00
|
|
|
test.t1_will_crash check warning Found 10 parts. Should be: 7
|
2008-08-19 11:44:22 +02:00
|
|
|
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 FROM t1_will_crash GROUP BY (b % 7);
|
|
|
|
partition rows
|
|
|
|
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
|
2008-07-07 17:54:42 +02:00
|
|
|
DROP TABLE t1_will_crash;
|