From: kevin.lewis Date: June 29 2012 6:28am Subject: bzr push into mysql-trunk branch (kevin.lewis:3918 to 3919) List-Archive: http://lists.mysql.com/commits/144346 Message-Id: <20120629062800.CF72A23B5BE0@kevin-lewis-macbook.local> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3919 kevin.lewis@stripped 2012-06-29 [merge] Merge from mysql-5.6 modified: mysql-test/suite/innodb/r/innodb-multiple-tablespaces.result mysql-test/suite/innodb/r/innodb-wl5980-discard.result mysql-test/suite/innodb/t/innodb-multiple-tablespaces.test mysql-test/suite/innodb/t/innodb-wl5980-discard.test storage/innobase/dict/dict0load.cc storage/innobase/fil/fil0fil.cc storage/innobase/handler/ha_innodb.cc storage/innobase/row/row0merge.cc storage/innobase/row/row0mysql.cc 3918 Yasufumi Kinoshita 2012-06-29 [merge] Bug#14106082 : INNODB.INNODB_BUFFER_POOL_LOAD HANGS AT SHUTDOWN rb#1115 approved by Inaam Bug#14251529 : FIX FOR BUG 13704145 CREATES POSSIBLE RACE CONDITION make buf_read_page_low() to treat DB_TABLESPACE_DELETED error correctly rb#1129 approved by Inaam modified: storage/innobase/buf/buf0buf.cc storage/innobase/buf/buf0lru.cc storage/innobase/buf/buf0rea.cc storage/innobase/include/buf0buf.h === modified file 'mysql-test/suite/innodb/r/innodb-multiple-tablespaces.result' --- a/mysql-test/suite/innodb/r/innodb-multiple-tablespaces.result revid:yasufumi.kinoshita@stripped +++ b/mysql-test/suite/innodb/r/innodb-multiple-tablespaces.result revid:kevin.lewis@stripped @@ -349,7 +349,6 @@ wny.ibd www.ibd wyn.ibd yny.ibd -ywn.isl yyn.ibd yyy.ibd ---- MYSQL_TMP_DIR/alt_dir/test @@ -367,7 +366,7 @@ ynw.ibd yny.ibd yyy.ibd # -# List of files after removing unused files +# List of files after removing leftover files # ---- MYSQLD_DATADIR/test ---- MYSQL_TMP_DIR/alt_dir/test @@ -655,8 +654,6 @@ DROP TABLE wy; # List of files after DROP TABLES # ---- MYSQLD_DATADIR/test -yn.isl -yw.isl ---- MYSQL_TMP_DIR/alt_dir/test aa.ibd.bak # === modified file 'mysql-test/suite/innodb/r/innodb-wl5980-discard.result' --- a/mysql-test/suite/innodb/r/innodb-wl5980-discard.result revid:yasufumi.kinoshita@stripped +++ b/mysql-test/suite/innodb/r/innodb-wl5980-discard.result revid:kevin.lewis@stripped @@ -119,7 +119,6 @@ SELECT * FROM t5980; ERROR HY000: Tablespace has been discarded for table 't5980' ### files in MYSQL_DATA_DIR/test t5980.frm -t5980.isl ### files in MYSQL_TMP_DIR/alt_dir/test t5980.cfg.bak t5980.cfg.bak2 @@ -310,7 +309,6 @@ SELECT * FROM t5980; ERROR HY000: Tablespace has been discarded for table 't5980' ### files in MYSQL_DATA_DIR/test t5980.frm -t5980.isl ### files in MYSQL_TMP_DIR/alt_dir/test t5980.cfg.bak t5980.cfg.bak2 @@ -321,7 +319,6 @@ t5980.ibd.bak2 # ### files in MYSQL_DATA_DIR/test t5980.frm -t5980.isl ### files in MYSQL_TMP_DIR/alt_dir/test t5980.cfg t5980.cfg.bak @@ -361,7 +358,6 @@ SELECT * FROM t5980; ERROR HY000: Tablespace has been discarded for table 't5980' ### files in MYSQL_DATA_DIR/test t5980.frm -t5980.isl ### files in MYSQL_TMP_DIR/alt_dir/test t5980.cfg.bak t5980.cfg.bak2 @@ -463,9 +459,450 @@ SELECT path FROM information_schema.inno WHERE path LIKE '%test%' ORDER BY space; path MYSQL_TMP_DIR/alt_dir/test/t5980.ibd +DROP TABLE t5980; # -# Cleanup +# Create a local and remote tablespaces, discard two and make +# the other two missing upon restart, and try some DDL and DML +# on these discarded and missing tablespaces. # -DROP TABLE t5980; +SET GLOBAL innodb_file_per_table=ON; +CREATE TABLE t5980a (a int, b text) engine=InnoDB; +CREATE TABLE t5980b (a int, b text) engine=InnoDB DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir'; +CREATE TABLE t5980c (a int, b text) engine=InnoDB; +CREATE TABLE t5980d (a int, b text) engine=InnoDB DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir'; +INSERT INTO t5980a VALUES (1, "Default location, discarded."); +INSERT INTO t5980b VALUES (1, "Remote location, discarded"); +INSERT INTO t5980c VALUES (1, "Default location, missing"); +INSERT INTO t5980d VALUES (1, "Remote location, missing"); +SELECT * FROM t5980a; +a b +1 Default location, discarded. +SELECT * FROM t5980b; +a b +1 Remote location, discarded +SELECT * FROM t5980c; +a b +1 Default location, missing +SELECT * FROM t5980d; +a b +1 Remote location, missing +SHOW CREATE TABLE t5980a; +Table Create Table +t5980a CREATE TABLE `t5980a` ( + `a` int(11) DEFAULT NULL, + `b` text +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t5980b; +Table Create Table +t5980b CREATE TABLE `t5980b` ( + `a` int(11) DEFAULT NULL, + `b` text +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +SHOW CREATE TABLE t5980c; +Table Create Table +t5980c CREATE TABLE `t5980c` ( + `a` int(11) DEFAULT NULL, + `b` text +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t5980d; +Table Create Table +t5980d CREATE TABLE `t5980d` ( + `a` int(11) DEFAULT NULL, + `b` text +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +SELECT name,n_cols,file_format,row_format FROM information_schema.innodb_sys_tables +WHERE name LIKE 'test%' ORDER BY name; +name n_cols file_format row_format +test/t5980a 5 Antelope Compact +test/t5980b 5 Antelope Compact +test/t5980c 5 Antelope Compact +test/t5980d 5 Antelope Compact +SELECT name,file_format,row_format FROM information_schema.innodb_sys_tablespaces +WHERE name LIKE 'test%' ORDER BY space; +name file_format row_format +test/t5980a Antelope Compact or Redundant +test/t5980b Antelope Compact or Redundant +test/t5980c Antelope Compact or Redundant +test/t5980d Antelope Compact or Redundant +SELECT path FROM information_schema.innodb_sys_datafiles +WHERE path LIKE '%test%' ORDER BY space; +path +MYSQL_DATA_DIR/test/t5980a.ibd +MYSQL_TMP_DIR/alt_dir/test/t5980b.ibd +MYSQL_DATA_DIR/test/t5980c.ibd +MYSQL_TMP_DIR/alt_dir/test/t5980d.ibd +### files in MYSQL_DATA_DIR/test +t5980a.frm +t5980a.ibd +t5980b.frm +t5980b.isl +t5980c.frm +t5980c.ibd +t5980d.frm +t5980d.isl +### files in MYSQL_TMP_DIR/alt_dir/test +t5980b.ibd +t5980d.ibd +# +# Shutdown the server, remove two tablespaces, restart server. +# +FLUSH TABLES t5980a, t5980b FOR EXPORT; +UNLOCK TABLES; +ALTER TABLE t5980a DISCARD TABLESPACE; +ALTER TABLE t5980b DISCARD TABLESPACE; +### files in MYSQL_DATA_DIR/test +t5980a.frm +t5980b.frm +t5980c.frm +t5980d.frm +### files in MYSQL_TMP_DIR/alt_dir/test +SELECT * FROM t5980a; +ERROR HY000: Tablespace has been discarded for table 't5980a' +SELECT * FROM t5980b; +ERROR HY000: Tablespace has been discarded for table 't5980b' +SELECT * FROM t5980c; +ERROR 42S02: Table 'test.t5980c' doesn't exist +SELECT * FROM t5980d; +ERROR 42S02: Table 'test.t5980d' doesn't exist +SHOW CREATE TABLE t5980a; +Table Create Table +t5980a CREATE TABLE `t5980a` ( + `a` int(11) DEFAULT NULL, + `b` text +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t5980b; +Table Create Table +t5980b CREATE TABLE `t5980b` ( + `a` int(11) DEFAULT NULL, + `b` text +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +SHOW CREATE TABLE t5980c; +ERROR 42S02: Table 'test.t5980c' doesn't exist +SHOW CREATE TABLE t5980d; +ERROR 42S02: Table 'test.t5980d' doesn't exist +SELECT name,n_cols,file_format,row_format FROM information_schema.innodb_sys_tables +WHERE name LIKE 'test%' ORDER BY name; +name n_cols file_format row_format +test/t5980a 5 Antelope Compact +test/t5980b 5 Antelope Compact +test/t5980c 5 Antelope Compact +test/t5980d 5 Antelope Compact +SELECT name,file_format,row_format FROM information_schema.innodb_sys_tablespaces +WHERE name LIKE 'test%' ORDER BY space; +name file_format row_format +test/t5980a Antelope Compact or Redundant +test/t5980b Antelope Compact or Redundant +test/t5980c Antelope Compact or Redundant +test/t5980d Antelope Compact or Redundant +SELECT path FROM information_schema.innodb_sys_datafiles +WHERE path LIKE '%test%' ORDER BY space; +path +MYSQL_DATA_DIR/test/t5980a.ibd +MYSQL_TMP_DIR/alt_dir/test/t5980b.ibd +MYSQL_DATA_DIR/test/t5980c.ibd +MYSQL_TMP_DIR/alt_dir/test/t5980d.ibd +### files in MYSQL_DATA_DIR/test +t5980a.frm +t5980b.frm +t5980c.frm +t5980d.frm +### files in MYSQL_TMP_DIR/alt_dir/test +# +# Discarded and missing tablespaces cannot be TRUNCATED +# +TRUNCATE TABLE t5980a; +ERROR HY000: Tablespace has been discarded for table 't5980a' +TRUNCATE TABLE t5980b; +ERROR HY000: Tablespace has been discarded for table 't5980b' +TRUNCATE TABLE t5980c; +ERROR 42S02: Table 'test.t5980c' doesn't exist +TRUNCATE TABLE t5980d; +ERROR 42S02: Table 'test.t5980d' doesn't exist +# +# Discarded tablespaces can be RENAMED but they remain discarded +# +RENAME TABLE t5980a TO t5980aa; +RENAME TABLE t5980b TO t5980bb; +# +# Missing tablespaces cannot be RENAMED +# +RENAME TABLE t5980c TO t5980cc; +ERROR HY000: Error on rename of './test/t5980c' to './test/t5980cc' (errno: 155 - The table does not exist in engine) +RENAME TABLE t5980d TO t5980dd; +ERROR HY000: Error on rename of './test/t5980d' to './test/t5980dd' (errno: 155 - The table does not exist in engine) +SELECT * FROM t5980a; +ERROR 42S02: Table 'test.t5980a' doesn't exist +SELECT * FROM t5980b; +ERROR 42S02: Table 'test.t5980b' doesn't exist +SELECT * FROM t5980aa; +ERROR HY000: Tablespace has been discarded for table 't5980aa' +SELECT * FROM t5980bb; +ERROR HY000: Tablespace has been discarded for table 't5980bb' +SELECT * FROM t5980c; +ERROR 42S02: Table 'test.t5980c' doesn't exist +SELECT * FROM t5980d; +ERROR 42S02: Table 'test.t5980d' doesn't exist +SHOW CREATE TABLE t5980aa; +Table Create Table +t5980aa CREATE TABLE `t5980aa` ( + `a` int(11) DEFAULT NULL, + `b` text +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t5980bb; +Table Create Table +t5980bb CREATE TABLE `t5980bb` ( + `a` int(11) DEFAULT NULL, + `b` text +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +SHOW CREATE TABLE t5980c; +ERROR 42S02: Table 'test.t5980c' doesn't exist +SHOW CREATE TABLE t5980d; +ERROR 42S02: Table 'test.t5980d' doesn't exist +SELECT name,n_cols,file_format,row_format FROM information_schema.innodb_sys_tables +WHERE name LIKE 'test%' ORDER BY name; +name n_cols file_format row_format +test/t5980aa 5 Antelope Compact +test/t5980bb 5 Antelope Compact +test/t5980c 5 Antelope Compact +test/t5980d 5 Antelope Compact +SELECT name,file_format,row_format FROM information_schema.innodb_sys_tablespaces +WHERE name LIKE 'test%' ORDER BY space; +name file_format row_format +test/t5980a Antelope Compact or Redundant +test/t5980b Antelope Compact or Redundant +test/t5980c Antelope Compact or Redundant +test/t5980d Antelope Compact or Redundant +SELECT path FROM information_schema.innodb_sys_datafiles +WHERE path LIKE '%test%' ORDER BY space; +path +MYSQL_DATA_DIR/test/t5980a.ibd +MYSQL_TMP_DIR/alt_dir/test/t5980b.ibd +MYSQL_DATA_DIR/test/t5980c.ibd +MYSQL_TMP_DIR/alt_dir/test/t5980d.ibd +# +# Discarded tablespaces cannot be ALTERED with ALGORITHM=COPY. +# +ALTER TABLE t5980aa ADD PRIMARY KEY(a), ALGORITHM=COPY; +ERROR HY000: Tablespace has been discarded for table 't5980aa' +ALTER TABLE t5980bb ADD PRIMARY KEY(a), ALGORITHM=COPY; +ERROR HY000: Tablespace has been discarded for table 't5980bb' +# +# Discarded tablespaces can be ALTERED with ALGORITHM=INPLACE. +# +ALTER TABLE t5980aa ADD PRIMARY KEY(a), ALGORITHM=INPLACE; +ALTER TABLE t5980bb ADD PRIMARY KEY(a), ALGORITHM=INPLACE; +### files in MYSQL_DATA_DIR/test +t5980aa.frm +t5980aa.ibd +t5980bb.frm +t5980bb.isl +t5980c.frm +t5980d.frm +### files in MYSQL_TMP_DIR/alt_dir/test +t5980bb.ibd +# +# Missing tablespaces cannot be ALTERED. +# +ALTER TABLE t5980c ADD PRIMARY KEY(a); +ERROR 42S02: Table 'test.t5980c' doesn't exist +ALTER TABLE t5980d ADD PRIMARY KEY(a); +ERROR 42S02: Table 'test.t5980d' doesn't exist +SELECT * FROM t5980aa; +a b +SELECT * FROM t5980bb; +a b +SHOW CREATE TABLE t5980aa; +Table Create Table +t5980aa CREATE TABLE `t5980aa` ( + `a` int(11) NOT NULL DEFAULT '0', + `b` text, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t5980bb; +Table Create Table +t5980bb CREATE TABLE `t5980bb` ( + `a` int(11) NOT NULL DEFAULT '0', + `b` text, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +SELECT name,n_cols,file_format,row_format FROM information_schema.innodb_sys_tables +WHERE name LIKE 'test%' ORDER BY name; +name n_cols file_format row_format +test/t5980aa 5 Antelope Compact +test/t5980bb 5 Antelope Compact +test/t5980c 5 Antelope Compact +test/t5980d 5 Antelope Compact +SELECT name,file_format,row_format FROM information_schema.innodb_sys_tablespaces +WHERE name LIKE 'test%' ORDER BY space; +name file_format row_format +test/t5980c Antelope Compact or Redundant +test/t5980d Antelope Compact or Redundant +test/t5980aa Antelope Compact or Redundant +test/t5980bb Antelope Compact or Redundant +SELECT path FROM information_schema.innodb_sys_datafiles +WHERE path LIKE '%test%' ORDER BY space; +path +MYSQL_DATA_DIR/test/t5980c.ibd +MYSQL_TMP_DIR/alt_dir/test/t5980d.ibd +MYSQL_DATA_DIR/test/t5980aa.ibd +MYSQL_TMP_DIR/alt_dir/test/t5980bb.ibd +### files in MYSQL_DATA_DIR/test +t5980aa.frm +t5980aa.ibd +t5980bb.frm +t5980bb.isl +t5980c.frm +t5980d.frm +### files in MYSQL_TMP_DIR/alt_dir/test +t5980bb.ibd +# +# Discarded tablespaces that were ALTERED IN_PLACE are no longer discarded. +# +INSERT INTO t5980aa VALUES (1, "Inserted into Discarded Local tablespace after ALTER ADD PRIMARY KEY, ALGORITHM=INPLACE"); +INSERT INTO t5980bb VALUES (1, "Inserted into Discarded Local tablespace after ALTER ADD PRIMARY KEY, ALGORITHM=INPLACE"); +SELECT * FROM t5980aa; +a b +1 Inserted into Discarded Local tablespace after ALTER ADD PRIMARY KEY, ALGORITHM=INPLACE +SELECT * FROM t5980bb; +a b +1 Inserted into Discarded Local tablespace after ALTER ADD PRIMARY KEY, ALGORITHM=INPLACE +RENAME TABLE t5980aa TO t5980a; +RENAME TABLE t5980bb TO t5980b; +SHOW CREATE TABLE t5980a; +Table Create Table +t5980a CREATE TABLE `t5980a` ( + `a` int(11) NOT NULL DEFAULT '0', + `b` text, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t5980b; +Table Create Table +t5980b CREATE TABLE `t5980b` ( + `a` int(11) NOT NULL DEFAULT '0', + `b` text, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir/' +SELECT name,n_cols,file_format,row_format FROM information_schema.innodb_sys_tables +WHERE name LIKE 'test%' ORDER BY name; +name n_cols file_format row_format +test/t5980a 5 Antelope Compact +test/t5980b 5 Antelope Compact +test/t5980c 5 Antelope Compact +test/t5980d 5 Antelope Compact +SELECT name,file_format,row_format FROM information_schema.innodb_sys_tablespaces +WHERE name LIKE 'test%' ORDER BY space; +name file_format row_format +test/t5980c Antelope Compact or Redundant +test/t5980d Antelope Compact or Redundant +test/t5980a Antelope Compact or Redundant +test/t5980b Antelope Compact or Redundant +SELECT path FROM information_schema.innodb_sys_datafiles +WHERE path LIKE '%test%' ORDER BY space; +path +MYSQL_DATA_DIR/test/t5980c.ibd +MYSQL_TMP_DIR/alt_dir/test/t5980d.ibd +MYSQL_DATA_DIR/test/t5980a.ibd +MYSQL_TMP_DIR/alt_dir/test/t5980b.ibd +### files in MYSQL_DATA_DIR/test +t5980a.frm +t5980a.ibd +t5980b.frm +t5980b.isl +t5980c.frm +t5980d.frm +### files in MYSQL_TMP_DIR/alt_dir/test +t5980b.ibd +# +# Discard tablespaces again and try another ALTER TABLE ROW_FORMAT. +# +ALTER TABLE t5980a DISCARD TABLESPACE; +ALTER TABLE t5980b DISCARD TABLESPACE; +SELECT * FROM t5980a; +ERROR HY000: Tablespace has been discarded for table 't5980a' +SELECT * FROM t5980b; +ERROR HY000: Tablespace has been discarded for table 't5980b' +# +# ALTER TABLE ALGORITHM=COPY cannot use a discarded tablespace. +# +ALTER TABLE t5980a ROW_FORMAT=REDUNDANT, ALGORITHM=COPY; +ERROR HY000: Tablespace has been discarded for table 't5980a' +ALTER TABLE t5980b ROW_FORMAT=REDUNDANT, ALGORITHM=COPY; +ERROR HY000: Tablespace has been discarded for table 't5980b' +# +# ALTER TABLE ALGORITHM=INPLACE can use a discarded tablespace. +# +ALTER TABLE t5980a ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; +ALTER TABLE t5980b ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; +INSERT INTO t5980a VALUES (1, "Inserted into discarded local tablespace after ALTER ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE"); +INSERT INTO t5980b VALUES (1, "Inserted into discarded local tablespace after ALTER ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE"); +SELECT * FROM t5980a; +a b +1 Inserted into discarded local tablespace after ALTER ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE +SELECT * FROM t5980b; +a b +1 Inserted into discarded local tablespace after ALTER ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE +### files in MYSQL_DATA_DIR/test +t5980a.frm +t5980a.ibd +t5980b.frm +t5980b.isl +t5980c.frm +t5980d.frm +### files in MYSQL_TMP_DIR/alt_dir/test +t5980b.ibd +# +# Discard tablespaces again and try ALTER TABLE ADD COLUMN. +# +ALTER TABLE t5980a DISCARD TABLESPACE; +ALTER TABLE t5980b DISCARD TABLESPACE; +SELECT * FROM t5980a; +ERROR HY000: Tablespace has been discarded for table 't5980a' +SELECT * FROM t5980b; +ERROR HY000: Tablespace has been discarded for table 't5980b' +# +# ALTER TABLE ALGORITHM=COPY cannot use a discarded tablespace. +# +ALTER TABLE t5980a ADD COLUMN c CHAR(20), ALGORITHM=COPY; +ERROR HY000: Tablespace has been discarded for table 't5980a' +ALTER TABLE t5980b ADD COLUMN c CHAR(20), ALGORITHM=COPY; +ERROR HY000: Tablespace has been discarded for table 't5980b' +# +# ALTER TABLE ALGORITHM=INPLACE can use a discarded tablespace. +# +ALTER TABLE t5980a ADD COLUMN c CHAR(20), ALGORITHM=INPLACE; +ALTER TABLE t5980b ADD COLUMN c CHAR(20), ALGORITHM=INPLACE; +INSERT INTO t5980a VALUES (1, "Inserted into discarded local tablespace after ALTER ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE", "new column"); +INSERT INTO t5980b VALUES (1, "Inserted into discarded local tablespace after ALTER ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE", "new column"); +SELECT * FROM t5980a; +a b c +1 Inserted into discarded local tablespace after ALTER ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE new column +SELECT * FROM t5980b; +a b c +1 Inserted into discarded local tablespace after ALTER ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE new column +### files in MYSQL_DATA_DIR/test +t5980a.frm +t5980a.ibd +t5980b.frm +t5980b.isl +t5980c.frm +t5980d.frm +### files in MYSQL_TMP_DIR/alt_dir/test +t5980b.ibd +DROP TABLE t5980a; +DROP TABLE t5980b; +DROP TABLE t5980c; +DROP TABLE t5980d; +SELECT name,n_cols,file_format,row_format FROM information_schema.innodb_sys_tables +WHERE name LIKE 'test%' ORDER BY name; +name n_cols file_format row_format +SELECT name,file_format,row_format FROM information_schema.innodb_sys_tablespaces +WHERE name LIKE 'test%' ORDER BY space; +name file_format row_format +SELECT path FROM information_schema.innodb_sys_datafiles +WHERE path LIKE '%test%' ORDER BY space; +path ### files in MYSQL_DATA_DIR/test ### files in MYSQL_TMP_DIR/alt_dir/test +# +# Cleanup +# === modified file 'mysql-test/suite/innodb/t/innodb-multiple-tablespaces.test' --- a/mysql-test/suite/innodb/t/innodb-multiple-tablespaces.test revid:yasufumi.kinoshita@stripped +++ b/mysql-test/suite/innodb/t/innodb-multiple-tablespaces.test revid:kevin.lewis@stripped @@ -130,13 +130,10 @@ INSERT INTO nolink VALUES (1, 'no link f --source include/shutdown_mysqld.inc --echo ---- MYSQLD_DATADIR/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQLD_DATADIR/test --echo ---- MYSQL_TMP_DIR/alt_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/alt_dir/test --echo ---- MYSQL_TMP_DIR/new_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/new_dir/test --echo # YYY; Tablespace found in 3 places @@ -198,13 +195,10 @@ INSERT INTO nolink VALUES (1, 'no link f --remove_file $MYSQLD_DATADIR/test/nolink.isl --echo ---- MYSQLD_DATADIR/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQLD_DATADIR/test --echo ---- MYSQL_TMP_DIR/alt_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/alt_dir/test --echo ---- MYSQL_TMP_DIR/new_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/new_dir/test --echo # @@ -265,13 +259,10 @@ SHOW CREATE TABLE nolink; --echo # List of files before DROP TABLES --echo # --echo ---- MYSQLD_DATADIR/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQLD_DATADIR/test --echo ---- MYSQL_TMP_DIR/alt_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/alt_dir/test --echo ---- MYSQL_TMP_DIR/new_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/new_dir/test --echo # @@ -296,20 +287,16 @@ DROP TABLE nolink; --echo # List of files not deleted by the DROP TABLES --echo # --echo ---- MYSQLD_DATADIR/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQLD_DATADIR/test --echo ---- MYSQL_TMP_DIR/alt_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/alt_dir/test --echo ---- MYSQL_TMP_DIR/new_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/new_dir/test --remove_file $MYSQLD_DATADIR/test/www.ibd --remove_file $MYSQLD_DATADIR/test/wny.ibd --remove_file $MYSQLD_DATADIR/test/wyn.ibd --remove_file $MYSQLD_DATADIR/test/yny.ibd ---remove_file $MYSQLD_DATADIR/test/ywn.isl --remove_file $MYSQLD_DATADIR/test/yyn.ibd --remove_file $MYSQLD_DATADIR/test/yyy.ibd --remove_file $MYSQL_TMP_DIR/alt_dir/test/nwy.ibd @@ -326,16 +313,13 @@ DROP TABLE nolink; --remove_file $MYSQL_TMP_DIR/new_dir/test/yyy.ibd --echo # ---echo # List of files after removing unused files +--echo # List of files after removing leftover files --echo # --echo ---- MYSQLD_DATADIR/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQLD_DATADIR/test --echo ---- MYSQL_TMP_DIR/alt_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/alt_dir/test --echo ---- MYSQL_TMP_DIR/new_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/new_dir/test --echo # @@ -421,10 +405,8 @@ COMMIT; --exec echo $MYSQLD_DATADIR/test/aa.ibd > $MYSQLD_DATADIR/test/aa.isl --echo ---- MYSQLD_DATADIR/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQLD_DATADIR/test --echo ---- MYSQL_TMP_DIR/alt_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/alt_dir/test --echo # @@ -467,10 +449,8 @@ COMMIT; --copy_file $MYSQL_TMP_DIR/alt_dir/test/aa.ibd.bak $MYSQLD_DATADIR/test/wy.ibd --echo ---- MYSQLD_DATADIR/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQLD_DATADIR/test --echo ---- MYSQL_TMP_DIR/alt_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/alt_dir/test --echo # @@ -488,10 +468,8 @@ COMMIT; --copy_file $MYSQL_TMP_DIR/alt_dir/test/aa.ibd.bak $MYSQL_TMP_DIR/alt_dir/test/yw.ibd --echo ---- MYSQLD_DATADIR/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQLD_DATADIR/test --echo ---- MYSQL_TMP_DIR/alt_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/alt_dir/test --echo # @@ -510,10 +488,8 @@ COMMIT; --echo # NY; Tablespace found in alt_dir but not the default directory. --echo ---- MYSQLD_DATADIR/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQLD_DATADIR/test --echo ---- MYSQL_TMP_DIR/alt_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/alt_dir/test --echo # @@ -553,10 +529,8 @@ SHOW CREATE TABLE wy; --echo # List of files before DROP TABLES --echo # --echo ---- MYSQLD_DATADIR/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQLD_DATADIR/test --echo ---- MYSQL_TMP_DIR/alt_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/alt_dir/test DROP TABLE aa; @@ -570,24 +544,18 @@ DROP TABLE wy; --echo # List of files after DROP TABLES --echo # --echo ---- MYSQLD_DATADIR/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQLD_DATADIR/test --echo ---- MYSQL_TMP_DIR/alt_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/alt_dir/test ---remove_file $MYSQLD_DATADIR/test/yn.isl ---remove_file $MYSQLD_DATADIR/test/yw.isl --remove_file $MYSQL_TMP_DIR/alt_dir/test/aa.ibd.bak --echo # --echo # List of files after deleting unknown files --echo # --echo ---- MYSQLD_DATADIR/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQLD_DATADIR/test --echo ---- MYSQL_TMP_DIR/alt_dir/test ---replace_regex /#P#/#p#/ /#SP#/#sp#/ --list_files $MYSQL_TMP_DIR/alt_dir/test --echo # === modified file 'mysql-test/suite/innodb/t/innodb-wl5980-discard.test' --- a/mysql-test/suite/innodb/t/innodb-wl5980-discard.test revid:yasufumi.kinoshita@stripped +++ b/mysql-test/suite/innodb/t/innodb-wl5980-discard.test revid:kevin.lewis@stripped @@ -305,7 +305,6 @@ CHECK TABLE t5980; --echo # --copy_file $MYSQL_TMP_DIR/alt_dir/test/t5980.ibd.bak $MYSQL_DATA_DIR/test/t5980.ibd --copy_file $MYSQL_TMP_DIR/alt_dir/test/t5980.cfg.bak $MYSQL_DATA_DIR/test/t5980.cfg ---remove_file $MYSQL_DATA_DIR/test/t5980.isl --echo ### files in MYSQL_DATA_DIR/test --list_files $MYSQL_DATA_DIR/test --echo ### files in MYSQL_TMP_DIR/alt_dir/test @@ -365,23 +364,345 @@ SELECT name,file_format,row_format SELECT path FROM information_schema.innodb_sys_datafiles WHERE path LIKE '%test%' ORDER BY space; ---echo # ---echo # Cleanup ---echo # - DROP TABLE t5980; --remove_file $MYSQL_TMP_DIR/alt_dir/test/t5980.cfg.bak ---remove_file $MYSQL_TMP_DIR/alt_dir/test/t5980.ibd.bak +--remove_file $MYSQL_TMP_DIR/alt_dir/test/t5980.ibd.bak --remove_file $MYSQL_TMP_DIR/alt_dir/test/t5980.cfg.bak2 ---remove_file $MYSQL_TMP_DIR/alt_dir/test/t5980.ibd.bak2 +--remove_file $MYSQL_TMP_DIR/alt_dir/test/t5980.ibd.bak2 + +--echo # +--echo # Create a local and remote tablespaces, discard two and make +--echo # the other two missing upon restart, and try some DDL and DML +--echo # on these discarded and missing tablespaces. +--echo # + +SET GLOBAL innodb_file_per_table=ON; +CREATE TABLE t5980a (a int, b text) engine=InnoDB; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +eval CREATE TABLE t5980b (a int, b text) engine=InnoDB $data_directory_clause; +CREATE TABLE t5980c (a int, b text) engine=InnoDB; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +eval CREATE TABLE t5980d (a int, b text) engine=InnoDB $data_directory_clause; + +INSERT INTO t5980a VALUES (1, "Default location, discarded."); +INSERT INTO t5980b VALUES (1, "Remote location, discarded"); +INSERT INTO t5980c VALUES (1, "Default location, missing"); +INSERT INTO t5980d VALUES (1, "Remote location, missing"); + +SELECT * FROM t5980a; +SELECT * FROM t5980b; +SELECT * FROM t5980c; +SELECT * FROM t5980d; + +SHOW CREATE TABLE t5980a; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t5980b; +SHOW CREATE TABLE t5980c; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t5980d; + +SELECT name,n_cols,file_format,row_format FROM information_schema.innodb_sys_tables + WHERE name LIKE 'test%' ORDER BY name; +SELECT name,file_format,row_format FROM information_schema.innodb_sys_tablespaces + WHERE name LIKE 'test%' ORDER BY space; +--replace_result ./ MYSQL_DATA_DIR/ $MYSQL_DATA_DIR MYSQL_DATA_DIR $MYSQL_TMP_DIR MYSQL_TMP_DIR +SELECT path FROM information_schema.innodb_sys_datafiles + WHERE path LIKE '%test%' ORDER BY space; + +--echo ### files in MYSQL_DATA_DIR/test +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--echo # +--echo # Shutdown the server, remove two tablespaces, restart server. +--echo # +--source include/shutdown_mysqld.inc +--remove_file $MYSQL_DATA_DIR/test/t5980c.ibd +--remove_file $MYSQL_DATA_DIR/test/t5980d.isl +--remove_file $MYSQL_TMP_DIR/alt_dir/test/t5980d.ibd +--source include/start_mysqld.inc + +FLUSH TABLES t5980a, t5980b FOR EXPORT; +UNLOCK TABLES; + +ALTER TABLE t5980a DISCARD TABLESPACE; +ALTER TABLE t5980b DISCARD TABLESPACE; + +--echo ### files in MYSQL_DATA_DIR/test +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--error ER_TABLESPACE_DISCARDED +SELECT * FROM t5980a; +--error ER_TABLESPACE_DISCARDED +SELECT * FROM t5980b; +--error ER_NO_SUCH_TABLE +SELECT * FROM t5980c; +--error ER_NO_SUCH_TABLE +SELECT * FROM t5980d; + +SHOW CREATE TABLE t5980a; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t5980b; +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t5980c; +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t5980d; + +SELECT name,n_cols,file_format,row_format FROM information_schema.innodb_sys_tables + WHERE name LIKE 'test%' ORDER BY name; +SELECT name,file_format,row_format FROM information_schema.innodb_sys_tablespaces + WHERE name LIKE 'test%' ORDER BY space; +--replace_result ./ MYSQL_DATA_DIR/ $MYSQL_DATA_DIR MYSQL_DATA_DIR $MYSQL_TMP_DIR MYSQL_TMP_DIR +SELECT path FROM information_schema.innodb_sys_datafiles + WHERE path LIKE '%test%' ORDER BY space; + +--echo ### files in MYSQL_DATA_DIR/test +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--echo # +--echo # Discarded and missing tablespaces cannot be TRUNCATED +--echo # + +--error ER_TABLESPACE_DISCARDED +TRUNCATE TABLE t5980a; +--error ER_TABLESPACE_DISCARDED +TRUNCATE TABLE t5980b; +--error ER_NO_SUCH_TABLE +TRUNCATE TABLE t5980c; +--error ER_NO_SUCH_TABLE +TRUNCATE TABLE t5980d; + +--echo # +--echo # Discarded tablespaces can be RENAMED but they remain discarded +--echo # + +RENAME TABLE t5980a TO t5980aa; +RENAME TABLE t5980b TO t5980bb; + +--echo # +--echo # Missing tablespaces cannot be RENAMED +--echo # + +--error ER_ERROR_ON_RENAME +RENAME TABLE t5980c TO t5980cc; +--error ER_ERROR_ON_RENAME +RENAME TABLE t5980d TO t5980dd; + +--error ER_NO_SUCH_TABLE +SELECT * FROM t5980a; +--error ER_NO_SUCH_TABLE +SELECT * FROM t5980b; +--error ER_TABLESPACE_DISCARDED +SELECT * FROM t5980aa; +--error ER_TABLESPACE_DISCARDED +SELECT * FROM t5980bb; +--error ER_NO_SUCH_TABLE +SELECT * FROM t5980c; +--error ER_NO_SUCH_TABLE +SELECT * FROM t5980d; + +SHOW CREATE TABLE t5980aa; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t5980bb; +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t5980c; +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t5980d; + +SELECT name,n_cols,file_format,row_format FROM information_schema.innodb_sys_tables + WHERE name LIKE 'test%' ORDER BY name; +SELECT name,file_format,row_format FROM information_schema.innodb_sys_tablespaces + WHERE name LIKE 'test%' ORDER BY space; +--replace_result ./ MYSQL_DATA_DIR/ $MYSQL_DATA_DIR MYSQL_DATA_DIR $MYSQL_TMP_DIR MYSQL_TMP_DIR +SELECT path FROM information_schema.innodb_sys_datafiles + WHERE path LIKE '%test%' ORDER BY space; + +--echo # +--echo # Discarded tablespaces cannot be ALTERED with ALGORITHM=COPY. +--echo # + +--error ER_TABLESPACE_DISCARDED +ALTER TABLE t5980aa ADD PRIMARY KEY(a), ALGORITHM=COPY; +--error ER_TABLESPACE_DISCARDED +ALTER TABLE t5980bb ADD PRIMARY KEY(a), ALGORITHM=COPY; + +--echo # +--echo # Discarded tablespaces can be ALTERED with ALGORITHM=INPLACE. +--echo # + +ALTER TABLE t5980aa ADD PRIMARY KEY(a), ALGORITHM=INPLACE; +ALTER TABLE t5980bb ADD PRIMARY KEY(a), ALGORITHM=INPLACE; + +--echo ### files in MYSQL_DATA_DIR/test +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--echo # +--echo # Missing tablespaces cannot be ALTERED. +--echo # + +--error ER_NO_SUCH_TABLE +ALTER TABLE t5980c ADD PRIMARY KEY(a); +--error ER_NO_SUCH_TABLE +ALTER TABLE t5980d ADD PRIMARY KEY(a); + +SELECT * FROM t5980aa; +SELECT * FROM t5980bb; + +SHOW CREATE TABLE t5980aa; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t5980bb; + +SELECT name,n_cols,file_format,row_format FROM information_schema.innodb_sys_tables + WHERE name LIKE 'test%' ORDER BY name; +SELECT name,file_format,row_format FROM information_schema.innodb_sys_tablespaces + WHERE name LIKE 'test%' ORDER BY space; +--replace_result ./ MYSQL_DATA_DIR/ $MYSQL_DATA_DIR MYSQL_DATA_DIR $MYSQL_TMP_DIR MYSQL_TMP_DIR +SELECT path FROM information_schema.innodb_sys_datafiles + WHERE path LIKE '%test%' ORDER BY space; + --echo ### files in MYSQL_DATA_DIR/test --list_files $MYSQL_DATA_DIR/test --echo ### files in MYSQL_TMP_DIR/alt_dir/test --list_files $MYSQL_TMP_DIR/alt_dir/test + +--echo # +--echo # Discarded tablespaces that were ALTERED IN_PLACE are no longer discarded. +--echo # + +INSERT INTO t5980aa VALUES (1, "Inserted into Discarded Local tablespace after ALTER ADD PRIMARY KEY, ALGORITHM=INPLACE"); +INSERT INTO t5980bb VALUES (1, "Inserted into Discarded Local tablespace after ALTER ADD PRIMARY KEY, ALGORITHM=INPLACE"); + +SELECT * FROM t5980aa; +SELECT * FROM t5980bb; + +RENAME TABLE t5980aa TO t5980a; +RENAME TABLE t5980bb TO t5980b; + +SHOW CREATE TABLE t5980a; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +SHOW CREATE TABLE t5980b; + +SELECT name,n_cols,file_format,row_format FROM information_schema.innodb_sys_tables + WHERE name LIKE 'test%' ORDER BY name; +SELECT name,file_format,row_format FROM information_schema.innodb_sys_tablespaces + WHERE name LIKE 'test%' ORDER BY space; +--replace_result ./ MYSQL_DATA_DIR/ $MYSQL_DATA_DIR MYSQL_DATA_DIR $MYSQL_TMP_DIR MYSQL_TMP_DIR +SELECT path FROM information_schema.innodb_sys_datafiles + WHERE path LIKE '%test%' ORDER BY space; + +--echo ### files in MYSQL_DATA_DIR/test +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--echo # +--echo # Discard tablespaces again and try another ALTER TABLE ROW_FORMAT. +--echo # + +ALTER TABLE t5980a DISCARD TABLESPACE; +ALTER TABLE t5980b DISCARD TABLESPACE; +--error ER_TABLESPACE_DISCARDED +SELECT * FROM t5980a; +--error ER_TABLESPACE_DISCARDED +SELECT * FROM t5980b; + +--echo # +--echo # ALTER TABLE ALGORITHM=COPY cannot use a discarded tablespace. +--echo # + +--error ER_TABLESPACE_DISCARDED +ALTER TABLE t5980a ROW_FORMAT=REDUNDANT, ALGORITHM=COPY; +--error ER_TABLESPACE_DISCARDED +ALTER TABLE t5980b ROW_FORMAT=REDUNDANT, ALGORITHM=COPY; + +--echo # +--echo # ALTER TABLE ALGORITHM=INPLACE can use a discarded tablespace. +--echo # + +ALTER TABLE t5980a ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; +ALTER TABLE t5980b ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; +INSERT INTO t5980a VALUES (1, "Inserted into discarded local tablespace after ALTER ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE"); +INSERT INTO t5980b VALUES (1, "Inserted into discarded local tablespace after ALTER ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE"); +SELECT * FROM t5980a; +SELECT * FROM t5980b; +--echo ### files in MYSQL_DATA_DIR/test +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--echo # +--echo # Discard tablespaces again and try ALTER TABLE ADD COLUMN. +--echo # + +ALTER TABLE t5980a DISCARD TABLESPACE; +ALTER TABLE t5980b DISCARD TABLESPACE; +--error ER_TABLESPACE_DISCARDED +SELECT * FROM t5980a; +--error ER_TABLESPACE_DISCARDED +SELECT * FROM t5980b; + +--echo # +--echo # ALTER TABLE ALGORITHM=COPY cannot use a discarded tablespace. +--echo # + +--error ER_TABLESPACE_DISCARDED +ALTER TABLE t5980a ADD COLUMN c CHAR(20), ALGORITHM=COPY; +--error ER_TABLESPACE_DISCARDED +ALTER TABLE t5980b ADD COLUMN c CHAR(20), ALGORITHM=COPY; + +--echo # +--echo # ALTER TABLE ALGORITHM=INPLACE can use a discarded tablespace. +--echo # + +ALTER TABLE t5980a ADD COLUMN c CHAR(20), ALGORITHM=INPLACE; +ALTER TABLE t5980b ADD COLUMN c CHAR(20), ALGORITHM=INPLACE; +INSERT INTO t5980a VALUES (1, "Inserted into discarded local tablespace after ALTER ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE", "new column"); +INSERT INTO t5980b VALUES (1, "Inserted into discarded local tablespace after ALTER ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE", "new column"); +SELECT * FROM t5980a; +SELECT * FROM t5980b; +--echo ### files in MYSQL_DATA_DIR/test +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--list_files $MYSQL_TMP_DIR/alt_dir/test + +DROP TABLE t5980a; +DROP TABLE t5980b; +DROP TABLE t5980c; +DROP TABLE t5980d; + +SELECT name,n_cols,file_format,row_format FROM information_schema.innodb_sys_tables + WHERE name LIKE 'test%' ORDER BY name; +SELECT name,file_format,row_format FROM information_schema.innodb_sys_tablespaces + WHERE name LIKE 'test%' ORDER BY space; +--replace_result ./ MYSQL_DATA_DIR/ $MYSQL_DATA_DIR MYSQL_DATA_DIR $MYSQL_TMP_DIR MYSQL_TMP_DIR +SELECT path FROM information_schema.innodb_sys_datafiles + WHERE path LIKE '%test%' ORDER BY space; + +--echo ### files in MYSQL_DATA_DIR/test +--list_files $MYSQL_DATA_DIR/test +--echo ### files in MYSQL_TMP_DIR/alt_dir/test +--list_files $MYSQL_TMP_DIR/alt_dir/test + +--echo # +--echo # Cleanup +--echo # + --rmdir $MYSQL_TMP_DIR/alt_dir/test --rmdir $MYSQL_TMP_DIR/alt_dir -- disable_query_log eval set global innodb_file_per_table=$innodb_file_per_table_orig; + +call mtr.add_suppression("InnoDB: Could not find a valid tablespace file for"); +call mtr.add_suppression("InnoDB: Tablespace open failed for"); +call mtr.add_suppression("InnoDB: Failed to find tablespace for table "); +call mtr.add_suppression("InnoDB: Table test/t5980.* does not have an .ibd file in the database directory."); -- enable_query_log === modified file 'storage/innobase/dict/dict0load.cc' --- a/storage/innobase/dict/dict0load.cc revid:yasufumi.kinoshita@stripped +++ b/storage/innobase/dict/dict0load.cc revid:kevin.lewis@stripped @@ -2131,19 +2131,19 @@ dict_get_and_save_data_dir_path( if (!dict_mutex_own) { dict_mutex_enter_for_mysql(); } - if (!path) { + if (!path && !srv_force_recovery) { path = dict_get_first_path( table->space, table->name); } if (path) { dict_save_data_dir_path(table, path); + mem_free(path); } if (!dict_mutex_own) { dict_mutex_exit_for_mysql(); } - mem_free(path); } } @@ -2261,8 +2261,10 @@ err_exit: } else if (!fil_space_for_table_exists_in_mem( table->space, name, FALSE, FALSE)) { - if (DICT_TF2_FLAG_IS_SET(table, DICT_TF2_TEMPORARY)) { - /* Do not bother to retry opening temporary tables. */ + if (DICT_TF2_FLAG_IS_SET(table, DICT_TF2_TEMPORARY) + || srv_force_recovery) { + /* Do not bother to retry opening temporary tables + or retry any tablespace if force_recovery is on. */ table->ibd_file_missing = TRUE; } else { ib_logf(IB_LOG_LEVEL_ERROR, === modified file 'storage/innobase/fil/fil0fil.cc' --- a/storage/innobase/fil/fil0fil.cc revid:yasufumi.kinoshita@stripped +++ b/storage/innobase/fil/fil0fil.cc revid:kevin.lewis@stripped @@ -2557,25 +2557,27 @@ fil_delete_tablespace( #endif /* !UNIV_HOTBACKUP */ - mutex_enter(&fil_system->mutex); - - if (!fil_space_free(id, TRUE)) { - err = DB_TABLESPACE_NOT_FOUND; - } - - mutex_exit(&fil_system->mutex); - /* If it is a delete then also delete any generated files, otherwise when we drop the database the remove directory will fail. */ - { char* cfg_name = fil_make_cfg_name(path); - os_file_delete_if_exists(cfg_name); - mem_free(cfg_name); } + /* Delete the link file pointing to the ibd file we are deleting. */ + if (FSP_FLAGS_HAS_DATA_DIR(space->flags)) { + fil_delete_link_file(space->name); + } + + mutex_enter(&fil_system->mutex); + + if (!fil_space_free(id, TRUE)) { + err = DB_TABLESPACE_NOT_FOUND; + } + + mutex_exit(&fil_system->mutex); + if (err != DB_SUCCESS) { rw_lock_x_unlock(&space->latch); } else if (!os_file_delete(path) && !os_file_delete_if_exists(path)) { === modified file 'storage/innobase/handler/ha_innodb.cc' --- a/storage/innobase/handler/ha_innodb.cc revid:yasufumi.kinoshita@stripped +++ b/storage/innobase/handler/ha_innodb.cc revid:kevin.lewis@stripped @@ -9699,7 +9699,8 @@ int ha_innobase::truncate() /*===================*/ { - dberr_t error; + dberr_t err; + int error; DBUG_ENTER("ha_innobase::truncate"); @@ -9713,10 +9714,29 @@ ha_innobase::truncate() } /* Truncate the table in InnoDB */ - error = row_truncate_table_for_mysql(prebuilt->table, prebuilt->trx); + err = row_truncate_table_for_mysql(prebuilt->table, prebuilt->trx); + + switch (err) { + + case DB_TABLESPACE_DELETED: + case DB_TABLESPACE_NOT_FOUND: + ib_senderrf( + prebuilt->trx->mysql_thd, IB_LOG_LEVEL_ERROR, + (err == DB_TABLESPACE_DELETED ? + ER_TABLESPACE_DISCARDED : ER_TABLESPACE_MISSING), + table->s->table_name.str); + table->status = STATUS_NOT_FOUND; + error = HA_ERR_NO_SUCH_TABLE; + break; - DBUG_RETURN(convert_error_code_to_mysql(error, prebuilt->table->flags, - NULL)); + default: + error = convert_error_code_to_mysql( + err, prebuilt->table->flags, + prebuilt->trx->mysql_thd); + table->status = STATUS_NOT_FOUND; + break; + } + DBUG_RETURN(error); } /*****************************************************************//** === modified file 'storage/innobase/row/row0merge.cc' --- a/storage/innobase/row/row0merge.cc revid:yasufumi.kinoshita@stripped +++ b/storage/innobase/row/row0merge.cc revid:kevin.lewis@stripped @@ -3136,7 +3136,9 @@ row_merge_rename_tables( /* Update SYS_TABLESPACES and SYS_DATAFILES if the old table is in a non-system tablespace where space > 0. */ - if (err == DB_SUCCESS && old_table->space) { + if (err == DB_SUCCESS + && old_table->space != TRX_SYS_SPACE + && !old_table->ibd_file_missing) { /* Make pathname to update SYS_DATAFILES. */ char* tmp_path = row_make_new_pathname(old_table, tmp_name); @@ -3163,7 +3165,9 @@ row_merge_rename_tables( /* Update SYS_TABLESPACES and SYS_DATAFILES if the new table is in a non-system tablespace where space > 0. */ - if (err == DB_SUCCESS && new_table->space) { + if (err == DB_SUCCESS + && new_table->space != TRX_SYS_SPACE + && !new_table->ibd_file_missing) { /* Make pathname to update SYS_DATAFILES. */ char* old_path = row_make_new_pathname(new_table, old_name); === modified file 'storage/innobase/row/row0mysql.cc' --- a/storage/innobase/row/row0mysql.cc revid:yasufumi.kinoshita@stripped +++ b/storage/innobase/row/row0mysql.cc revid:kevin.lewis@stripped @@ -3182,6 +3182,12 @@ row_truncate_table_for_mysql( return(DB_ERROR); } + if (dict_table_is_discarded(table)) { + return(DB_TABLESPACE_DELETED); + } else if (table->ibd_file_missing) { + return(DB_TABLESPACE_NOT_FOUND); + } + trx_start_if_not_started(trx); trx->op_info = "truncating table"; @@ -4032,7 +4038,7 @@ check_next_foreign: /* We do not allow temporary tables with a remote path. */ ut_a(!(is_temp && DICT_TF_HAS_DATA_DIR(table->flags))); - if (DICT_TF_HAS_DATA_DIR(table->flags)) { + if (space_id && DICT_TF_HAS_DATA_DIR(table->flags)) { dict_get_and_save_data_dir_path(table, true); ut_a(table->data_dir_path); @@ -4089,7 +4095,7 @@ check_next_foreign: a temp table or if the tablesace has been discarded. */ print_msg = !(is_temp || ibd_file_missing); - if (err == DB_SUCCESS && space_id > 0) { + if (err == DB_SUCCESS && space_id > TRX_SYS_SPACE) { if (!is_temp && !fil_space_for_table_exists_in_mem( space_id, tablename, FALSE, print_msg)) { @@ -4596,7 +4602,9 @@ row_rename_table_for_mysql( "InnoDB: " REFMAN "innodb-troubleshooting.html\n", stderr); goto funct_exit; - } else if (!dict_table_is_discarded(table) && table->ibd_file_missing) { + + } else if (table->ibd_file_missing + && !dict_table_is_discarded(table)) { err = DB_TABLE_NOT_FOUND; @@ -4606,6 +4614,7 @@ row_rename_table_for_mysql( old_name); goto funct_exit; + } else if (new_is_tmp) { /* MySQL is doing an ALTER TABLE command and it renames the original table to a temporary table name. We want to preserve @@ -4662,7 +4671,9 @@ row_rename_table_for_mysql( /* SYS_TABLESPACES and SYS_DATAFILES track non-system tablespaces which have space IDs > 0. */ - if (err == DB_SUCCESS && table->space) { + if (err == DB_SUCCESS + && table->space != TRX_SYS_SPACE + && !table->ibd_file_missing) { /* Make a new pathname to update SYS_DATAFILES. */ char* new_path = row_make_new_pathname(table, new_name); No bundle (reason: useless for push emails).