| Bug #75112 | Optimize table removes the data directory in partitions | ||
|---|---|---|---|
| Submitted: | 5 Dec 2014 8:11 | Modified: | 26 Jan 2016 15:54 | 
| Reporter: | Nilnandan Joshi | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Partitions | Severity: | S2 (Serious) | 
| Version: | 5.6.21, 5.6.23, 5.7.6 | OS: | Any | 
| Assigned to: | CPU Architecture: | Any | |
   [5 Dec 2014 8:11]
   Nilnandan Joshi        
  
 
   [5 Dec 2014 10:46]
   MySQL Verification Team        
  Hello Nilnandan Joshi, Thank you for the report and test case. Thanks, Umesh
   [5 Dec 2014 10:46]
   MySQL Verification Team        
  // 5.6.23
Build
======
commit: df34098068ae4a07f245ad13a4819ca01bde71df
date: 2014-11-18 09:54:31 +0530
build-date: 2014-11-18 18:01:47 +0100
short: df34098
branch: mysql-5.6
MySQL source 5.6.23
mysql> show variables like '%version%';
+-------------------------+---------------------------------------------------------+
| Variable_name           | Value                                                   |
+-------------------------+---------------------------------------------------------+
| innodb_version          | 5.6.23                                                  |
| protocol_version        | 10                                                      |
| slave_type_conversions  |                                                         |
| version                 | 5.6.23-enterprise-commercial-advanced-log               |
| version_comment         | MySQL Enterprise Server - Advanced Edition (Commercial) |
| version_compile_machine | x86_64                                                  |
| version_compile_os      | Linux                                                   |
+-------------------------+---------------------------------------------------------+
7 rows in set (0.00 sec)
mysql>
mysql> CREATE TABLE `TEST` (
    ->   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   `a2` mediumtext NOT NULL,
    ->   `a3` char(100) NOT NULL,
    ->   `prt` tinyint(1) unsigned NOT NULL,
    ->   PRIMARY KEY (`id`,`prt`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED
    -> /*!50100 PARTITION BY LIST (`prt`)
    -> (PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
    ->  PARTITION p1 VALUES IN (1) DATA DIRECTORY = '/tmp' ENGINE = InnoDB) */;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> show create table TEST\G
*************************** 1. row ***************************
       Table: TEST
Create Table: CREATE TABLE `TEST` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a2` mediumtext NOT NULL,
  `a3` char(100) NOT NULL,
  `prt` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`id`,`prt`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED
/*!50100 PARTITION BY LIST (`prt`)
(PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
 PARTITION p1 VALUES IN (1) DATA DIRECTORY = '/tmp' ENGINE = InnoDB) */
1 row in set (0.00 sec)
mysql> \! ls -l /tmp/test
total 128
-rw-rw---- 1 umshastr common 98304 Dec  5 11:42 TEST#P#p1.ibd
mysql>
mysql> OPTIMIZE TABLE TEST;
+-----------+----------+----------+-------------------------------------------------------------------+
| Table     | Op       | Msg_type | Msg_text                                                          |
+-----------+----------+----------+-------------------------------------------------------------------+
| test.TEST | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.TEST | optimize | status   | OK                                                                |
+-----------+----------+----------+-------------------------------------------------------------------+
2 rows in set, 2 warnings (0.02 sec)
mysql> show create table TEST\G                                                                                                                                                                   *************************** 1. row ***************************
       Table: TEST
Create Table: CREATE TABLE `TEST` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a2` mediumtext NOT NULL,
  `a3` char(100) NOT NULL,
  `prt` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`id`,`prt`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED
/*!50100 PARTITION BY LIST (`prt`)
(PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
 PARTITION p1 VALUES IN (1) ENGINE = InnoDB) */
1 row in set (0.00 sec)
mysql>
mysql> \! ls -l /tmp/test
total 0
 
   [5 Dec 2014 10:52]
   MySQL Verification Team        
  // 5.7.6
// build used
commit: 1982dd7ab813e3cdb28d3bb119cc7b706cf01b15
date: 2014-11-27 13:27:39 +0300
build-date: 2014-11-27 12:38:45 +0100
short: 1982dd7
branch: mysql-trunk
MySQL source 5.7.6
mysql> show variables like '%version%';
+-------------------------+---------------------------------------------------------+
| Variable_name           | Value                                                   |
+-------------------------+---------------------------------------------------------+
| innodb_version          | 5.7.6                                                   |
| protocol_version        | 10                                                      |
| slave_type_conversions  |                                                         |
| version                 | 5.7.6-m16-enterprise-commercial-advanced                |
| version_comment         | MySQL Enterprise Server - Advanced Edition (Commercial) |
| version_compile_machine | x86_64                                                  |
| version_compile_os      | Linux                                                   |
+-------------------------+---------------------------------------------------------+
7 rows in set (0.00 sec)
mysql> CREATE TABLE `TEST` (
    ->   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   `a2` mediumtext NOT NULL,
    ->   `a3` char(100) NOT NULL,
    ->   `prt` tinyint(1) unsigned NOT NULL,
    ->   PRIMARY KEY (`id`,`prt`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED
    -> /*!50100 PARTITION BY LIST (`prt`)
    -> (PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
    ->  PARTITION p1 VALUES IN (1) DATA DIRECTORY = '/tmp' ENGINE = InnoDB) */;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> show create table TEST \G
*************************** 1. row ***************************
       Table: TEST
Create Table: CREATE TABLE `TEST` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a2` mediumtext NOT NULL,
  `a3` char(100) NOT NULL,
  `prt` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`id`,`prt`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED
/*!50100 PARTITION BY LIST (`prt`)
(PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
 PARTITION p1 VALUES IN (1) DATA DIRECTORY = '/tmp' ENGINE = InnoDB) */
1 row in set (0.00 sec)
mysql> \! ls -l /tmp/test
total 96
-rw-rw---- 1 umshastr common 98304 Dec  5 11:49 TEST#P#p1.ibd
mysql>
mysql> OPTIMIZE TABLE TEST;
+-----------+----------+----------+-------------------------------------------------------------------+
| Table     | Op       | Msg_type | Msg_text                                                          |
+-----------+----------+----------+-------------------------------------------------------------------+
| test.TEST | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.TEST | optimize | status   | OK                                                                |
+-----------+----------+----------+-------------------------------------------------------------------+
2 rows in set, 2 warnings (0.02 sec)
mysql>
mysql> show create table TEST \G
*************************** 1. row ***************************
       Table: TEST
Create Table: CREATE TABLE `TEST` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a2` mediumtext NOT NULL,
  `a3` char(100) NOT NULL,
  `prt` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`id`,`prt`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED
/*!50100 PARTITION BY LIST (`prt`)
(PARTITION p0 VALUES IN (0) ENGINE = InnoDB,
 PARTITION p1 VALUES IN (1) ENGINE = InnoDB) */
1 row in set (0.00 sec)
mysql> \! ls -l /tmp/test
total 0
mysql>
 
   [16 Jan 2015 13:27]
   Kenny Gryp        
  The same counts for every DDL you do that has to recreate the tablespace:
ip-10-36-36-72 mysql> 
CREATE TABLE partitionedtable
(
        ID int unsigned not null auto_increment,
        col varchar(32) null,
        timer datetime not null,
        PRIMARY KEY(ID,timer)
)
ENGINE=InnoDB
PARTITION BY RANGE(YEAR(timer)) (
        PARTITION p2014 VALUES LESS THAN (2015)
                DATA DIRECTORY = '/tmp/partdb/2014',
        PARTITION p2015 VALUES LESS THAN (2016)
                DATA DIRECTORY = '/tmp/partdb/2015',
        PARTITION p2020 VALUES LESS THAN MAXVALUE 
                DATA DIRECTORY = '/tmp/partdb/rest'
);
Query OK, 0 rows affected (0.07 sec)
ip-10-36-36-72 mysql> show create table partitionedtable\G
*************************** 1. row ***************************
       Table: partitionedtable
Create Table: CREATE TABLE `partitionedtable` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `col` varchar(32) DEFAULT NULL,
  `timer` datetime NOT NULL,
  PRIMARY KEY (`ID`,`timer`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (YEAR(timer))
(PARTITION p2014 VALUES LESS THAN (2015) DATA DIRECTORY = '/tmp/partdb/2014' ENGINE = InnoDB,
 PARTITION p2015 VALUES LESS THAN (2016) DATA DIRECTORY = '/tmp/partdb/2015' ENGINE = InnoDB,
 PARTITION p2020 VALUES LESS THAN MAXVALUE DATA DIRECTORY = '/tmp/partdb/rest' ENGINE = InnoDB) */
1 row in set (0.00 sec)
[root@ip-10-36-36-72 partdb]# find /tmp/partdb/
/tmp/partdb/
/tmp/partdb/2014
/tmp/partdb/2014/test
/tmp/partdb/2014/test/partitionedtable#P#p2014.ibd
/tmp/partdb/2015
/tmp/partdb/2015/test
/tmp/partdb/2015/test/partitionedtable#P#p2015.ibd
/tmp/partdb/rest
/tmp/partdb/rest/test
/tmp/partdb/rest/test/partitionedtable#P#p2020.ibd
ip-10-36-36-72 mysql> alter table partitionedtable add extracol varchar(32) null;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0
[root@ip-10-36-36-72 partdb]# find /tmp/partdb/
/tmp/partdb/
/tmp/partdb/2014
/tmp/partdb/2014/test
/tmp/partdb/2015
/tmp/partdb/2015/test
/tmp/partdb/rest
/tmp/partdb/rest/test
[root@ip-10-36-36-72 partdb]# ls -alhs /var/lib/mysql/test/
total 316K
4.0K drwx------. 2 mysql mysql 4.0K Jan 16 13:21 .
4.0K drwxr-xr-x. 6 mysql mysql 4.0K Jan 16 10:28 ..
4.0K -rw-rw----. 1 mysql mysql   65 Jan 16 10:05 db.opt
 96K -rw-rw----. 1 mysql mysql  96K Jan 16 13:21 partitionedtable#P#p2014.ibd
 96K -rw-rw----. 1 mysql mysql  96K Jan 16 13:21 partitionedtable#P#p2015.ibd
 96K -rw-rw----. 1 mysql mysql  96K Jan 16 13:21 partitionedtable#P#p2020.ibd
 12K -rw-rw----. 1 mysql mysql 8.5K Jan 16 13:21 partitionedtable.frm
4.0K -rw-rw----. 1 mysql mysql   40 Jan 16 13:21 partitionedtable.par
 
   [26 Jan 2016 15:54]
   Jon Stephens        
  Documented fix in the MySQL 5.6.30 as 5.7.11 changelogs as follows:
    When OPTIMIZE TABLE rebuilt a partitioned InnoDB table, it
    placed the resulting partition tablespace files (*.ibd files) in
    the default data directory instead of the directory specified
    using the DATA DIRECTORY option.
Closed.
 