397 lines
13 KiB
Plaintext
397 lines
13 KiB
Plaintext
#
|
|
# A series of tests to show the correct file-per-table tablespace behavior.
|
|
# See also; parts.partition_basic_symlink_innodb.test for
|
|
# partition related tests with remote tablespaces.
|
|
# See innodb.innodb-restart for tablespace migration tests.
|
|
#
|
|
SET default_storage_engine=InnoDB;
|
|
|
|
--echo #
|
|
--echo # TABLESPACE related tests.
|
|
--echo #
|
|
|
|
# Set up some variables
|
|
LET $MYSQLD_DATADIR = `select @@datadir`;
|
|
LET $INNODB_PAGE_SIZE = `select @@innodb_page_size`;
|
|
LET $data_directory_clause = DATA DIRECTORY='$MYSQL_TMP_DIR/alt_dir';
|
|
LET $index_directory_clause = INDEX DIRECTORY='$MYSQL_TMP_DIR/alt_dir';
|
|
|
|
--echo #
|
|
--echo # CREATE TABLE ... INDEX DIRECTORY
|
|
--echo # In non-strict mode INDEX DIRECTORY is ignored.
|
|
--echo # In strict mode INDEX DIRECTORY is rejected.
|
|
--echo #
|
|
SET SESSION innodb_strict_mode = OFF;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
eval CREATE TABLE t1 (a int KEY, b text) $index_directory_clause;
|
|
SHOW WARNINGS;
|
|
SHOW CREATE TABLE t1;
|
|
DROP TABLE t1;
|
|
|
|
SET SESSION innodb_strict_mode = ON;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
--error ER_ILLEGAL_HA
|
|
eval CREATE TABLE t1 (a int KEY, b text) $index_directory_clause;
|
|
SHOW WARNINGS;
|
|
|
|
--echo #
|
|
--echo # Innodb does not support DATA DIRECTORY without innodb_file_per_table=ON.
|
|
--echo # In non-strict mode DATA DIRECTORY is ignored.
|
|
--echo # In strict mode DATA DIRECTORY without innodb_file_per_table=ON is rejected.
|
|
--echo # TABLESPACE='innodb_file_per_table' overrides the innodb_file_per_table=OFF setting.
|
|
--echo #
|
|
SET GLOBAL innodb_file_per_table=OFF;
|
|
SET SESSION innodb_strict_mode = OFF;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
eval CREATE TABLE t1 (a int KEY, b text) $data_directory_clause;
|
|
SHOW WARNINGS;
|
|
SHOW CREATE TABLE t1;
|
|
DROP TABLE t1;
|
|
|
|
SET SESSION innodb_strict_mode = ON;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
--error ER_ILLEGAL_HA
|
|
eval CREATE TABLE t1 (a int KEY, b text) $data_directory_clause;
|
|
SHOW WARNINGS;
|
|
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
eval CREATE TABLE t1 (a int KEY, b text) TABLESPACE=`innodb_file_per_table` $data_directory_clause;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
SHOW CREATE TABLE t1;
|
|
DROP TABLE t1;
|
|
|
|
--echo # Now set innodb_file_per_table so that DATA DIRECTORY can be tested.
|
|
SET GLOBAL innodb_file_per_table=ON;
|
|
|
|
--echo #
|
|
--echo # Create the tablespace in MYSQL_TMP_DIR/alt_dir
|
|
--echo # InnoDB will create the sub-directories if needed.
|
|
--echo #
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
eval CREATE TABLE t1 (a int KEY, b text) $data_directory_clause;
|
|
SHOW WARNINGS;
|
|
INSERT INTO t1 VALUES (1, 'Create the tablespace');
|
|
SELECT * FROM t1;
|
|
|
|
--echo #
|
|
--echo # Check if link file exists in MYSQLD_DATADIR
|
|
--echo #
|
|
--echo ---- MYSQLD_DATADIR/test
|
|
--list_files $MYSQLD_DATADIR/test
|
|
--echo # Check if tablespace file exists where we specified in DATA DIRECTORY
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir/test
|
|
--list_files $MYSQL_TMP_DIR/alt_dir/test
|
|
|
|
--echo #
|
|
--echo # Check that DATA DIRECTORY shows up in the SHOW CREATE TABLE results.
|
|
--echo #
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
SHOW CREATE TABLE t1;
|
|
|
|
--echo # Show that the system tables have this tablespace in them correctly
|
|
--source suite/innodb/include/show_i_s_tables.inc
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
|
|
--echo #
|
|
--echo # Show that the system tables are updated on drop table
|
|
--echo #
|
|
DROP TABLE t1;
|
|
--source suite/innodb/include/show_i_s_tables.inc
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
|
|
--echo #
|
|
--echo # Create the same table a second time in the same place
|
|
--echo #
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
eval CREATE TABLE t1 (a int KEY, b text) $data_directory_clause;
|
|
|
|
INSERT INTO t1 VALUES
|
|
(2, 'Create the same table a second time in the same place');
|
|
SELECT * FROM t1;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
SHOW CREATE TABLE t1;
|
|
--source suite/innodb/include/show_i_s_tables.inc
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
--echo ---- MYSQLD_DATADIR/test
|
|
--list_files $MYSQLD_DATADIR/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir/test
|
|
--list_files $MYSQL_TMP_DIR/alt_dir/test
|
|
|
|
--echo #
|
|
--echo # Truncate the table, then insert and verify
|
|
--echo #
|
|
TRUNCATE TABLE t1;
|
|
INSERT INTO t1 VALUES (3, 'Truncate the table, then insert');
|
|
SELECT * FROM t1;
|
|
--source suite/innodb/include/show_i_s_tables.inc
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
--echo ---- MYSQLD_DATADIR/test
|
|
--list_files $MYSQLD_DATADIR/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir/test
|
|
--list_files $MYSQL_TMP_DIR/alt_dir/test
|
|
|
|
--echo #
|
|
--echo # Rename the table, then insert and verify
|
|
--echo #
|
|
RENAME TABLE t1 TO t2;
|
|
INSERT INTO t2 VALUES (4, 'Rename the table, then insert');
|
|
SELECT * FROM t2;
|
|
--source suite/innodb/include/show_i_s_tables.inc
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
--echo ---- MYSQLD_DATADIR/test
|
|
--list_files $MYSQLD_DATADIR/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir/test
|
|
--list_files $MYSQL_TMP_DIR/alt_dir/test
|
|
|
|
--echo #
|
|
--echo # CREATE TABLE LIKE does not retain DATA DIRECTORY automatically.
|
|
--echo #
|
|
CREATE TABLE t3 LIKE t2;
|
|
INSERT INTO t3 VALUES (5, 'CREATE TABLE LIKE');
|
|
SELECT * FROM t3;
|
|
--source suite/innodb/include/show_i_s_tables.inc
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
--echo ---- MYSQLD_DATADIR/test
|
|
--list_files $MYSQLD_DATADIR/test
|
|
|
|
--echo #
|
|
--echo # Now make sure the tables can be fully dropped.
|
|
--echo #
|
|
DROP TABLE t2, t3;
|
|
--source suite/innodb/include/show_i_s_tables.inc
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
--echo ---- MYSQLD_DATADIR/test
|
|
--list_files $MYSQLD_DATADIR/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir/test
|
|
--list_files $MYSQL_TMP_DIR/alt_dir/test
|
|
|
|
--echo #
|
|
--echo # Be sure SQL MODE 'NO_DIR_IN_CREATE' prevents the use of DATA DIRECTORY
|
|
--echo #
|
|
SET @org_mode=@@sql_mode;
|
|
SET @@sql_mode='NO_DIR_IN_CREATE';
|
|
SELECT @@sql_mode;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
eval CREATE TABLE t1 (a int, b text) $data_directory_clause;
|
|
SHOW WARNINGS;
|
|
INSERT INTO t1 VALUES (6, 'SQL MODE NO_DIR_IN_CREATE prevents DATA DIRECTORY');
|
|
# Checking if tablespace exists in --datadir since DATA DIRECTORY was ignored.
|
|
--file_exists $MYSQLD_DATADIR/test/t1.ibd
|
|
DROP TABLE t1;
|
|
set @@sql_mode=@org_mode;
|
|
|
|
--echo #
|
|
--echo # The server does not allow any DATA DIRECTORY name to be a relative path
|
|
--echo # or to be located in or under MYSQLD_DATADIR.
|
|
--echo #
|
|
--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
|
|
--error ER_WRONG_VALUE
|
|
eval CREATE TABLE t1 (a int KEY, b text) DATA DIRECTORY './';
|
|
SHOW WARNINGS;
|
|
|
|
--error ER_WRONG_VALUE
|
|
eval CREATE TABLE t1 (a int KEY, b text) DATA DIRECTORY '../';
|
|
SHOW WARNINGS;
|
|
|
|
--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
|
|
--error ER_WRONG_ARGUMENTS
|
|
eval CREATE TABLE t1 (a int KEY, b text) DATA DIRECTORY '$MYSQLD_DATADIR';
|
|
SHOW WARNINGS;
|
|
|
|
--mkdir $MYSQLD_DATADIR/under
|
|
--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR
|
|
--error ER_WRONG_ARGUMENTS
|
|
eval CREATE TABLE t1 (a int KEY, b text) DATA DIRECTORY '$MYSQLD_DATADIR/under';
|
|
SHOW WARNINGS;
|
|
--rmdir $MYSQLD_DATADIR/under
|
|
|
|
--echo #
|
|
--echo # TEMPORARY tables are incompatible with DATA DIRECTORY
|
|
--echo # In strict mode DATA DIRECTORY is rejected. In non-strict mode it
|
|
--echo # is ignored.
|
|
--echo #
|
|
SET SESSION innodb_strict_mode = OFF;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
eval CREATE TEMPORARY TABLE t1 (a int KEY, b text) engine=InnoDB $data_directory_clause;
|
|
SHOW WARNINGS;
|
|
SHOW CREATE TABLE t1;
|
|
DROP TABLE t1;
|
|
|
|
SET SESSION innodb_strict_mode = ON;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
--error ER_ILLEGAL_HA
|
|
eval CREATE TEMPORARY TABLE t1 (a int KEY, b text) engine=InnoDB $data_directory_clause;
|
|
SHOW WARNINGS;
|
|
|
|
--echo #
|
|
--echo # Create the remote table via static DDL statements in a stored procedure
|
|
--echo #
|
|
DELIMITER |;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
eval CREATE PROCEDURE static_proc() BEGIN CREATE TABLE t1 (a int KEY, b text) $data_directory_clause; END |
|
|
DELIMITER ;|
|
|
CALL static_proc;
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
INSERT INTO t1 VALUES (7, 'Create the remote table via static DDL statements');
|
|
SELECT * FROM t1;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
SHOW CREATE TABLE t1;
|
|
--echo ---- MYSQLD_DATADIR/test
|
|
--list_files $MYSQLD_DATADIR/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir/test
|
|
--list_files $MYSQL_TMP_DIR/alt_dir/test
|
|
DROP PROCEDURE static_proc;
|
|
DROP TABLE t1;
|
|
|
|
--echo #
|
|
--echo # Create the remote table via dynamic DDL statements in a stored procedure
|
|
--echo #
|
|
DELIMITER |;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
eval CREATE PROCEDURE dynamic_proc()
|
|
BEGIN
|
|
PREPARE stmt1 FROM
|
|
"CREATE TABLE t1 (a int KEY, b text) $data_directory_clause";
|
|
EXECUTE stmt1;
|
|
END |
|
|
DELIMITER ;|
|
|
CALL dynamic_proc;
|
|
INSERT INTO t1 VALUES (8, 'Create the remote table via dynamic DDL statements');
|
|
SELECT * FROM t1;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
SHOW CREATE TABLE t1;
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
--echo ---- MYSQLD_DATADIR/test
|
|
--list_files $MYSQLD_DATADIR/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir/test
|
|
--list_files $MYSQL_TMP_DIR/alt_dir/test
|
|
DROP PROCEDURE dynamic_proc;
|
|
DEALLOCATE PREPARE stmt1;
|
|
DROP TABLE t1;
|
|
|
|
--echo #
|
|
--echo # CREATE, DROP, ADD and TRUNCATE PARTITION with DATA DIRECTORY
|
|
--echo #
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
eval CREATE TABLE emp (
|
|
id INT NOT NULL,
|
|
store_name VARCHAR(30),
|
|
parts VARCHAR(30),
|
|
store_id INT
|
|
)
|
|
PARTITION BY LIST(store_id) (
|
|
PARTITION east VALUES IN (10,20,30)
|
|
DATA DIRECTORY = '$MYSQL_TMP_DIR/alt_dir_east',
|
|
PARTITION north VALUES IN (40,50,60)
|
|
DATA DIRECTORY = '$MYSQL_TMP_DIR/alt_dir_north',
|
|
PARTITION west VALUES IN (70,80,100)
|
|
DATA DIRECTORY = '$MYSQL_TMP_DIR/alt_dir_west'
|
|
);
|
|
|
|
INSERT INTO emp values(1,'Oracle','NUTT',10);
|
|
INSERT INTO emp values(2,'HUAWEI','BOLT',40);
|
|
INSERT INTO emp values(3,'IBM','NAIL',70);
|
|
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
SHOW CREATE TABLE emp;
|
|
SELECT * FROM emp;
|
|
# InnoDB always converts table names to lower case on Windows
|
|
--source suite/innodb/include/show_i_s_tables.inc
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
--echo ---- MYSQLD_DATADIR/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQLD_DATADIR/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir_east/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQL_TMP_DIR/alt_dir_east/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir_north/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQL_TMP_DIR/alt_dir_north/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir_west/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQL_TMP_DIR/alt_dir_west/test
|
|
|
|
--echo #
|
|
--echo # DROP one PARTITION.
|
|
--echo #
|
|
ALTER TABLE emp DROP PARTITION west;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
SHOW CREATE TABLE emp;
|
|
SELECT * FROM emp;
|
|
--source suite/innodb/include/show_i_s_tables.inc
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
--echo ---- MYSQLD_DATADIR/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQLD_DATADIR/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir_east/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQL_TMP_DIR/alt_dir_east/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir_north/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQL_TMP_DIR/alt_dir_north/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir_west/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQL_TMP_DIR/alt_dir_west/test
|
|
|
|
--echo #
|
|
--echo # ADD the PARTITION back.
|
|
--echo #
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
eval ALTER TABLE emp ADD PARTITION (
|
|
PARTITION west VALUES IN (70,80,100)
|
|
DATA DIRECTORY = '$MYSQL_TMP_DIR/alt_dir_west');
|
|
INSERT INTO emp VALUES(3,'IBM','NAIL',70);
|
|
SELECT * FROM emp;
|
|
--source suite/innodb/include/show_i_s_tables.inc
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
--echo ---- MYSQLD_DATADIR/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQLD_DATADIR/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir_east/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQL_TMP_DIR/alt_dir_east/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir_north/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQL_TMP_DIR/alt_dir_north/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir_west/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQL_TMP_DIR/alt_dir_west/test
|
|
|
|
--echo #
|
|
--echo # TRUNCATE one PARTITION.
|
|
--echo #
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
ALTER TABLE emp TRUNCATE PARTITION west;
|
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
|
SHOW CREATE TABLE emp;
|
|
INSERT INTO emp VALUES(3,'IBM','NAIL',70);
|
|
SELECT * FROM emp;
|
|
--source suite/innodb/include/show_i_s_tables.inc
|
|
--source suite/innodb/include/show_i_s_tablespaces.inc
|
|
--echo ---- MYSQLD_DATADIR/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQLD_DATADIR/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir_east/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQL_TMP_DIR/alt_dir_east/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir_north/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQL_TMP_DIR/alt_dir_north/test
|
|
--echo ---- MYSQL_TMP_DIR/alt_dir_west/test
|
|
--replace_regex /emp#P#/emp#p#/
|
|
--list_files $MYSQL_TMP_DIR/alt_dir_west/test
|
|
DROP TABLE emp;
|
|
|
|
--echo #
|
|
--echo # Cleanup
|
|
--echo #
|
|
|
|
--rmdir $MYSQL_TMP_DIR/alt_dir_east/test
|
|
--rmdir $MYSQL_TMP_DIR/alt_dir_east
|
|
--rmdir $MYSQL_TMP_DIR/alt_dir_north/test
|
|
--rmdir $MYSQL_TMP_DIR/alt_dir_north
|
|
--rmdir $MYSQL_TMP_DIR/alt_dir_west/test
|
|
--rmdir $MYSQL_TMP_DIR/alt_dir_west
|
|
--rmdir $MYSQL_TMP_DIR/alt_dir/test
|
|
--rmdir $MYSQL_TMP_DIR/alt_dir
|