mirror of
https://github.com/MariaDB/server.git
synced 2025-02-12 00:15:35 +01:00
![Yuchen Pei](/assets/img/avatar_default.png)
Allow ALTER TABLE ... IMPORT TABLESPACE without creating the table followed by discarding the tablespace. That is, assuming we want to import table t1 to t2, instead of CREATE TABLE t2 LIKE t1; ALTER TABLE t2 DISCARD TABLESPACE; FLUSH TABLES t1 FOR EXPORT; --copy_file $MYSQLD_DATADIR/test/t1.cfg $MYSQLD_DATADIR/test/t2.cfg --copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t2.ibd UNLOCK TABLES; ALTER TABLE t2 IMPORT TABLESPACE; We can simply do FLUSH TABLES t1 FOR EXPORT; --copy_file $MYSQLD_DATADIR/test/t1.cfg $MYSQLD_DATADIR/test/t2.cfg --copy_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/t2.frm --copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t2.ibd UNLOCK TABLES; ALTER TABLE t2 IMPORT TABLESPACE; We achieve this by creating a "stub" table in the second scenario while opening the table, where t2 does not exist but needs to import from t1. The "stub" table is similar to a table that is created but then instructed to discard its tablespace. We include tests with various row formats, encryption, with indexes and auto-increment.
86 lines
2.7 KiB
Text
86 lines
2.7 KiB
Text
--source include/have_innodb.inc
|
|
--source include/have_sequence.inc
|
|
let $MYSQLD_DATADIR = `SELECT @@datadir`;
|
|
|
|
--echo #
|
|
--echo # MDEV-26137 ALTER TABLE IMPORT enhancement
|
|
--echo #
|
|
|
|
--echo # drop t1 before importing t2
|
|
CREATE TABLE t1 (a int) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES(42);
|
|
FLUSH TABLES t1 FOR EXPORT;
|
|
--copy_file $MYSQLD_DATADIR/test/t1.cfg $MYSQLD_DATADIR/test/t2.cfg
|
|
--copy_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/t2.frm
|
|
--copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t2.ibd
|
|
UNLOCK TABLES;
|
|
DROP TABLE t1;
|
|
ALTER TABLE t2 IMPORT TABLESPACE;
|
|
SHOW CREATE TABLE t2;
|
|
SELECT * FROM t2;
|
|
DROP TABLE t2;
|
|
|
|
--echo # created t2 but did not discard tablespace
|
|
CREATE TABLE t1 (a int) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES(42);
|
|
CREATE TABLE t2 LIKE t1;
|
|
FLUSH TABLES t1 FOR EXPORT;
|
|
--copy_file $MYSQLD_DATADIR/test/t1.cfg $MYSQLD_DATADIR/test/t2.cfg
|
|
UNLOCK TABLES;
|
|
DROP TABLE t1;
|
|
call mtr.add_suppression("InnoDB: Unable to import tablespace");
|
|
--error ER_TABLESPACE_EXISTS
|
|
ALTER TABLE t2 IMPORT TABLESPACE;
|
|
SHOW CREATE TABLE t2;
|
|
SELECT * FROM t2;
|
|
DROP TABLE t2;
|
|
|
|
--echo # attempt to import when there's no tablespace
|
|
--error ER_NO_SUCH_TABLE
|
|
ALTER TABLE t2 IMPORT TABLESPACE;
|
|
|
|
--echo # with index
|
|
CREATE TABLE t1 (a int, b varchar(50)) ENGINE=InnoDB;
|
|
CREATE UNIQUE INDEX ai ON t1 (a);
|
|
INSERT INTO t1 VALUES(42, "hello");
|
|
FLUSH TABLES t1 FOR EXPORT;
|
|
--copy_file $MYSQLD_DATADIR/test/t1.cfg $MYSQLD_DATADIR/test/t2.cfg
|
|
--copy_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/t2.frm
|
|
--copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t2.ibd
|
|
UNLOCK TABLES;
|
|
ALTER TABLE t2 IMPORT TABLESPACE;
|
|
SHOW CREATE TABLE t2;
|
|
SELECT * FROM t2;
|
|
SHOW INDEX FROM t1;
|
|
SHOW INDEX FROM t2;
|
|
DROP TABLE t1, t2;
|
|
|
|
--echo # with virtual column index
|
|
CREATE TABLE t1 (a int, b int as (a * a)) ENGINE=InnoDB;
|
|
CREATE UNIQUE INDEX ai ON t1 (b);
|
|
INSERT INTO t1 VALUES(42, default);
|
|
FLUSH TABLES t1 FOR EXPORT;
|
|
--copy_file $MYSQLD_DATADIR/test/t1.cfg $MYSQLD_DATADIR/test/t2.cfg
|
|
--copy_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/t2.frm
|
|
--copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t2.ibd
|
|
UNLOCK TABLES;
|
|
ALTER TABLE t2 IMPORT TABLESPACE;
|
|
SHOW CREATE TABLE t2;
|
|
SELECT * FROM t2;
|
|
SELECT b FROM t2 USE INDEX (ai);
|
|
SHOW INDEX FROM t1;
|
|
SHOW INDEX FROM t2;
|
|
CHECK TABLE t2 EXTENDED;
|
|
DROP TABLE t1, t2;
|
|
|
|
--echo # with auto_increment
|
|
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, i2 INT, i1 INT)ENGINE=INNODB;
|
|
INSERT INTO t1 (i2) SELECT 4 FROM seq_1_to_1024;
|
|
FLUSH TABLE t1 FOR EXPORT;
|
|
--copy_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/t2.frm
|
|
--copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t2.ibd
|
|
--copy_file $MYSQLD_DATADIR/test/t1.cfg $MYSQLD_DATADIR/test/t2.cfg
|
|
UNLOCK TABLES;
|
|
ALTER TABLE t2 IMPORT TABLESPACE;
|
|
CHECK TABLE t2 EXTENDED;
|
|
DROP TABLE t2, t1;
|