mirror of
https://github.com/MariaDB/server.git
synced 2025-04-20 22:25:30 +02:00

Problem: ======== - InnoDB reads the length of the variable length field wrongly while applying the modification log of instant table. Solution: ======== rec_init_offsets_comp_ordinary(): For the temporary instant file record, InnoDB should read the length of the variable length field from the record itself.
184 lines
5.4 KiB
Text
184 lines
5.4 KiB
Text
FLUSH TABLES;
|
|
#
|
|
# MDEV-11369: Instant ADD COLUMN for InnoDB
|
|
#
|
|
CREATE TABLE t1(id INT PRIMARY KEY, c2 INT UNIQUE)
|
|
ENGINE=InnoDB ROW_FORMAT=REDUNDANT;
|
|
CREATE TABLE t2 LIKE t1;
|
|
INSERT INTO t1 VALUES(0,2);
|
|
INSERT INTO t2 VALUES(2,1);
|
|
ALTER TABLE t2 ADD COLUMN (c3 TEXT NOT NULL DEFAULT 'De finibus bonorum');
|
|
BEGIN;
|
|
INSERT INTO t2 VALUES(3,4,'accusantium doloremque laudantium');
|
|
connect ddl, localhost, root;
|
|
SET DEBUG_SYNC='innodb_alter_inplace_before_commit SIGNAL ddl WAIT_FOR ever';
|
|
ALTER TABLE t1 ADD COLUMN (c3 TEXT NOT NULL DEFAULT ' et malorum');
|
|
connection default;
|
|
SET DEBUG_SYNC='now WAIT_FOR ddl';
|
|
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
|
COMMIT;
|
|
# Kill the server
|
|
disconnect ddl;
|
|
# restart
|
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
|
|
SELECT * FROM t1;
|
|
id c2
|
|
0 2
|
|
SELECT * FROM t2;
|
|
id c2 c3
|
|
2 1 De finibus bonorum
|
|
3 4 accusantium doloremque laudantium
|
|
BEGIN;
|
|
DELETE FROM t1;
|
|
ROLLBACK;
|
|
InnoDB 0 transactions not purged
|
|
INSERT INTO t2 VALUES
|
|
(16,1551,'Omnium enim rerum'),(128,1571,' principia parva sunt');
|
|
connect ddl, localhost, root;
|
|
SET DEBUG_SYNC='innodb_alter_inplace_before_commit SIGNAL ddl WAIT_FOR ever';
|
|
ALTER TABLE t2 DROP COLUMN c3, ADD COLUMN c5 TEXT DEFAULT 'naturam abhorrere';
|
|
connection default;
|
|
SET DEBUG_SYNC='now WAIT_FOR ddl';
|
|
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
|
SET debug_dbug='+d,dict_sys_mutex_avoid';
|
|
UPDATE t1 SET c2=c2+1;
|
|
# Kill the server
|
|
disconnect ddl;
|
|
# restart
|
|
SET @saved_frequency= @@GLOBAL.innodb_purge_rseg_truncate_frequency;
|
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
|
|
SELECT * FROM t1;
|
|
id c2
|
|
0 3
|
|
SELECT * FROM t2;
|
|
id c2 c3
|
|
2 1 De finibus bonorum
|
|
3 4 accusantium doloremque laudantium
|
|
16 1551 Omnium enim rerum
|
|
128 1571 principia parva sunt
|
|
BEGIN;
|
|
INSERT INTO t1 SET id=1;
|
|
DELETE FROM t2;
|
|
ROLLBACK;
|
|
InnoDB 0 transactions not purged
|
|
INSERT INTO t2 VALUES (64,42,'De finibus bonorum'), (347,33101,' et malorum');
|
|
connect ddl, localhost, root;
|
|
ALTER TABLE t2 DROP COLUMN c3;
|
|
SET DEBUG_SYNC='innodb_alter_inplace_before_commit SIGNAL ddl WAIT_FOR ever';
|
|
ALTER TABLE t2 ADD COLUMN (c4 TEXT NOT NULL DEFAULT ' et malorum');
|
|
connection default;
|
|
SET DEBUG_SYNC='now WAIT_FOR ddl';
|
|
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
|
SET debug_dbug='+d,dict_sys_mutex_avoid';
|
|
DELETE FROM t1;
|
|
# Kill the server
|
|
disconnect ddl;
|
|
# restart
|
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
|
|
FOUND 3 /\[Note\] InnoDB: Rolled back recovered transaction / in mysqld.1.err
|
|
SELECT * FROM t1;
|
|
id c2
|
|
SELECT * FROM t2;
|
|
id c2
|
|
2 1
|
|
3 4
|
|
64 42
|
|
16 1551
|
|
128 1571
|
|
347 33101
|
|
BEGIN;
|
|
INSERT INTO t1 SET id=1;
|
|
DELETE FROM t2;
|
|
ROLLBACK;
|
|
InnoDB 0 transactions not purged
|
|
FLUSH TABLE t1,t2 FOR EXPORT;
|
|
t1 clustered index root page(type 17855):
|
|
N_RECS=0; LEVEL=0
|
|
header=0x010000030074 (id=0x696e66696d756d00)
|
|
header=0x010008030000 (id=0x73757072656d756d00)
|
|
t2 clustered index root page(type 18):
|
|
N_RECS=7; LEVEL=0
|
|
header=0x01000003008f (id=0x0000000000000000)
|
|
header=0x3000100c00d4 (id=0x80000000,
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
BLOB=0x000000260000000000000008,
|
|
c2=NULL(4 bytes),
|
|
c3=0x44652066696e6962757320626f6e6f72756d)
|
|
header=0x0000180900f4 (id=0x80000002,
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
c2=0x80000001)
|
|
header=0x0000200b0135 (id=0x80000003,
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
c2=0x80000004,
|
|
c3=0x6163637573616e7469756d20646f6c6f72656d717565206c617564616e7469756d)
|
|
header=0x0000280b0165 (id=0x80000010,
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
c2=0x8000060f,
|
|
c3=0x4f6d6e69756d20656e696d20726572756d)
|
|
header=0x000030090185 (id=0x80000040,
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
c2=0x8000002a)
|
|
header=0x0000380b01ba (id=0x80000080,
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
c2=0x80000623,
|
|
c3=0x207072696e63697069612070617276612073756e74)
|
|
header=0x0000400b0074 (id=0x8000015b,
|
|
DB_TRX_ID=0x000000000000,
|
|
DB_ROLL_PTR=0x80000000000000,
|
|
c2=0x8000814d,
|
|
c3=0x206574206d616c6f72756d)
|
|
header=0x080008030000 (id=0x000000000000000100)
|
|
UNLOCK TABLES;
|
|
DELETE FROM t2;
|
|
InnoDB 0 transactions not purged
|
|
#
|
|
# MDEV-24323 Crash on recovery after kill during instant ADD COLUMN
|
|
#
|
|
connect ddl, localhost, root;
|
|
CREATE TABLE t3(id INT PRIMARY KEY, c2 INT, v2 INT AS(c2) VIRTUAL, UNIQUE(v2))
|
|
ENGINE=InnoDB;
|
|
INSERT INTO t3 SET id=1,c2=1;
|
|
SET DEBUG_SYNC='innodb_alter_inplace_before_commit SIGNAL ddl WAIT_FOR ever';
|
|
ALTER TABLE t3 ADD COLUMN c3 TEXT NOT NULL DEFAULT 'sic transit gloria mundi';
|
|
connection default;
|
|
SET DEBUG_SYNC='now WAIT_FOR ddl';
|
|
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
|
SET debug_dbug='+d,dict_sys_mutex_avoid';
|
|
INSERT INTO t1 VALUES(0,0);
|
|
# Kill the server
|
|
disconnect ddl;
|
|
# restart
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`id` int(11) NOT NULL,
|
|
`c2` int(11) DEFAULT NULL,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `c2` (`c2`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=REDUNDANT
|
|
SHOW CREATE TABLE t2;
|
|
Table Create Table
|
|
t2 CREATE TABLE `t2` (
|
|
`id` int(11) NOT NULL,
|
|
`c2` int(11) DEFAULT NULL,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `c2` (`c2`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=REDUNDANT
|
|
SHOW CREATE TABLE t3;
|
|
Table Create Table
|
|
t3 CREATE TABLE `t3` (
|
|
`id` int(11) NOT NULL,
|
|
`c2` int(11) DEFAULT NULL,
|
|
`v2` int(11) GENERATED ALWAYS AS (`c2`) VIRTUAL,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `v2` (`v2`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
DROP TABLE t1,t2,t3;
|
|
SET DEBUG_SYNC=RESET;
|
|
db.opt
|