mirror of
https://github.com/MariaDB/server.git
synced 2025-11-28 17:36:30 +03:00
ALTER TABLE IMPORT doesn't properly handle instant alter metadata.
This patch makes IMPORT read, parse and apply instant alter metadata at the
very beginning of operation. So, cases when source table has some metadata
and destination table doesn't have it now works fine.
DISCARD already removes instant metadata so importing normal table into
instant table worked fine before this patch.
decrypt_decompress(): decrypts and decompresses page if needed
handle_instant_metadata(): this should be the first thing to read source
table. Basically, it applies instant metadata to a destination
dict_table_t object. This is the first thing to read FSP flags so
all possible checks of it were moved to this function.
PageConverter::update_index_page(): it doesn't now read instant metadata.
This logic were moved into handle_instant_metadata()
row_import::match_flags(): this is a first part row_import::match_schema().
As a separate function it's used by handle_instant_metadata().
fil_space_t::is_full_crc32_compressed(): added convenient function
ha_innobase::discard_or_import_tablespace(): do not reload table definition
to read instant metadata because handle_instant_metadata() does it better.
The reverted code was originally added in
4e7ee166a9
ANONYMOUS_VAR: this is a handy thing to use along with make_scope_exit()
full_crc32_import.test shows different results, because no
dict_table_close() and dict_table_open_on_id() happens.
Thus, SHOW CREATE TABLE shows a little bit older table definition.
188 lines
5.5 KiB
Plaintext
188 lines
5.5 KiB
Plaintext
FLUSH TABLES;
|
|
# Treating compact format as dynamic format after import stmt
|
|
CREATE TABLE t1
|
|
(a int AUTO_INCREMENT PRIMARY KEY,
|
|
b blob,
|
|
c blob,
|
|
KEY (b(200))) ENGINE=InnoDB ROW_FORMAT=COMPACT;
|
|
INSERT INTO t1 (b, c) values (repeat("ab", 200), repeat("bc", 200));
|
|
INSERT INTO t1 (b, c) values (repeat("bc", 200), repeat("cd", 200));
|
|
INSERT INTO t1 (b, c) values (repeat("cd", 200), repeat("ef", 200));
|
|
INSERT INTO t1 (b, c) values (repeat("de", 200), repeat("fg", 200));
|
|
INSERT INTO t1 (b, c) values (repeat("ef", 200), repeat("gh", 200));
|
|
INSERT INTO t1 (b, c) values (repeat("fg", 200), repeat("hi", 200));
|
|
INSERT INTO t1 (b, c) values (repeat("gh", 200), repeat("ij", 200));
|
|
INSERT INTO t1 (b, c) values (repeat("hi", 200), repeat("jk", 200));
|
|
INSERT INTO t1 (b, c) values (repeat("ij", 200), repeat("kl", 200));
|
|
INSERT INTO t1 (b, c) values (repeat("jk", 200), repeat("lm", 200));
|
|
INSERT INTO t1 (b, c) SELECT b,c FROM t1 ORDER BY a;
|
|
INSERT INTO t1 (b, c) SELECT b,c FROM t1 ORDER BY a;
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
40
|
|
FLUSH TABLE t1 FOR EXPORT;
|
|
# List before copying files
|
|
db.opt
|
|
t1.cfg
|
|
t1.frm
|
|
t1.ibd
|
|
backup: t1
|
|
UNLOCK TABLES;
|
|
ALTER TABLE t1 ROW_FORMAT=DYNAMIC;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
db.opt
|
|
t1.frm
|
|
restore: t1 .ibd and .cfg files
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Internal error: Drop all secondary indexes before importing table test/t1 when .cfg file is missing.
|
|
ALTER TABLE t1 DROP INDEX b;
|
|
Warnings:
|
|
Warning 1814 Tablespace has been discarded for table `t1`
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`a` int(11) NOT NULL AUTO_INCREMENT,
|
|
`b` blob DEFAULT NULL,
|
|
`c` blob DEFAULT NULL,
|
|
PRIMARY KEY (`a`)
|
|
) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC
|
|
UPDATE t1 set b = repeat("de", 100) where b = repeat("cd", 200);
|
|
explain SELECT a FROM t1 where b = repeat("de", 100);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL # Using where
|
|
SELECT a FROM t1 where b = repeat("de", 100);
|
|
a
|
|
3
|
|
13
|
|
28
|
|
38
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
40
|
|
DELETE FROM t1;
|
|
InnoDB 0 transactions not purged
|
|
CHECK TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
DROP TABLE t1;
|
|
CREATE TABLE t1
|
|
(c1 int AUTO_INCREMENT PRIMARY KEY,
|
|
c2 POINT NOT NULL,
|
|
c3 LINESTRING NOT NULL,
|
|
SPATIAL INDEX idx1(c2)) ENGINE=InnoDB ROW_FORMAT=COMPACT;
|
|
INSERT INTO t1(c2,c3) VALUES(
|
|
ST_GeomFromText('POINT(10 10)'),
|
|
ST_GeomFromText('LINESTRING(5 5,20 20,30 30)'));
|
|
INSERT INTO t1(c2,c3) VALUES(
|
|
ST_GeomFromText('POINT(20 20)'),
|
|
ST_GeomFromText('LINESTRING(5 15,20 10,30 20)'));
|
|
INSERT INTO t1(c2,c3) VALUES(
|
|
ST_GeomFromText('POINT(30 30)'),
|
|
ST_GeomFromText('LINESTRING(10 5,20 24,30 32)'));
|
|
INSERT INTO t1(c2,c3) VALUES(
|
|
ST_GeomFromText('POINT(40 40)'),
|
|
ST_GeomFromText('LINESTRING(15 5,25 20,35 30)'));
|
|
INSERT INTO t1(c2,c3) VALUES(
|
|
ST_GeomFromText('POINT(50 10)'),
|
|
ST_GeomFromText('LINESTRING(15 15,24 10,31 20)'));
|
|
INSERT INTO t1(c2,c3) VALUES(
|
|
ST_GeomFromText('POINT(60 50)'),
|
|
ST_GeomFromText('LINESTRING(10 15,20 44,35 32)'));
|
|
INSERT INTO t1(c2, c3) SELECT c2, c3 FROM t1;
|
|
INSERT INTO t1(c2, c3) SELECT c2, c3 FROM t1;
|
|
INSERT INTO t1(c2, c3) SELECT c2, c3 FROM t1;
|
|
INSERT INTO t1(c2, c3) SELECT c2, c3 FROM t1;
|
|
INSERT INTO t1(c2, c3) SELECT c2, c3 FROM t1;
|
|
INSERT INTO t1(c2, c3) SELECT c2, c3 FROM t1;
|
|
INSERT INTO t1(c2, c3) SELECT c2, c3 FROM t1;
|
|
INSERT INTO t1(c2, c3) SELECT c2, c3 FROM t1;
|
|
INSERT INTO t1(c2, c3) SELECT c2, c3 FROM t1;
|
|
INSERT INTO t1(c2, c3) SELECT c2, c3 FROM t1;
|
|
INSERT INTO t1(c2, c3) SELECT c2, c3 FROM t1;
|
|
FLUSH TABLE t1 FOR EXPORT;
|
|
# List before copying files
|
|
db.opt
|
|
t1.cfg
|
|
t1.frm
|
|
t1.ibd
|
|
backup: t1
|
|
UNLOCK TABLES;
|
|
ALTER TABLE t1 ROW_FORMAT=DYNAMIC;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
restore: t1 .ibd and .cfg files
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
ERROR HY000: Internal error: Drop all secondary indexes before importing table test/t1 when .cfg file is missing.
|
|
ALTER TABLE t1 DROP INDEX idx1;
|
|
Warnings:
|
|
Warning 1814 Tablespace has been discarded for table `t1`
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
Warnings:
|
|
Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t1.cfg', will attempt to import without schema verification
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
|
`c2` point NOT NULL,
|
|
`c3` linestring NOT NULL,
|
|
PRIMARY KEY (`c1`)
|
|
) ENGINE=InnoDB AUTO_INCREMENT=16372 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC
|
|
UPDATE t1 SET C2 = ST_GeomFromText('POINT(0 0)');
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
12288
|
|
DELETE FROM t1;
|
|
CHECK TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
InnoDB 0 transactions not purged
|
|
DROP TABLE t1;
|
|
SET @save_algo = @@GLOBAL.innodb_compression_algorithm;
|
|
SET GLOBAL innodb_compression_algorithm=2;
|
|
CREATE TABLE t1(a SERIAL) PAGE_COMPRESSED=1 ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES(1);
|
|
FLUSH TABLE t1 FOR EXPORT;
|
|
# List before copying files
|
|
db.opt
|
|
t1.cfg
|
|
t1.frm
|
|
t1.ibd
|
|
backup: t1
|
|
UNLOCK TABLES;
|
|
SET GLOBAL innodb_compression_algorithm=0;
|
|
ALTER TABLE t1 FORCE;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
db.opt
|
|
t1.frm
|
|
restore: t1 .ibd and .cfg files
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
INSERT INTO t1 VALUES(2);
|
|
SELECT * FROM t1;
|
|
a
|
|
1
|
|
2
|
|
SET GLOBAL innodb_compression_algorithm=3;
|
|
FLUSH TABLE t1 FOR EXPORT;
|
|
# List before copying files
|
|
db.opt
|
|
t1.cfg
|
|
t1.frm
|
|
t1.ibd
|
|
backup: t1
|
|
UNLOCK TABLES;
|
|
SET GLOBAL innodb_compression_algorithm=0;
|
|
ALTER TABLE t1 FORCE;
|
|
ALTER TABLE t1 DISCARD TABLESPACE;
|
|
db.opt
|
|
t1.frm
|
|
restore: t1 .ibd and .cfg files
|
|
ALTER TABLE t1 IMPORT TABLESPACE;
|
|
INSERT INTO t1 VALUES(3);
|
|
SELECT * FROM t1;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
DROP TABLE t1;
|
|
SET GLOBAL innodb_compression_algorithm=@save_algo;
|