mirror of
https://github.com/MariaDB/server.git
synced 2025-01-27 09:14:17 +01:00
e581396b7a
Before commit6112853cda
in MySQL 4.1.1 introduced the parameter innodb_file_per_table, all InnoDB data was written to the InnoDB system tablespace (often named ibdata1). A serious design problem is that once the system tablespace has grown to some size, it cannot shrink even if the data inside it has been deleted. There are also other design problems, such as the server hang MDEV-29930 that should only be possible when using innodb_file_per_table=0 and innodb_undo_tablespaces=0 (storing both tables and undo logs in the InnoDB system tablespace). The parameter innodb_change_buffering was deprecated in commitb5852ffbee
. Starting with commitbaf276e6d4
(MDEV-19229) the number of innodb_undo_tablespaces can be increased, so that the undo logs can be moved out of the system tablespace of an existing installation. If all these things (tables, undo logs, and the change buffer) are removed from the InnoDB system tablespace, the only variable-size data structure inside it is the InnoDB data dictionary. DDL operations on .ibd files was optimized in commit86dc7b4d4c
(MDEV-24626). That should have removed any thinkable performance advantage of using innodb_file_per_table=0. Since there should be no benefit of setting innodb_file_per_table=0, the parameter should be deprecated. Starting with MySQL 5.6 and MariaDB Server 10.0, the default value is innodb_file_per_table=1.
168 lines
6 KiB
Text
168 lines
6 KiB
Text
call mtr.add_suppression("InnoDB: Table .* does not exist in the InnoDB internal data dictionary .*");
|
|
call mtr.add_suppression("Deadlock found when trying to get lock; try restarting transaction");
|
|
#
|
|
# Bug#11766879/Bug#60106: DIFF BETWEEN # OF INDEXES IN MYSQL VS INNODB,
|
|
# PARTITONING, ON INDEX CREATE
|
|
# Bug#12696518: MEMORY LEAKS IN HA_PARTITION (VALGRIND TESTS ON TRUNK)
|
|
#
|
|
CREATE TABLE t1 (
|
|
id bigint NOT NULL AUTO_INCREMENT,
|
|
time date,
|
|
id2 bigint not null,
|
|
PRIMARY KEY (id,time)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8
|
|
/*!50100 PARTITION BY RANGE(TO_DAYS(time))
|
|
(PARTITION p10 VALUES LESS THAN (734708) ENGINE = InnoDB,
|
|
PARTITION p20 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;
|
|
INSERT INTO t1 (time,id2) VALUES ('2011-07-24',1);
|
|
INSERT INTO t1 (time,id2) VALUES ('2011-07-25',1);
|
|
INSERT INTO t1 (time,id2) VALUES ('2011-07-25',1);
|
|
CREATE UNIQUE INDEX uk_time_id2 on t1(time,id2);
|
|
ERROR 23000: Duplicate entry '2011-07-25-1' for key 'uk_time_id2'
|
|
SELECT COUNT(*) FROM t1;
|
|
COUNT(*)
|
|
3
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
|
`time` date NOT NULL,
|
|
`id2` bigint(20) NOT NULL,
|
|
PRIMARY KEY (`id`,`time`)
|
|
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci
|
|
PARTITION BY RANGE (to_days(`time`))
|
|
(PARTITION `p10` VALUES LESS THAN (734708) ENGINE = InnoDB,
|
|
PARTITION `p20` VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
|
|
DROP TABLE t1;
|
|
call mtr.add_suppression("InnoDB: Error: table `test`.`t1` .* InnoDB internal");
|
|
#
|
|
# Bug#55091: Server crashes on ADD PARTITION after a failed attempt
|
|
#
|
|
SET @old_innodb_file_per_table = @@global.innodb_file_per_table;
|
|
SET @old_innodb_strict_mode = @@global.innodb_strict_mode;
|
|
SET @@global.innodb_file_per_table = ON,
|
|
@@global.innodb_strict_mode = ON;
|
|
Warnings:
|
|
Warning 1287 '@@innodb_file_per_table' is deprecated and will be removed in a future release
|
|
connect con1,localhost,root,,;
|
|
CREATE TABLE t1 (id INT NOT NULL
|
|
PRIMARY KEY,
|
|
user_num CHAR(10)
|
|
) ENGINE = InnoDB
|
|
KEY_BLOCK_SIZE=4
|
|
PARTITION BY HASH(id) PARTITIONS 1;
|
|
t1#P#p0.ibd
|
|
t1.frm
|
|
t1.par
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`id` int(11) NOT NULL,
|
|
`user_num` char(10) DEFAULT NULL,
|
|
PRIMARY KEY (`id`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci KEY_BLOCK_SIZE=4
|
|
PARTITION BY HASH (`id`)
|
|
PARTITIONS 1
|
|
SET GLOBAL innodb_file_per_table = OFF;
|
|
Warnings:
|
|
Warning 1287 '@@innodb_file_per_table' is deprecated and will be removed in a future release
|
|
disconnect con1;
|
|
connect con2,localhost,root,,;
|
|
LOCK TABLE t1 WRITE;
|
|
# ALTER fails because COMPRESSED/KEY_BLOCK_SIZE
|
|
# are incompatible with innodb_file_per_table = OFF;
|
|
ALTER TABLE t1 ADD PARTITION PARTITIONS 1;
|
|
ERROR HY000: Got error 140 "Wrong create options" from storage engine InnoDB
|
|
t1#P#p0.ibd
|
|
t1.frm
|
|
t1.par
|
|
# This SET is not needed to reproduce the bug,
|
|
# it is here just to make the test case more realistic
|
|
SET innodb_strict_mode = OFF;
|
|
ALTER TABLE t1 ADD PARTITION PARTITIONS 2;
|
|
Warnings:
|
|
Warning 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
|
|
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=4.
|
|
Warning 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
|
|
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=4.
|
|
Warning 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
|
|
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=4.
|
|
t1.frm
|
|
t1.par
|
|
ALTER TABLE t1 REBUILD PARTITION p0;
|
|
Warnings:
|
|
Warning 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
|
|
Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=4.
|
|
UNLOCK TABLES;
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`id` int(11) NOT NULL,
|
|
`user_num` char(10) DEFAULT NULL,
|
|
PRIMARY KEY (`id`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci KEY_BLOCK_SIZE=4
|
|
PARTITION BY HASH (`id`)
|
|
PARTITIONS 3
|
|
DROP TABLE t1;
|
|
disconnect con2;
|
|
connection default;
|
|
SET @@global.innodb_strict_mode = @old_innodb_strict_mode;
|
|
SET @@global.innodb_file_per_table = @old_innodb_file_per_table;
|
|
Warnings:
|
|
Warning 1287 '@@innodb_file_per_table' is deprecated and will be removed in a future release
|
|
SET @save_detect= @@GLOBAL.innodb_deadlock_detect;
|
|
SET @save_report= @@GLOBAL.innodb_deadlock_report;
|
|
SET GLOBAL innodb_deadlock_detect=ON;
|
|
SET GLOBAL innodb_deadlock_report=BASIC;
|
|
SET NAMES utf8;
|
|
CREATE TABLE `t``\""e` (a INT, PRIMARY KEY (a))
|
|
ENGINE=InnoDB
|
|
PARTITION BY RANGE (a)
|
|
SUBPARTITION BY HASH (a)
|
|
(PARTITION `p0``\""e` VALUES LESS THAN (100)
|
|
(SUBPARTITION `sp0``\""e`,
|
|
SUBPARTITION `sp1``\""e`),
|
|
PARTITION `p1``\""e` VALUES LESS THAN (MAXVALUE)
|
|
(SUBPARTITION `sp2``\""e`,
|
|
SUBPARTITION `sp3``\""e`));
|
|
INSERT INTO `t``\""e` VALUES (0), (2), (6), (10), (14), (18), (22);
|
|
START TRANSACTION;
|
|
connect con1,localhost,root,,;
|
|
SET NAMES utf8;
|
|
START TRANSACTION;
|
|
connection default;
|
|
UPDATE `t``\""e` SET a = 16 WHERE a = 0;
|
|
connection con1;
|
|
UPDATE `t``\""e` SET a = 8 WHERE a = 22;
|
|
UPDATE `t``\""e` SET a = 12 WHERE a = 0;
|
|
connection default;
|
|
SELECT lock_table, COUNT(*) FROM INFORMATION_SCHEMA.INNODB_LOCKS
|
|
GROUP BY lock_table;
|
|
lock_table COUNT(*)
|
|
`test`.`t``\""e` /* Partition `p0``\""e`, Subpartition `sp0``\""e` */ 2
|
|
set @old_sql_mode = @@sql_mode;
|
|
set sql_mode = 'ANSI_QUOTES';
|
|
SELECT lock_table, COUNT(*) FROM INFORMATION_SCHEMA.INNODB_LOCKS
|
|
GROUP BY lock_table;
|
|
lock_table COUNT(*)
|
|
"test"."t`\""""e" /* Partition "p0`\""""e", Subpartition "sp0`\""""e" */ 2
|
|
set @@sql_mode = @old_sql_mode;
|
|
UPDATE `t``\""e` SET a = 4 WHERE a = 22;
|
|
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
|
# First table reported in 'SHOW ENGINE InnoDB STATUS'
|
|
SHOW ENGINE InnoDB STATUS;
|
|
Type Name Status
|
|
InnoDB index PRIMARY of table `test`.`t``\""e` /* Partition `p0``\""e`, Subpartition `sp0``\""e` */
|
|
set @old_sql_mode = @@sql_mode;
|
|
set sql_mode = 'ANSI_QUOTES';
|
|
SHOW ENGINE InnoDB STATUS;
|
|
Type Name Status
|
|
InnoDB index PRIMARY of table `test`.`t``\""e` /* Partition `p0``\""e`, Subpartition `sp0``\""e` */
|
|
SET GLOBAL innodb_deadlock_detect= @save_detect;
|
|
SET GLOBAL innodb_deadlock_report= @save_report;
|
|
set @@sql_mode = @old_sql_mode;
|
|
connection con1;
|
|
ROLLBACK;
|
|
disconnect con1;
|
|
connection default;
|
|
DROP TABLE `t``\""e`;
|