mirror of
https://github.com/MariaDB/server.git
synced 2025-07-21 21:22:27 +03:00
The test is shutting down InnoDB, corrupting a file, and finally restarting InnoDB. Before the shutdown, the test created the table and inserted some records. Before MDEV-12288, there would be no access to the table after server restart, but after MDEV-12288 purge would reset the transaction identifier after the INSERT, and this would sometimes happen after the restart. To make the test deterministic, wait for purge to complete before the shutdown.
81 lines
2.5 KiB
Plaintext
81 lines
2.5 KiB
Plaintext
#
|
|
# Bug#16720368 INNODB CRASHES ON BROKEN #SQL*.IBD FILE AT STARTUP
|
|
#
|
|
SET GLOBAL innodb_file_per_table=1;
|
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
|
|
CREATE TABLE bug16720368_1 (a INT PRIMARY KEY) ENGINE=InnoDB;
|
|
connect con1,localhost,root;
|
|
CREATE TABLE bug16720368 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB;
|
|
INSERT INTO bug16720368 (a) VALUES (1),(2),(3),(4),(5),(6),(7),(8);
|
|
InnoDB 0 transactions not purged
|
|
connection default;
|
|
# Cleanly shutdown mysqld
|
|
disconnect con1;
|
|
# Corrupt FIL_PAGE_OFFSET in bug16720368.ibd,
|
|
# and update the checksum to the "don't care" value.
|
|
# Restart mysqld
|
|
# This will succeed after a clean shutdown, due to
|
|
# fil_open_single_table_tablespace(check_space_id=FALSE).
|
|
SELECT COUNT(*) FROM bug16720368;
|
|
COUNT(*)
|
|
8
|
|
INSERT INTO bug16720368_1 VALUES(1);
|
|
# The table is unaccessible, because after a crash we will
|
|
# validate the tablespace header.
|
|
SELECT COUNT(*) FROM bug16720368;
|
|
ERROR 42S02: Table 'test.bug16720368' doesn't exist in engine
|
|
INSERT INTO bug16720368 VALUES(0,1);
|
|
ERROR 42S02: Table 'test.bug16720368' doesn't exist in engine
|
|
# The table is readable thanks to innodb-force-recovery.
|
|
SELECT COUNT(*) FROM bug16720368;
|
|
COUNT(*)
|
|
8
|
|
INSERT INTO bug16720368 VALUES(0,1);
|
|
# Shut down the server cleanly to hide the corruption.
|
|
# The table is accessible, because after a clean shutdown we will
|
|
# NOT validate the tablespace header.
|
|
# We can modify the existing pages, but we cannot allocate or free
|
|
# any pages, because that would hit the corruption on page 0.
|
|
SELECT COUNT(*) FROM bug16720368;
|
|
COUNT(*)
|
|
9
|
|
# Shut down the server to uncorrupt the data.
|
|
# Restart the server after uncorrupting the file.
|
|
INSERT INTO bug16720368 VALUES(9,1);
|
|
SELECT COUNT(*) FROM bug16720368;
|
|
COUNT(*)
|
|
10
|
|
DROP TABLE bug16720368, bug16720368_1;
|
|
#
|
|
# Bug#16735660 ASSERT TABLE2 == NULL, ROLLBACK OF RESURRECTED TXNS,
|
|
# DICT_TABLE_ADD_TO_CACHE
|
|
#
|
|
SET GLOBAL innodb_file_per_table=1;
|
|
CREATE TEMPORARY TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB;
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES(42);
|
|
connect con1,localhost,root;
|
|
CREATE TABLE bug16735660 (a INT PRIMARY KEY) ENGINE=InnoDB;
|
|
XA START 'x';
|
|
INSERT INTO bug16735660 VALUES(1),(2),(3);
|
|
XA END 'x';
|
|
XA PREPARE 'x';
|
|
connection default;
|
|
# Kill the server
|
|
disconnect con1;
|
|
# Attempt to start without an *.ibd file.
|
|
FOUND 1 /\[ERROR\] InnoDB: Tablespace [0-9]+ was not found at .*test.bug16735660.ibd/ in mysqld.1.err
|
|
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
SELECT * FROM bug16735660;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
XA RECOVER;
|
|
formatID gtrid_length bqual_length data
|
|
1 1 0 x
|
|
XA ROLLBACK 'x';
|
|
SELECT * FROM bug16735660;
|
|
a
|
|
DROP TABLE bug16735660;
|