mirror of
https://github.com/MariaDB/server.git
synced 2025-11-27 05:41:41 +03:00
Reason for the change was that ha_notify_table_changed() was done after table open when .frm had been replaced, which caused failure in engines that checks on open if .frm matches the engines table definition. Other changes: - Remove not needed open/close call at end of inline alter table. Some test that depended on the table beeing in the table cache after ALTER TABLE had to be updated.
158 lines
4.5 KiB
Plaintext
158 lines
4.5 KiB
Plaintext
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;
|
|
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;
|
|
DELETE FROM t1;
|
|
# Kill the server
|
|
disconnect ddl;
|
|
# restart
|
|
SET @saved_frequency= @@GLOBAL.innodb_purge_rseg_truncate_frequency;
|
|
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
|
|
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 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 ROW_FORMAT=REDUNDANT
|
|
DROP TABLE t1,t2;
|
|
db.opt
|
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=@saved_frequency;
|