Skip to content

Commit 4db17d5

Browse files
author
Aditya A
committed
Bug#20160327 OPTIMIZE TABLE REMOVES THE DATA DIRECTORY IN PARTITIONS
PROBLEM mysql-5.6+ uses inplace alter to do optimize table. Inplace alter was failing to update the create_info->data_file_name,because of which after optimize the ibd file was recreated in default path rather than the specified path. FIX Update the create_info structure in ha_partition::prepare_inplace_alter_table() [ Revewied by Kevin and Deb #rb11185 and #rb11267 ]
1 parent 3e25363 commit 4db17d5

File tree

3 files changed

+141
-0
lines changed

3 files changed

+141
-0
lines changed

mysql-test/r/partition_innodb.result

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,3 +769,94 @@ CREATE_TIME IS NOT NULL AND TABLE_NAME='t1';
769769
COUNT(*)
770770
1
771771
DROP TABLE t1;
772+
#
773+
# Bug#20160327 OPTIMIZE TABLE REMOVES THE DATA DIRECTORY IN PARTITIONS
774+
#
775+
CREATE TABLE `t1` (
776+
`f1` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
777+
`f2` MEDIUMTEXT NOT NULL,
778+
`f3` CHAR(100) NOT NULL,
779+
`f4` TINYINT(1) unsigned NOT NULL,
780+
PRIMARY KEY (`f1`,`f4`)
781+
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1
782+
PARTITION BY LIST (`f4`)
783+
(PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
784+
PARTITION p1 VALUES IN (1) DATA DIRECTORY = 'MYSQL_TMP_DIR/temp_dir' ENGINE = InnoDB);
785+
SHOW CREATE TABLE t1;
786+
Table Create Table
787+
t1 CREATE TABLE `t1` (
788+
`f1` int(10) unsigned NOT NULL AUTO_INCREMENT,
789+
`f2` mediumtext NOT NULL,
790+
`f3` char(100) NOT NULL,
791+
`f4` tinyint(1) unsigned NOT NULL,
792+
PRIMARY KEY (`f1`,`f4`)
793+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
794+
/*!50100 PARTITION BY LIST (`f4`)
795+
(PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
796+
PARTITION p1 VALUES IN (1) DATA DIRECTORY = 'MYSQL_TMP_DIR/temp_dir' ENGINE = InnoDB) */
797+
OPTIMIZE TABLE t1;
798+
Table Op Msg_type Msg_text
799+
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
800+
test.t1 optimize status OK
801+
SHOW CREATE TABLE t1;
802+
Table Create Table
803+
t1 CREATE TABLE `t1` (
804+
`f1` int(10) unsigned NOT NULL AUTO_INCREMENT,
805+
`f2` mediumtext NOT NULL,
806+
`f3` char(100) NOT NULL,
807+
`f4` tinyint(1) unsigned NOT NULL,
808+
PRIMARY KEY (`f1`,`f4`)
809+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
810+
/*!50100 PARTITION BY LIST (`f4`)
811+
(PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
812+
PARTITION p1 VALUES IN (1) DATA DIRECTORY = 'MYSQL_TMP_DIR/temp_dir' ENGINE = InnoDB) */
813+
t1#P#p1.ibd
814+
ALTER TABLE t1 OPTIMIZE PARTITION p0;
815+
Table Op Msg_type Msg_text
816+
test.t1 optimize note Table does not support optimize on partitions. All partitions will be rebuilt and analyzed.
817+
test.t1 optimize status OK
818+
SHOW CREATE TABLE t1;
819+
Table Create Table
820+
t1 CREATE TABLE `t1` (
821+
`f1` int(10) unsigned NOT NULL AUTO_INCREMENT,
822+
`f2` mediumtext NOT NULL,
823+
`f3` char(100) NOT NULL,
824+
`f4` tinyint(1) unsigned NOT NULL,
825+
PRIMARY KEY (`f1`,`f4`)
826+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
827+
/*!50100 PARTITION BY LIST (`f4`)
828+
(PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
829+
PARTITION p1 VALUES IN (1) DATA DIRECTORY = 'MYSQL_TMP_DIR/temp_dir' ENGINE = InnoDB) */
830+
t1#P#p1.ibd
831+
ALTER TABLE t1 OPTIMIZE PARTITION p1;
832+
Table Op Msg_type Msg_text
833+
test.t1 optimize note Table does not support optimize on partitions. All partitions will be rebuilt and analyzed.
834+
test.t1 optimize status OK
835+
SHOW CREATE TABLE t1;
836+
Table Create Table
837+
t1 CREATE TABLE `t1` (
838+
`f1` int(10) unsigned NOT NULL AUTO_INCREMENT,
839+
`f2` mediumtext NOT NULL,
840+
`f3` char(100) NOT NULL,
841+
`f4` tinyint(1) unsigned NOT NULL,
842+
PRIMARY KEY (`f1`,`f4`)
843+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
844+
/*!50100 PARTITION BY LIST (`f4`)
845+
(PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
846+
PARTITION p1 VALUES IN (1) DATA DIRECTORY = 'MYSQL_TMP_DIR/temp_dir' ENGINE = InnoDB) */
847+
t1#P#p1.ibd
848+
ALTER TABLE t1 REBUILD PARTITION ALL;
849+
SHOW CREATE TABLE t1;
850+
Table Create Table
851+
t1 CREATE TABLE `t1` (
852+
`f1` int(10) unsigned NOT NULL AUTO_INCREMENT,
853+
`f2` mediumtext NOT NULL,
854+
`f3` char(100) NOT NULL,
855+
`f4` tinyint(1) unsigned NOT NULL,
856+
PRIMARY KEY (`f1`,`f4`)
857+
) ENGINE=InnoDB DEFAULT CHARSET=latin1
858+
/*!50100 PARTITION BY LIST (`f4`)
859+
(PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
860+
PARTITION p1 VALUES IN (1) DATA DIRECTORY = 'MYSQL_TMP_DIR/temp_dir' ENGINE = InnoDB) */
861+
t1#P#p1.ibd
862+
DROP TABLE t1;

mysql-test/t/partition_innodb.test

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,3 +885,52 @@ SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE
885885
CREATE_TIME IS NOT NULL AND TABLE_NAME='t1';
886886

887887
DROP TABLE t1;
888+
889+
--echo #
890+
--echo # Bug#20160327 OPTIMIZE TABLE REMOVES THE DATA DIRECTORY IN PARTITIONS
891+
--echo #
892+
893+
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
894+
eval CREATE TABLE `t1` (
895+
`f1` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
896+
`f2` MEDIUMTEXT NOT NULL,
897+
`f3` CHAR(100) NOT NULL,
898+
`f4` TINYINT(1) unsigned NOT NULL,
899+
PRIMARY KEY (`f1`,`f4`)
900+
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1
901+
PARTITION BY LIST (`f4`)
902+
(PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
903+
PARTITION p1 VALUES IN (1) DATA DIRECTORY = '$MYSQL_TMP_DIR/temp_dir' ENGINE = InnoDB);
904+
905+
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
906+
SHOW CREATE TABLE t1;
907+
908+
OPTIMIZE TABLE t1;
909+
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
910+
SHOW CREATE TABLE t1;
911+
--list_files $MYSQL_TMP_DIR/temp_dir/test
912+
913+
ALTER TABLE t1 OPTIMIZE PARTITION p0;
914+
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
915+
SHOW CREATE TABLE t1;
916+
--list_files $MYSQL_TMP_DIR/temp_dir/test
917+
918+
ALTER TABLE t1 OPTIMIZE PARTITION p1;
919+
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
920+
SHOW CREATE TABLE t1;
921+
--list_files $MYSQL_TMP_DIR/temp_dir/test
922+
923+
ALTER TABLE t1 REBUILD PARTITION ALL;
924+
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
925+
SHOW CREATE TABLE t1;
926+
--list_files $MYSQL_TMP_DIR/temp_dir/test
927+
928+
ALTER TABLE t1 ADD extracol VARCHAR(32) NULL;
929+
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
930+
SHOW CREATE TABLE t1;
931+
--list_files $MYSQL_TMP_DIR/temp_dir/test
932+
933+
DROP TABLE t1;
934+
935+
--rmdir $MYSQL_TMP_DIR/temp_dir/test
936+
--rmdir $MYSQL_TMP_DIR/temp_dir

sql/ha_partition.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8180,6 +8180,7 @@ bool ha_partition::prepare_inplace_alter_table(TABLE *altered_table,
81808180
for (index= 0; index < m_tot_parts && !error; index++)
81818181
{
81828182
ha_alter_info->handler_ctx= part_inplace_ctx->handler_ctx_array[index];
8183+
m_file[index]->update_create_info(ha_alter_info->create_info);
81838184
if (m_file[index]->ha_prepare_inplace_alter_table(altered_table,
81848185
ha_alter_info))
81858186
error= true;

0 commit comments

Comments
 (0)