mirror of
https://github.com/MariaDB/server.git
synced 2025-06-09 06:14:44 +02:00

Under unknown circumstances, the SQL layer may wrongly disregard an invocation of thd_mark_transaction_to_rollback() when an InnoDB transaction had been aborted (rolled back) due to one of the following errors: * HA_ERR_LOCK_DEADLOCK * HA_ERR_RECORD_CHANGED (if innodb_snapshot_isolation=ON) * HA_ERR_LOCK_WAIT_TIMEOUT (if innodb_rollback_on_timeout=ON) Such an error used to cause a crash of InnoDB during transaction commit. These changes aim to catch and report the error earlier, so that not only this crash can be avoided but also the original root cause be found and fixed more easily later. The idea of this fix is from Michael 'Monty' Widenius. HA_ERR_ROLLBACK: A new error code that will be translated into ER_ROLLBACK_ONLY, signalling that the current transaction has been aborted and the only allowed action is ROLLBACK. trx_t::state: Add TRX_STATE_ABORTED that is like TRX_STATE_NOT_STARTED, but noting that the transaction had been rolled back and aborted. trx_t::is_started(): Replaces trx_is_started(). ha_innobase: Check the transaction state in various places. Simplify the logic around SAVEPOINT. ha_innobase::is_valid_trx(): Replaces ha_innobase::is_read_only(). The InnoDB logic around transaction savepoints, commit, and rollback was unnecessarily complex and might have contributed to this inconsistency. So, we are simplifying that logic as well. trx_savept_t: Replace with const undo_no_t*. When we rollback to a savepoint, all we need to know is the number of undo log records that must survive. trx_named_savept_t, DB_NO_SAVEPOINT: Remove. We can store undo_no_t directly in the space allocated at innobase_hton->savepoint_offset. fts_trx_create(): Do not copy previous savepoints. fts_savepoint_rollback(): If a savepoint was not found, roll back everything after the default savepoint of fts_trx_create(). The test innodb_fts.savepoint is extended to cover this code. Reviewed by: Vladislav Lesin Tested by: Matthias Leich
412 lines
12 KiB
Text
412 lines
12 KiB
Text
call mtr.add_suppression("InnoDB: Tablespace for table .* is set as discarded\\.");
|
|
call mtr.add_suppression("InnoDB: Cannot calculate statistics for table .* because the .ibd file is missing. Please refer to .* for how to resolve the issue\\.");
|
|
call mtr.add_suppression("InnoDB: Page 0 at offset 0 looks corrupted in file");
|
|
call mtr.add_suppression("InnoDB: Page for tablespace ");
|
|
call mtr.add_suppression("InnoDB: Invalid FSP_SPACE_FLAGS=0x");
|
|
call mtr.add_suppression("InnoDB: Unknown index id .* on page");
|
|
call mtr.add_suppression("InnoDB: Operating system error number");
|
|
call mtr.add_suppression("InnoDB: The error means");
|
|
call mtr.add_suppression("InnoDB: Cannot open datafile .*t1\\.ibd");
|
|
call mtr.add_suppression("InnoDB: Ignoring tablespace for test/t1 ");
|
|
call mtr.add_suppression("InnoDB: Cannot save statistics for table `test`\\.`t1` because the \\.ibd file is missing");
|
|
call mtr.add_suppression("InnoDB: Failed to read page \\d+ from file '.*test/t1\\.ibd'");
|
|
call mtr.add_suppression("InnoDB: File '.*(ibdata1|t1\\.ibd)' is corrupted");
|
|
FLUSH TABLES;
|
|
SET SESSION innodb_strict_mode=1;
|
|
CREATE TABLE t1 (c1 INT) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED;
|
|
INSERT INTO t1 VALUES (1), (2), (3), (4);
|
|
FLUSH TABLES t1 FOR EXPORT;
|
|
backup: t1
|
|
UNLOCK TABLES;
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1 (c1 INT) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED;
|
|
INSERT INTO t1 VALUES (1);
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug="+d,ib_import_before_commit_crash";
|
|
SELECT * FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Lost connection to server during query
|
|
SET SESSION debug_dbug="+d,ib_import_before_checkpoint_crash";
|
|
SELECT COUNT(*) FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Lost connection to server during query
|
|
unlink: t1.ibd
|
|
unlink: t1.cfg
|
|
# Restart and reconnect to the server
|
|
DROP TABLE t1;
|
|
SET SESSION innodb_strict_mode=1;
|
|
CREATE TABLE t1 (c1 INT) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
restore: t1 .ibd and .cfg files
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
CHECK TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
4
|
|
INSERT INTO t1 VALUES(400), (500), (600);
|
|
SELECT * FROM t1;
|
|
c1
|
|
1
|
|
2
|
|
3
|
|
4
|
|
400
|
|
500
|
|
600
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1 (c1 INT) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
restore: t1 .ibd and .cfg files
|
|
SET @saved_debug_dbug = @@SESSION.debug_dbug;
|
|
SET SESSION debug_dbug="+d,ib_import_internal_error";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Internal error: While updating the <space, root page number> of index GEN_CLUST_INDEX - Generic error
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
restore: t1 .ibd and .cfg files
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1 (c1 INT) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug="+d,ib_import_reset_space_and_lsn_failure";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Internal error: Error importing tablespace for table `test`.`t1` : Too many concurrent transactions
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
SET SESSION debug_dbug="+d,ib_import_open_tablespace_failure";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Got error 41 'Tablespace not found' from ./test/t1.ibd
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug="+d,ib_import_check_bitmap_failure";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Index for table 't1' is corrupt; try to repair it
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug="+d,ib_import_cluster_root_adjust_failure";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Index for table 't1' is corrupt; try to repair it
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug="+d,ib_import_cluster_failure";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Index for table 't1' is corrupt; try to repair it
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug="+d,ib_import_sec_root_adjust_failure";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Index for table 't1' is corrupt; try to repair it
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
restore: t1 .ibd and .cfg files
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1 (
|
|
c1 BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
c2 BIGINT,
|
|
c3 VARCHAR(2048),
|
|
c4 VARCHAR(2048),
|
|
INDEX idx1(c2),
|
|
INDEX idx2(c3(512)),
|
|
INDEX idx3(c4(512))) Engine=InnoDB
|
|
ROW_FORMAT=COMPRESSED;
|
|
connect purge_control,localhost,root;
|
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
|
connection default;
|
|
INSERT INTO t1
|
|
SELECT 1 + seq, 1 + (seq MOD 4),
|
|
REPEAT(SUBSTR('abcd', 1 + (seq MOD 4), 1), 2048),
|
|
REPEAT(SUBSTR('abcd', 1 + (seq MOD 4), 1), 2048)
|
|
FROM seq_0_to_127;
|
|
DELETE FROM t1 WHERE c2 = 1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c2 = c2 + c1;
|
|
UPDATE t1 SET c3 = REPEAT("c2", 1024);
|
|
UPDATE t1 SET c4 = REPEAT("c4", 1024);
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`c1` bigint(20) NOT NULL AUTO_INCREMENT,
|
|
`c2` bigint(20) DEFAULT NULL,
|
|
`c3` varchar(2048) DEFAULT NULL,
|
|
`c4` varchar(2048) DEFAULT NULL,
|
|
PRIMARY KEY (`c1`),
|
|
KEY `idx1` (`c2`),
|
|
KEY `idx2` (`c3`(512)),
|
|
KEY `idx3` (`c4`(512))
|
|
) ENGINE=InnoDB AUTO_INCREMENT=129 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPRESSED
|
|
FLUSH TABLES t1 FOR EXPORT;
|
|
backup: t1
|
|
UNLOCK TABLES;
|
|
connection purge_control;
|
|
COMMIT;
|
|
disconnect purge_control;
|
|
connection default;
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1 (
|
|
c1 BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
c2 BIGINT,
|
|
c3 VARCHAR(2048),
|
|
c4 VARCHAR(2048),
|
|
INDEX idx1(c2),
|
|
INDEX idx2(c3(512)),
|
|
INDEX idx3(c4(512))) Engine=InnoDB
|
|
ROW_FORMAT=COMPRESSED;
|
|
SELECT c1, c2 FROM t1;
|
|
c1 c2
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
restore: t1 .ibd and .cfg files
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
CHECK TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
SELECT c1,c2 FROM t1;
|
|
c1 c2
|
|
2 32
|
|
3 48
|
|
4 64
|
|
6 92
|
|
7 108
|
|
8 124
|
|
10 152
|
|
11 168
|
|
12 184
|
|
14 212
|
|
15 228
|
|
16 244
|
|
18 272
|
|
19 288
|
|
20 304
|
|
22 332
|
|
23 348
|
|
24 364
|
|
26 392
|
|
27 408
|
|
28 424
|
|
30 452
|
|
31 468
|
|
32 484
|
|
34 512
|
|
35 528
|
|
36 544
|
|
38 572
|
|
39 588
|
|
40 604
|
|
42 632
|
|
43 648
|
|
44 664
|
|
46 692
|
|
47 708
|
|
48 724
|
|
50 752
|
|
51 768
|
|
52 784
|
|
54 812
|
|
55 828
|
|
56 844
|
|
58 872
|
|
59 888
|
|
60 904
|
|
62 932
|
|
63 948
|
|
64 964
|
|
66 992
|
|
67 1008
|
|
68 1024
|
|
70 1052
|
|
71 1068
|
|
72 1084
|
|
74 1112
|
|
75 1128
|
|
76 1144
|
|
78 1172
|
|
79 1188
|
|
80 1204
|
|
82 1232
|
|
83 1248
|
|
84 1264
|
|
86 1292
|
|
87 1308
|
|
88 1324
|
|
90 1352
|
|
91 1368
|
|
92 1384
|
|
94 1412
|
|
95 1428
|
|
96 1444
|
|
98 1472
|
|
99 1488
|
|
100 1504
|
|
102 1532
|
|
103 1548
|
|
104 1564
|
|
106 1592
|
|
107 1608
|
|
108 1624
|
|
110 1652
|
|
111 1668
|
|
112 1684
|
|
114 1712
|
|
115 1728
|
|
116 1744
|
|
118 1772
|
|
119 1788
|
|
120 1804
|
|
122 1832
|
|
123 1848
|
|
124 1864
|
|
126 1892
|
|
127 1908
|
|
128 1924
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`c1` bigint(20) NOT NULL AUTO_INCREMENT,
|
|
`c2` bigint(20) DEFAULT NULL,
|
|
`c3` varchar(2048) DEFAULT NULL,
|
|
`c4` varchar(2048) DEFAULT NULL,
|
|
PRIMARY KEY (`c1`),
|
|
KEY `idx1` (`c2`),
|
|
KEY `idx2` (`c3`(512)),
|
|
KEY `idx3` (`c4`(512))
|
|
) ENGINE=InnoDB AUTO_INCREMENT=129 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPRESSED
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1 (c1 INT, c2 VARCHAR(1024), c3 BLOB) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
|
|
INSERT INTO t1
|
|
SELECT 100, REPEAT('Karanbir', 128), REPEAT('Ajeeth', 1200)
|
|
FROM seq_1_to_256;
|
|
FLUSH TABLES t1 FOR EXPORT;
|
|
backup: t1
|
|
UNLOCK TABLES;
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1 (c1 INT, c2 VARCHAR(1024), c3 BLOB) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug="+d,ib_import_trigger_corruption_1";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Internal error: Error importing tablespace for table `test`.`t1` : Data structure corruption
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
DROP TABLE t1;
|
|
unlink: t1.ibd
|
|
unlink: t1.cfg
|
|
CREATE TABLE t1 (c1 INT, c2 VARCHAR(1024), c3 BLOB) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
restore: t1 .ibd and .cfg files
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
Got one of the listed errors
|
|
DROP TABLE t1;
|
|
unlink: t1.ibd
|
|
unlink: t1.cfg
|
|
CREATE TABLE t1 (c1 INT, c2 VARCHAR(1024), c3 BLOB) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug="+d,ib_import_trigger_corruption_2";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Index corrupt: Externally stored column(5) has a reference length of 19 in the cluster index GEN_CLUST_INDEX
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
DROP TABLE t1;
|
|
unlink: t1.ibd
|
|
unlink: t1.cfg
|
|
CREATE TABLE t1 (c1 INT, c2 VARCHAR(1024), c3 BLOB) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug="+d,ib_import_trigger_corruption_3";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Index for table 't1' is corrupt; try to repair it
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
DROP TABLE t1;
|
|
unlink: t1.ibd
|
|
unlink: t1.cfg
|
|
CREATE TABLE t1 (c1 INT, c2 VARCHAR(1024), c3 BLOB) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
SET SESSION debug_dbug="+d,ib_import_create_index_failure_1";
|
|
ALTER TABLE t1 ADD INDEX idx(c1);
|
|
Warnings:
|
|
Warning 1814 Tablespace has been discarded for table `t1`
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
DROP TABLE t1;
|
|
unlink: t1.ibd
|
|
unlink: t1.cfg
|
|
CREATE TABLE t1 (c1 INT, c2 VARCHAR(1024), c3 BLOB) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug="+d,fil_space_create_failure";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Got error 11 'Generic error' from ./test/t1.ibd
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
DROP TABLE t1;
|
|
unlink: t1.ibd
|
|
unlink: t1.cfg
|
|
CREATE TABLE t1 (c1 INT, c2 VARCHAR(1024), c3 BLOB) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug="+d,dict_tf_to_fsp_flags_failure";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Got error 37 'Data structure corruption' from ./test/t1.ibd
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
DROP TABLE t1;
|
|
unlink: t1.ibd
|
|
unlink: t1.cfg
|
|
CREATE TABLE t1 (c1 INT, c2 VARCHAR(1024), c3 BLOB) ENGINE = Innodb
|
|
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
SELECT COUNT(*) FROM t1;
|
|
ERROR HY000: Tablespace has been discarded for table `t1`
|
|
restore: t1 .ibd and .cfg files
|
|
SET SESSION debug_dbug="+d,fsp_flags_is_valid_failure";
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Index for table 't1' is corrupt; try to repair it
|
|
SET SESSION debug_dbug=@saved_debug_dbug;
|
|
DROP TABLE t1;
|
|
unlink: t1.ibd
|
|
unlink: t1.cfg
|