mirror of
https://github.com/MariaDB/server.git
synced 2025-11-25 17:25:02 +03:00
MDEV-22088 S3 partitioning support
All ALTER PARTITION commands should now work on S3 tables except
REBUILD PARTITION
TRUNCATE PARTITION
REORGANIZE PARTITION
In addition, PARTIONED S3 TABLES can also be replicated.
This is achived by storing the partition tables .frm and .par file on S3
for partitioned shared (S3) tables.
The discovery methods are enchanced by allowing engines that supports
discovery to also support of the partitioned tables .frm and .par file
Things in more detail
- The .frm and .par files of partitioned tables are stored in S3 and kept
in sync.
- Added hton callback create_partitioning_metadata to inform handler
that metadata for a partitoned file has changed
- Added back handler::discover_check_version() to be able to check if
a table's or a part table's definition has changed.
- Added handler::check_if_updates_are_ignored(). Needed for partitioning.
- Renamed rebind() -> rebind_psi(), as it was before.
- Changed CHF_xxx hadnler flags to an enum
- Changed some checks from using table->file->ht to use
table->file->partition_ht() to get discovery to work with partitioning.
- If TABLE_SHARE::init_from_binary_frm_image() fails, ensure that we
don't leave any .frm or .par files around.
- Fixed that writefrm() doesn't leave unusable .frm files around
- Appended extension to path for writefrm() to be able to reuse to function
for creating .par files.
- Added DBUG_PUSH("") to a a few functions that caused a lot of not
critical tracing.
166 lines
4.5 KiB
Plaintext
166 lines
4.5 KiB
Plaintext
# Test for COALESCE PARTITION, ALTER TABLE and ADD PARTITIONS
|
|
# for tables with HASH partitions
|
|
CREATE TABLE t1 (
|
|
c1 INT DEFAULT NULL
|
|
) ENGINE=Aria
|
|
PARTITION BY HASH (c1)
|
|
PARTITIONS 3;
|
|
INSERT INTO t1 VALUE (1), (2), (101), (102), (201), (202);
|
|
ALTER TABLE t1 ENGINE=S3;
|
|
SELECT count(*) FROM t1;
|
|
count(*)
|
|
6
|
|
SHOW TABLES;
|
|
Tables_in_s3
|
|
t1
|
|
ALTER TABLE t1 COALESCE PARTITION 2;
|
|
ERROR 42000: Table 't1' uses an extension that doesn't exist in this MariaDB version
|
|
SHOW WARNINGS;
|
|
Level Code Message
|
|
Error 1112 Table 't1' uses an extension that doesn't exist in this MariaDB version
|
|
Error 6 Error on delete of './s3/t1#P#p0#TMP#.MAI' (Errcode: 2 "No such file or directory")
|
|
Error 6 Error on delete of './s3/t1#P#p0#TMP#.MAD' (Errcode: 2 "No such file or directory")
|
|
ALTER TABLE t1 ADD PARTITION PARTITIONS 6;
|
|
SELECT count(*) FROM t1;
|
|
count(*)
|
|
6
|
|
ALTER TABLE t1 ADD COLUMN c INT;
|
|
SELECT count(*) FROM t1;
|
|
count(*)
|
|
6
|
|
DROP TABLE t1;
|
|
# Test for simple change engine to S3
|
|
CREATE TABLE t1 (
|
|
c1 int DEFAULT NULL,
|
|
c2 int DEFAULT NULL
|
|
) ENGINE=Aria
|
|
PARTITION BY RANGE (c1)
|
|
SUBPARTITION BY HASH(c2)
|
|
SUBPARTITIONS 2
|
|
(PARTITION p0 VALUES LESS THAN (100),
|
|
PARTITION p1 VALUES LESS THAN (200),
|
|
PARTITION p3 VALUES LESS THAN (300));
|
|
INSERT INTO t1 VALUE (1,1), (2,2), (101,101), (102,102), (201,201), (202,202);
|
|
ALTER TABLE t1 ENGINE=S3;
|
|
SELECT count(*) FROM t1;
|
|
count(*)
|
|
6
|
|
# Test for rename table
|
|
RENAME TABLE t1 TO t2;
|
|
SELECT count(*) FROM t2;
|
|
count(*)
|
|
6
|
|
# Test for TRUNCATE, ANALYZE, CHECK, REBUILD, OPTIMIZE, REPAIR,
|
|
# ADD, DROP, REORGANIZE partition
|
|
ALTER TABLE t2 TRUNCATE PARTITION p3;
|
|
ERROR HY000: Table 't2' is read only
|
|
ALTER TABLE t2 ANALYZE PARTITION p3;
|
|
Table Op Msg_type Msg_text
|
|
s3.t2 analyze error Table 's3.t2' is read only
|
|
SELECT count(*) FROM t2;
|
|
count(*)
|
|
6
|
|
ALTER TABLE t2 CHECK PARTITION p3;
|
|
Table Op Msg_type Msg_text
|
|
s3.t2 check error Subpartition p3sp0 returned error
|
|
s3.t2 check error Unknown - internal error 131 during operation
|
|
SELECT count(*) FROM t2;
|
|
count(*)
|
|
6
|
|
ALTER TABLE t2 REBUILD PARTITION p0, p1;
|
|
ERROR 42000: Table 't2' uses an extension that doesn't exist in this MariaDB version
|
|
ALTER TABLE t2 OPTIMIZE PARTITION p0, p1;
|
|
Table Op Msg_type Msg_text
|
|
s3.t2 optimize Error Table 't2' is read only
|
|
s3.t2 optimize status Operation failed
|
|
SELECT count(*) FROM t2;
|
|
count(*)
|
|
6
|
|
ALTER TABLE t2 REPAIR PARTITION p0, p1;
|
|
Table Op Msg_type Msg_text
|
|
s3.t2 repair Error Table 't2' is read only
|
|
s3.t2 repair status Operation failed
|
|
SELECT count(*) FROM t2;
|
|
count(*)
|
|
6
|
|
ALTER TABLE t2 ADD PARTITION (PARTITION p4 VALUES LESS THAN (400));
|
|
SHOW CREATE TABLE t2;
|
|
Table Create Table
|
|
t2 CREATE TABLE `t2` (
|
|
`c1` int(11) DEFAULT NULL,
|
|
`c2` int(11) DEFAULT NULL
|
|
) ENGINE=S3 DEFAULT CHARSET=latin1
|
|
PARTITION BY RANGE (`c1`)
|
|
SUBPARTITION BY HASH (`c2`)
|
|
SUBPARTITIONS 2
|
|
(PARTITION `p0` VALUES LESS THAN (100) ENGINE = S3,
|
|
PARTITION `p1` VALUES LESS THAN (200) ENGINE = S3,
|
|
PARTITION `p3` VALUES LESS THAN (300) ENGINE = S3,
|
|
PARTITION `p4` VALUES LESS THAN (400) ENGINE = S3)
|
|
ALTER TABLE t2
|
|
REORGANIZE PARTITION p4 INTO (
|
|
PARTITION n0 VALUES LESS THAN (500),
|
|
PARTITION n1 VALUES LESS THAN (600)
|
|
);
|
|
ERROR 42000: Table 't2' uses an extension that doesn't exist in this MariaDB version
|
|
ALTER TABLE t2 DROP PARTITION p3;
|
|
SHOW CREATE TABLE t2;
|
|
Table Create Table
|
|
t2 CREATE TABLE `t2` (
|
|
`c1` int(11) DEFAULT NULL,
|
|
`c2` int(11) DEFAULT NULL
|
|
) ENGINE=S3 DEFAULT CHARSET=latin1
|
|
PARTITION BY RANGE (`c1`)
|
|
SUBPARTITION BY HASH (`c2`)
|
|
SUBPARTITIONS 2
|
|
(PARTITION `p0` VALUES LESS THAN (100) ENGINE = S3,
|
|
PARTITION `p1` VALUES LESS THAN (200) ENGINE = S3,
|
|
PARTITION `p4` VALUES LESS THAN (400) ENGINE = S3)
|
|
SELECT count(*) from t2;
|
|
count(*)
|
|
4
|
|
# Test for ALTER TABLE
|
|
ALTER TABLE t2 ADD COLUMN c INT;
|
|
SELECT count(*) FROM t2;
|
|
count(*)
|
|
4
|
|
ALTER TABLE t2 DROP COLUMN c;
|
|
SELECT count(*) FROM t2;
|
|
count(*)
|
|
4
|
|
# Test for REMOVE PARTITIONING
|
|
ALTER TABLE t2 REMOVE PARTITIONING;
|
|
SHOW CREATE TABLE t2;
|
|
Table Create Table
|
|
t2 CREATE TABLE `t2` (
|
|
`c1` int(11) DEFAULT NULL,
|
|
`c2` int(11) DEFAULT NULL
|
|
) ENGINE=S3 DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1
|
|
SELECT count(*) FROM t2;
|
|
count(*)
|
|
4
|
|
DROP TABLE t2;
|
|
# Test for EXCHANGE PARTITION
|
|
CREATE TABLE t1 (
|
|
c1 int DEFAULT NULL
|
|
) ENGINE=Aria
|
|
PARTITION BY RANGE (c1)
|
|
(PARTITION p0 VALUES LESS THAN (100),
|
|
PARTITION p1 VALUES LESS THAN (200));
|
|
INSERT INTO t1 VALUE (1), (2), (101), (102);
|
|
ALTER TABLE t1 ENGINE=S3;
|
|
CREATE TABLE t_part (
|
|
c1 int DEFAULT NULL
|
|
) ENGINE=Aria;
|
|
INSERT INTO t_part VALUE (120), (130), (140);
|
|
ALTER TABLE t_part ENGINE=S3;
|
|
ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t_part;
|
|
SELECT count(*) FROM t_part;
|
|
count(*)
|
|
2
|
|
SELECT count(*) FROM t1;
|
|
count(*)
|
|
5
|
|
DROP TABLE t1;
|
|
DROP TABLE t_part;
|