# ******************************************************************** # wl#8619 : Testing the functionality of portability of general # and remote tablespace files can be moved into any of the following # listed known directories # 1) --datadir (mysql home) # 2) --innodb-directories= dir1;dir2;etc... # 3) --innodb-undo-directory # 4) --innodb-data-home-dir # Note : --datadir as whole unit should be moved and its # folder hierarchy should be preserved # User has to follow the MySQL rules while moving the files. # Check general tablespaces are allowed to create only in known DIR # Check relative path and absolute path # ******************************************************************** --source include/have_innodb_16k.inc --source include/have_innodb_default_undo_tablespaces.inc --source include/not_valgrind.inc --disable_query_log --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR LET $restart_parameters = restart:--innodb-directories=$MYSQL_TMP_DIR; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR --source include/restart_mysqld.inc --enable_query_log let $MYSQLD_OLD_DATADIR = `select @@datadir`; # Create new datadir folders --mkdir $MYSQL_TMP_DIR/undo_directory1 --mkdir $MYSQL_TMP_DIR/undo_directory2 --mkdir $MYSQL_TMP_DIR/undo_directory2/test --mkdir $MYSQL_TMP_DIR/data_home_dir --mkdir $MYSQL_TMP_DIR/new_datadir --mkdir $MYSQL_TMP_DIR/new_datadir/data let $MYSQLD_NEW_DATADIR = $MYSQL_TMP_DIR/new_datadir/data; --mkdir $MYSQLD_NEW_DATADIR/test --mkdir $MYSQLD_NEW_DATADIR/mysql --mkdir $MYSQLD_NEW_DATADIR/sys --mkdir $MYSQLD_NEW_DATADIR/performance_schema --mkdir $MYSQLD_NEW_DATADIR/mtr --echo ## create all kinds of tables including absolute paths CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd' Engine=InnoDB; CREATE TABLE tab1(c1 int, c2 varchar(10)) TABLESPACE=ts1; INSERT INTO tab1 VALUES(1, 'VISH'); CREATE TABLE tab2(c1 int, c2 varchar(10)) Engine=InnoDB; INSERT INTO tab2 VALUES(2, 'VISH'); CREATE INDEX ix1 ON tab1(c2) USING BTREE; CREATE INDEX ix1 ON tab2(c2) ; --echo # Create a table with absolute path. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR eval CREATE TABLE tab3( empno INT, ename VARCHAR(30),sal NUMERIC(3)) ENGINE=InnoDB ROW_FORMAT=COMPRESSED PARTITION by hash(empno) ( PARTITION P0 DATA DIRECTORY '$MYSQL_TMP_DIR/db_directory1', PARTITION P1 DATA DIRECTORY '$MYSQL_TMP_DIR/db_directory1'); --echo # Create a tablespace in a known location with absolute path. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR eval CREATE TABLESPACE ts2 ADD DATAFILE '$MYSQL_TMP_DIR/db_directory1/ts2.ibd' Engine=InnoDB; DROP TABLESPACE ts2; --echo # Create a tablespace in a known location with relative path. eval CREATE TABLESPACE ts2 ADD DATAFILE '../data/ts2.ibd' Engine=InnoDB; DROP TABLESPACE ts2; --echo # Try to create a tablespace in an unknown location. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR --error ER_WRONG_FILE_NAME eval CREATE TABLESPACE ts2 ADD DATAFILE '../ts2.ibd' Engine=InnoDB; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SHOW WARNINGS; CREATE INDEX ix1 ON tab3(ename) USING BTREE; INSERT INTO tab3 VALUES (100,'VISWANATH',100); INSERT INTO tab3 VALUES (300,'VISWANATH',100); SHOW CREATE TABLE tab1; SHOW CREATE TABLE tab2; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SHOW CREATE TABLE tab3; # Create new undo tablespaces CREATE UNDO TABLESPACE undo_003 ADD DATAFILE 'undo_003.ibu'; CREATE UNDO TABLESPACE undo_004 ADD DATAFILE 'undo_004.ibu'; # Show the metadata info. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SELECT file_name,file_type,tablespace_name FROM INFORMATION_SCHEMA.FILES WHERE file_type LIKE '%undo%'; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SELECT space,path FROM INFORMATION_SCHEMA.INNODB_DATAFILES WHERE path LIKE '%undo_0%' ORDER BY path; --echo ## Stop DB server --let $shutdown_server_timeout = 300 --source include/shutdown_mysqld.inc --echo # Copy whole --datadir files into new locations --copy_file $MYSQLD_OLD_DATADIR/auto.cnf $MYSQLD_NEW_DATADIR/auto.cnf --copy_file $MYSQLD_OLD_DATADIR/ib_buffer_pool $MYSQL_TMP_DIR/data_home_dir/ib_buffer_pool --copy_file $MYSQLD_OLD_DATADIR/ibdata1 $MYSQL_TMP_DIR/data_home_dir/ibdata1 --copy_files_wildcard $MYSQLD_OLD_DATADIR $MYSQL_TMP_DIR/data_home_dir ib_logfile* --copy_files_wildcard $MYSQLD_OLD_DATADIR $MYSQLD_NEW_DATADIR *.ibd --copy_file $MYSQLD_OLD_DATADIR/undo_001 $MYSQL_TMP_DIR/undo_directory1/undo_001 --remove_file $MYSQLD_OLD_DATADIR/undo_002 --copy_file $MYSQLD_OLD_DATADIR/undo_003.ibu $MYSQL_TMP_DIR/undo_directory1/undo_003.ibu --copy_file $MYSQLD_OLD_DATADIR/undo_004.ibu $MYSQL_TMP_DIR/undo_directory2/undo_004.ibu --copy_files_wildcard $MYSQLD_OLD_DATADIR/test/ $MYSQLD_NEW_DATADIR/test/ * --copy_files_wildcard $MYSQLD_OLD_DATADIR/sys/ $MYSQLD_NEW_DATADIR/sys/ * --copy_files_wildcard $MYSQLD_OLD_DATADIR/performance_schema/ $MYSQLD_NEW_DATADIR/performance_schema/ * --copy_files_wildcard $MYSQLD_OLD_DATADIR/mysql/ $MYSQLD_NEW_DATADIR/mysql/ * --copy_files_wildcard $MYSQLD_OLD_DATADIR/mtr/ $MYSQLD_NEW_DATADIR/mtr/ * --echo # Copy absolute path *.ibd files into new location --copy_files_wildcard $MYSQL_TMP_DIR/db_directory1/test/ $MYSQL_TMP_DIR/undo_directory2/test tab3*.ibd --echo # Remove the old datadir files and *.ibd files --remove_files_wildcard $MYSQL_TMP_DIR/db_directory1/test/ *.ibd --remove_files_wildcard $MYSQLD_OLD_DATADIR/ ib_buffer* --remove_files_wildcard $MYSQLD_OLD_DATADIR/ ib_log* --remove_files_wildcard $MYSQLD_OLD_DATADIR/ ibdata* --remove_files_wildcard $MYSQLD_OLD_DATADIR/ undo* --remove_files_wildcard $MYSQLD_OLD_DATADIR/ auto* --remove_files_wildcard $MYSQLD_OLD_DATADIR/ *.ibd --remove_files_wildcard $MYSQLD_OLD_DATADIR/test/ * --remove_files_wildcard $MYSQLD_OLD_DATADIR/sys/ * --remove_files_wildcard $MYSQLD_OLD_DATADIR/performance_schema/ * --remove_files_wildcard $MYSQLD_OLD_DATADIR/mysql/ * --remove_files_wildcard $MYSQLD_OLD_DATADIR/mtr/ * --echo # Start with --innodb-directories along with other initDB options --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR --let $restart_parameters=restart: --datadir=$MYSQLD_NEW_DATADIR --innodb_undo_directory=$MYSQL_TMP_DIR/undo_directory1 --innodb_data_home_dir=$MYSQL_TMP_DIR/data_home_dir --innodb_log_group_home_dir=$MYSQL_TMP_DIR/data_home_dir --innodb-directories=$MYSQL_TMP_DIR --source include/start_mysqld_no_echo.inc --echo # Check new datadir --replace_result $MYSQLD_NEW_DATADIR NEW_DATADIR SELECT @@datadir; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SELECT @@innodb_undo_directory; --replace_result $MYSQL_TMP_DIR DATA_HOME_DIR SELECT @@innodb_data_home_dir; --replace_result $MYSQL_TMP_DIR DATA_HOME_DIR SELECT @@innodb_log_group_home_dir; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SHOW CREATE TABLE tab3; # Check if the metadata info is correct. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SELECT file_name,file_type,tablespace_name FROM INFORMATION_SCHEMA.FILES WHERE file_type LIKE '%undo%'; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SELECT space,path FROM INFORMATION_SCHEMA.INNODB_DATAFILES WHERE path LIKE '%undo_0%' ORDER BY path; --echo # Stop DB server --let $shutdown_server_timeout = 300 --source include/shutdown_mysqld.inc --echo # Start with new --datadir only --replace_result $MYSQLD_NEW_DATADIR NEW_DATADIR $MYSQL_TMP_DIR MYSQL_TMP_DIR --let $restart_parameters=restart: --datadir=$MYSQLD_NEW_DATADIR --innodb_undo_directory=$MYSQL_TMP_DIR/undo_directory1 --innodb_data_home_dir=$MYSQL_TMP_DIR/data_home_dir --innodb_log_group_home_dir=$MYSQL_TMP_DIR/data_home_dir --innodb-directories=$MYSQL_TMP_DIR --source include/start_mysqld.inc --echo # Check with new --datadir --replace_result $MYSQLD_NEW_DATADIR NEW_DATADIR SELECT @@datadir; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SELECT @@innodb_undo_directory; --replace_result $MYSQL_TMP_DIR DATA_HOME_DIR SELECT @@innodb_data_home_dir; --replace_result $MYSQL_TMP_DIR DATA_HOME_DIR SELECT @@innodb_log_group_home_dir; --echo # Check the tables with SHOW SHOW CREATE TABLE tab1; SHOW CREATE TABLE tab2; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SHOW CREATE TABLE tab3; # Check if the metadata info is correct. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SELECT file_name,file_type,tablespace_name FROM INFORMATION_SCHEMA.FILES WHERE file_type LIKE '%undo%'; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SELECT space,path FROM INFORMATION_SCHEMA.INNODB_DATAFILES WHERE path LIKE '%undo_0%' ORDER BY path; ALTER UNDO TABLESPACE innodb_undo_001 SET INACTIVE; ALTER UNDO TABLESPACE innodb_undo_002 SET INACTIVE; --echo # Check with DML & DDL operations SELECT * FROM tab1; SELECT * FROM tab2; SELECT * FROM tab3; DELETE FROM tab1; DELETE FROM tab2; DELETE FROM tab3; ALTER TABLE tab3 ADD COLUMN c3 VARCHAR(15); INSERT INTO tab1 VALUES(1, 'VISH'); INSERT INTO tab2 VALUES(2, 'VISH'); INSERT INTO tab3 VALUES (100,'VISWANATH',100,'New Column'); INSERT INTO tab3 VALUES (300,'VISWANATH',100,'New Column'); SELECT * FROM tab1; SELECT * FROM tab2; SELECT * FROM tab3; let $inactive_undo_space = innodb_undo_001; source include/wait_until_undo_space_is_empty.inc; let $inactive_undo_space = innodb_undo_002; source include/wait_until_undo_space_is_empty.inc; SELECT name,space_type,state FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE space_type = 'Undo'; ALTER UNDO TABLESPACE innodb_undo_001 SET ACTIVE; ALTER UNDO TABLESPACE innodb_undo_002 SET ACTIVE; SELECT name,space_type,state FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE space_type = 'Undo'; --echo # Creating general tablespace in known DIR location --replace_result $MYSQL_TMP_DIR DATA_HOME_DIR eval CREATE TABLESPACE ts2 ADD DATAFILE '$MYSQL_TMP_DIR/data_home_dir/ts2.ibd' Engine=InnoDB; CREATE TABLE tab4(c1 int, c2 varchar(10)) TABLESPACE=ts2; SHOW CREATE TABLE tab4; INSERT INTO tab4 VALUES(1, 'VISH'); --echo # Creating general tablespace in known DIR location --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR eval CREATE TABLESPACE ts3 ADD DATAFILE '$MYSQL_TMP_DIR/undo_directory1/ts3.ibd' Engine=InnoDB; CREATE TABLE tab5(c1 int, c2 varchar(10)) TABLESPACE=ts3; SHOW CREATE TABLE tab5; INSERT INTO tab5 VALUES(1, 'VISH'); --echo # Clean up new datadir DROP TABLE tab1; DROP TABLE tab2; DROP TABLESPACE ts1; --echo # Stop DB server with new datadir --let $shutdown_server_timeout = 300 --source include/shutdown_mysqld.inc --echo # Copy back --datadir and *.ibd files into old location --copy_files_wildcard $MYSQL_TMP_DIR/undo_directory2/test $MYSQL_TMP_DIR/db_directory1/test *.ibd --copy_files_wildcard $MYSQL_TMP_DIR/undo_directory1 $MYSQL_TMP_DIR/db_directory1/test ts3.ibd --copy_files_wildcard $MYSQL_TMP_DIR/undo_directory1 $MYSQLD_OLD_DATADIR undo* --copy_files_wildcard $MYSQL_TMP_DIR/undo_directory2 $MYSQLD_OLD_DATADIR undo* --copy_files_wildcard $MYSQL_TMP_DIR/data_home_dir $MYSQL_TMP_DIR/db_directory1/test ts2.ibd --copy_file $MYSQLD_NEW_DATADIR/auto.cnf $MYSQLD_OLD_DATADIR/auto.cnf --copy_file $MYSQL_TMP_DIR/data_home_dir/ib_buffer_pool $MYSQLD_OLD_DATADIR/ib_buffer_pool --copy_file $MYSQL_TMP_DIR/data_home_dir/ibdata1 $MYSQLD_OLD_DATADIR/ibdata1 --copy_files_wildcard $MYSQL_TMP_DIR/data_home_dir $MYSQLD_OLD_DATADIR/ ib_log* --copy_files_wildcard $MYSQLD_NEW_DATADIR $MYSQLD_OLD_DATADIR *.ibd --copy_files_wildcard $MYSQLD_NEW_DATADIR/sys/ $MYSQLD_OLD_DATADIR/sys/ * --copy_files_wildcard $MYSQLD_NEW_DATADIR/performance_schema/ $MYSQLD_OLD_DATADIR/performance_schema/ * --copy_files_wildcard $MYSQLD_NEW_DATADIR/mysql/ $MYSQLD_OLD_DATADIR/mysql/ * --copy_files_wildcard $MYSQLD_NEW_DATADIR/mtr/ $MYSQLD_OLD_DATADIR/mtr/ * --echo # Cleanup the new DATA DIRECTORY *.ibd files --force-rmdir $MYSQL_TMP_DIR/undo_directory1 --force-rmdir $MYSQL_TMP_DIR/undo_directory2 --force-rmdir $MYSQL_TMP_DIR/data_home_dir --force-rmdir $MYSQL_TMP_DIR/new_datadir --echo # Test by providing the relative path --echo # Re-start with old --datadir with --innodb-directories as remote *.ibd files are existing. --replace_result $MYSQLD_OLD_DATADIR OLD_DATADIR $MYSQL_TMP_DIR MYSQL_TMP_DIR --let $restart_parameters= restart: --datadir=$MYSQLD_OLD_DATADIR --innodb-directories=$MYSQL_TMP_DIR --source include/start_mysqld.inc --echo # Check --datadir started with old --replace_result $MYSQLD_OLD_DATADIR OLD_DATADIR SELECT @@datadir; # Check if the metadata info is correct. SELECT file_name,file_type,tablespace_name FROM INFORMATION_SCHEMA.FILES WHERE file_type LIKE '%undo%'; SELECT space,path FROM INFORMATION_SCHEMA.INNODB_DATAFILES WHERE path LIKE '%undo_0%' ORDER BY path; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SHOW CREATE TABLE tab3; SHOW CREATE TABLE tab4; SHOW CREATE TABLE tab5; # Set implicit undo tablespaces inactive ALTER UNDO TABLESPACE undo_003 SET INACTIVE; let $inactive_undo_space = undo_003; source include/wait_until_undo_space_is_empty.inc; ALTER UNDO TABLESPACE undo_004 SET INACTIVE; let $inactive_undo_space = undo_004; source include/wait_until_undo_space_is_empty.inc; SELECT name,space_type,state FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE space_type = 'Undo'; --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR SHOW VARIABLES LIKE '%directories%'; --echo # Creating general tablespace in known DIR location (DATA DIRECTORY) --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR eval CREATE TABLESPACE ts4 ADD DATAFILE '$MYSQL_TMP_DIR/db_directory1/ts4.ibd' Engine=InnoDB; CREATE TABLE tab6(c1 int, c2 varchar(10)) TABLESPACE=ts4; INSERT INTO tab6 VALUES(1, 'VISH'); --echo # Stop DB server --let $shutdown_server_timeout = 300 --source include/shutdown_mysqld.inc --echo # Re-start with old --datadir only --replace_result $MYSQLD_OLD_DATADIR OLD_DATADIR --let $restart_parameters="restart: --datadir=$MYSQLD_OLD_DATADIR" --source include/start_mysqld.inc # Check DML DELETE FROM tab3; DELETE FROM tab4; DELETE FROM tab5; DELETE FROM tab6; --replace_column 1 # SELECT TABLESPACE_NAME,TABLE_NAME,ENGINE FROM INFORMATION_SCHEMA.FILES; # Clean up old datadir DROP TABLE tab3; DROP TABLE tab4; DROP TABLE tab5; DROP TABLE tab6; DROP UNDO TABLESPACE undo_003; DROP UNDO TABLESPACE undo_004;