# # Verify that the DATA/INDEX DIR is stored and used if ALTER to MyISAM. # DROP TABLE IF EXISTS t1; SET SESSION innodb_strict_mode = ON; # # InnoDB only supports DATA DIRECTORY with innodb_file_per_table=ON # SET GLOBAL innodb_file_per_table = OFF; CREATE TABLE t1 (c1 INT) ENGINE = InnoDB PARTITION BY HASH (c1) ( PARTITION p0 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir', PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ); ERROR HY000: Table storage engine for 't1' doesn't have this option SHOW WARNINGS; Level Code Message Warning 1478 InnoDB: DATA DIRECTORY requires innodb_file_per_table. Warning 1478 InnoDB: INDEX DIRECTORY is not supported Error 1031 Table storage engine for 't1' doesn't have this option # # InnoDB is different from MyISAM in that instead of # putting the file directly into the DATA DIRECTORY, # it adds a folder under it with the name of the database. # Since strict mode is off, InnoDB ignores the INDEX DIRECTORY # and it is no longer part of the definition. # SET SESSION innodb_strict_mode = OFF; SET GLOBAL innodb_file_per_table = ON; CREATE TABLE t1 (c1 INT) ENGINE = InnoDB PARTITION BY HASH (c1) (PARTITION p0 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir', PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ); Warnings: Warning 1618 option ignored Warning 1618 option ignored SHOW WARNINGS; Level Code Message Warning 1618 option ignored Warning 1618 option ignored # Also create a partitioned table with DATA DIRECTORY clasue at # the table level. CREATE TABLE t2 (c1 int) ENGINE = InnoDB DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' PARTITION BY HASH (c1) (PARTITION p0, PARTITION p1 ); # Verifying .ibd files ---- MYSQLD_DATADIR/test ---- MYSQLTEST_VARDIR/mysql-test-data-dir/test t1#P#p0.ibd t1#P#p1.ibd t2#P#p0.ibd t2#P#p1.ibd # The ibd tablespaces should not be directly under the DATA DIRECTORY ---- MYSQLTEST_VARDIR/mysql-test-data-dir test ---- MYSQLTEST_VARDIR/mysql-test-idx-dir FLUSH TABLES; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!50100 PARTITION BY HASH (`c1`) (PARTITION p0 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir/' ENGINE = InnoDB, PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir/' ENGINE = InnoDB) */ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( `c1` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!50100 PARTITION BY HASH (`c1`) (PARTITION p0 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir/' ENGINE = InnoDB, PARTITION p1 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir/' ENGINE = InnoDB) */ # # Verify how the DATA/INDEX DIRECTORY is stored and used if we # ALTER TABLE to MyISAM. # ALTER TABLE t1 engine=MyISAM REMOVE PARTITIONING; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ALTER TABLE t2 engine=MyISAM REMOVE PARTITIONING; SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( `c1` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci # Verifying .par and MyISAM files (.MYD, MYI) ---- MYSQLD_DATADIR/test t1.MYD t1.MYI t1_XXX.sdi t2.MYD t2.MYI t2_XXX.sdi ---- MYSQLTEST_VARDIR/mysql-test-data-dir test ---- MYSQLTEST_VARDIR/mysql-test-idx-dir # # Now verify how the DATA DIRECTORY is used again if we # ALTER TABLE back to InnoDB. # SET SESSION innodb_strict_mode = ON; ALTER TABLE t1 engine=InnoDB; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ALTER TABLE t2 engine=InnoDB; SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( `c1` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci # Verifying InnoDB .ibd files ---- MYSQLD_DATADIR/test t1.ibd t2.ibd ---- MYSQLTEST_VARDIR/mysql-test-data-dir test ---- MYSQLTEST_VARDIR/mysql-test-idx-dir ---- MYSQLTEST_VARDIR/mysql-test-data-dir/test DROP TABLE t1; DROP TABLE t2; # Creating two non colliding tables test2.t1 and test.t1. CREATE DATABASE test2; USE test2; CREATE TABLE t1 (a INT) ENGINE = InnoDB DATA DIRECTORY 'MYSQLTEST_VARDIR/tmp' PARTITION BY LIST (a) ( PARTITION p0 VALUES IN (0), PARTITION p1 VALUES IN (1) ); INSERT INTO t1 VALUES (0); USE test; CREATE TABLE t1 (a INT) ENGINE = InnoDB DATA DIRECTORY 'MYSQLTEST_VARDIR/tmp' PARTITION BY LIST (a) ( PARTITION p0 VALUES IN (0), PARTITION p1 VALUES IN (1) ); INSERT INTO t1 VALUES (1); ALTER TABLE test.t1 ENGINE= MyISAM REMOVE PARTITIONING; # datadir/test: t1.MYD t1.MYI t1_XXX.sdi # datadir/test2: ALTER TABLE test2.t1 ENGINE= MyISAM REMOVE PARTITIONING; # datadir/test: t1.MYD t1.MYI t1_XXX.sdi # datadir/test2: t1.MYD t1.MYI t1_XXX.sdi FLUSH TABLES; SELECT * FROM test.t1; a 1 SELECT * FROM test2.t1; a 0 DROP TABLE test2.t1; DROP TABLE test.t1; DROP DATABASE test2; # # Cleanup #