mariadb/mysql-test/suite/innodb/t/bulk_load.test
Thirunarayanan Balathandayuthapani 05f9fd3dd2 MDEV-37192 Crash recovery reports corrupiton after bulk load
Problem:
=======
- InnoDB modifies the PAGE_ROOT_AUTO_INC value on clustered index
root page. But before committing the PAGE_ROOT_AUTO_INC changes
mini-transaction, InnoDB does bulk insert operation and
calculates the page checksum and store as a part of redo log in
mini-transaction. During recovery, InnoDB fails to validate the
page checksum.

Solution:
========
- Avoid writing the persistent auto increment value before doing
bulk insert operation.

- For bulk insert operation, persistent auto increment value
is written via btr_write_autoinc while applying the buffered
insert operation.
2025-08-06 16:15:35 +05:30

68 lines
2.4 KiB
Text

--source include/have_innodb.inc
--source include/have_sequence.inc
--source include/big_test.inc
--source include/not_embedded.inc
CREATE TABLE t1(f1 INT NOT NULL,f2 INT NOT NULL)ENGINE=InnoDB;
INSERT INTO t1 SELECT seq, seq from seq_1_to_131072;
INSERT INTO t1 VALUES(131073, 131073), (131074, 131073);
--replace_result $MYSQLTEST_VARDIR VARDIR
--disable_cursor_protocol
--disable_ps2_protocol
eval SELECT * INTO OUTFILE "$MYSQLTEST_VARDIR/tmp/t1.outfile" FROM t1;
--replace_result $MYSQLTEST_VARDIR VARDIR
eval SELECT * INTO OUTFILE "$MYSQLTEST_VARDIR/tmp/t.outfile" FROM t1 LIMIT 1;
--enable_ps2_protocol
--enable_cursor_protocol
--echo # successful load statement using bulk insert
CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY,
f2 INT NOT NULL)ENGINE=InnoDB;
SET unique_checks=0, foreign_key_checks=0;
--replace_result $MYSQLTEST_VARDIR VARDIR
eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t1.outfile' INTO TABLE t2;
SELECT COUNT(*) FROM t2;
CHECK TABLE t2 EXTENDED;
DROP TABLE t2;
CREATE TABLE t2(f1 INT NOT NULL, PRIMARY KEY(f1 DESC),
f2 INT NOT NULL)ENGINE=InnoDB;
--replace_result $MYSQLTEST_VARDIR VARDIR
eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t1.outfile' INTO TABLE t2;
SELECT COUNT(*) FROM t2;
CHECK TABLE t2 EXTENDED;
DROP TABLE t2;
--echo # load statement using bulk insert fails during secondary index
CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY,
f2 INT NOT NULL UNIQUE KEY)ENGINE=InnoDB;
--replace_result $MYSQLTEST_VARDIR VARDIR
--error ER_ERROR_DURING_COMMIT
eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t1.outfile' INTO TABLE t2;
SELECT COUNT(*) FROM t2;
CHECK TABLE t2 EXTENDED;
DROP TABLE t2;
--echo # load statement using bulk insert fails during primary index
CREATE TABLE t2(f1 INT NOT NULL,
f2 INT NOT NULL PRIMARY KEY)ENGINE=InnoDB;
--replace_result $MYSQLTEST_VARDIR VARDIR
--error ER_DUP_ENTRY
eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t1.outfile' INTO TABLE t2;
SELECT COUNT(*) FROM t2;
CHECK TABLE t2 EXTENDED;
--remove_file $MYSQLTEST_VARDIR/tmp/t1.outfile
DROP TABLE t2, t1;
--echo #
--echo # MDEV-37192 Crash recovery reports corruption after bulk load
--echo #
CREATE TABLE t2(f1 INT AUTO_INCREMENT, f2 INT NOT NULL,
PRIMARY KEY(f1))ENGINE=InnoDB;
BEGIN;
--replace_result $MYSQLTEST_VARDIR VARDIR
eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t.outfile' INTO TABLE t2;
--let $shutdown_timeout=0
--source include/restart_mysqld.inc
--remove_file $MYSQLTEST_VARDIR/tmp/t.outfile
DROP TABLE t2;