Skip to content

Commit

Permalink
Bug#30190199 - ERROR WHEN IMPORTING TABLESPACE WITH DIFFERENT DATA
Browse files Browse the repository at this point in the history
DIRECTORY LACKS DETAILS
Bug#30190227 - CRASH IMPORTING TABLESPACE WITH DIFFERENT DATA
DIRECTORY BUT NOT .CFG FILE

Problem:
During tablespace import, If the source table was created  by
specifying the DATA DIRECTORY clause, then the table that we replace
on the destination instance must be defined with the same DATA
DIRECTORY clause. If the clauses do not match then schema mismatch
error is reported.
Issue-1: The error message do not specify the exact reason of this
error.
Issue-2: If .cfg file is not found during import then we do not
validate table flags to fsp flags. Later due to table flags
mismatch, server terminates due to fatal error.

Solution:
Fix-1: If .cfg file is available during import then check if  the
source table meta-data (.cfg file) flag for data_dir do not match
with server table flag for data_dir then throw an error and
terminate import operation.
Fix-2: If .cfg file is not available during import then check if the
source table fsp (.ibd file) flag  for data_dir do not match with
server table flag for data_dir then throw an error and terminate
import operation.

RB: 23024
Reviewed by : Kevin Lewis <[email protected]>
  • Loading branch information
sachinagarwal1111 committed Sep 30, 2019
1 parent 9a8fef9 commit bd24fc6
Show file tree
Hide file tree
Showing 3 changed files with 206 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#
# Bug #30190227 CRASH IMPORTING TABLESPACE WITH DIFFERENT DATA DIRECTORY
# BUT NOT .CFG FILE
#
# Test-case-1
CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY) DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir';
INSERT INTO t1 VALUES (1), (2), (3);
FLUSH TABLES t1 FOR EXPORT;
UNLOCK TABLES;
DROP TABLE t1;
CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY);
ALTER TABLE t1 DISCARD TABLESPACE;
ALTER TABLE t1 IMPORT TABLESPACE;
ERROR HY000: Schema mismatch (Table data_dir flag don't match, server table has data_dir flag = 0 and .ibd file has data_dir flag = 1)
DROP TABLE t1;
#
# Test-case-2
CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY);
INSERT INTO t1 VALUES (1), (2), (3);
FLUSH TABLES t1 FOR EXPORT;
UNLOCK TABLES;
DROP TABLE t1;
CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY) DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir';
ALTER TABLE t1 DISCARD TABLESPACE;
ALTER TABLE t1 IMPORT TABLESPACE;
ERROR HY000: Schema mismatch (Table data_dir flag don't match, server table has data_dir flag = 1 and .ibd file has data_dir flag = 0)
DROP TABLE t1;
#
# Bug #30190199 ERROR WHEN IMPORTING TABLESPACE WITH DIFFERENT DATA
# DIRECTORY LACKS DETAILS
#
# Test-case-3
CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY) DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir';
INSERT INTO t1 VALUES (1), (2), (3);
FLUSH TABLES t1 FOR EXPORT;
UNLOCK TABLES;
DROP TABLE t1;
CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY);
ALTER TABLE t1 DISCARD TABLESPACE;
ALTER TABLE t1 IMPORT TABLESPACE;
ERROR HY000: Schema mismatch (Table data_dir flag don't match, server table has data_dir flag = 0 and the meta-data file has data_dir flag = 1)
DROP TABLE t1;
#
# Test-case-4
CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY);
INSERT INTO t1 VALUES (1), (2), (3);
FLUSH TABLES t1 FOR EXPORT;
UNLOCK TABLES;
DROP TABLE t1;
CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY) DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir';
ALTER TABLE t1 DISCARD TABLESPACE;
ALTER TABLE t1 IMPORT TABLESPACE;
ERROR HY000: Schema mismatch (Table data_dir flag don't match, server table has data_dir flag = 1 and the meta-data file has data_dir flag = 0)
DROP TABLE t1;
#
# Cleanup
#
119 changes: 119 additions & 0 deletions mysql-test/suite/innodb/t/import_tablespace_schema_missmatch.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
--echo #
--echo # Bug #30190227 CRASH IMPORTING TABLESPACE WITH DIFFERENT DATA DIRECTORY
--echo # BUT NOT .CFG FILE
--echo #
--echo # Test-case-1
# Source tablespace is created with DATA DIRECTORY clause,
# whereas destination table is defined without DATA DIRECTORY clause.

--let $MYSQLD_DATADIR=`select @@datadir`
--let $DB = `SELECT DATABASE()`
--let $data_directory = DATA DIRECTORY='$MYSQL_TMP_DIR/alt_dir'

--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
eval CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY) $data_directory;
INSERT INTO t1 VALUES (1), (2), (3);
FLUSH TABLES t1 FOR EXPORT;

--copy_file '$MYSQL_TMP_DIR/alt_dir/$DB/t1.ibd' $MYSQL_TMP_DIR/t1.ibd

UNLOCK TABLES;
DROP TABLE t1;
CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY);
ALTER TABLE t1 DISCARD TABLESPACE;

--move_file $MYSQL_TMP_DIR/t1.ibd $MYSQLD_DATADIR/$DB/t1.ibd
--error ER_TABLE_SCHEMA_MISMATCH

ALTER TABLE t1 IMPORT TABLESPACE;
DROP TABLE t1;
--remove_file $MYSQLD_DATADIR/$DB/t1.ibd

--echo #
--echo # Test-case-2
# Source tablespace is created without DATA DIRECTORY clause,
# whereas destination table is defined with DATA DIRECTORY clause.

CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY);
INSERT INTO t1 VALUES (1), (2), (3);
FLUSH TABLES t1 FOR EXPORT;

--copy_file '$MYSQLD_DATADIR/$DB/t1.ibd' $MYSQL_TMP_DIR/t1.ibd

UNLOCK TABLES;
DROP TABLE t1;
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
eval CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY) $data_directory;
ALTER TABLE t1 DISCARD TABLESPACE;

--move_file $MYSQL_TMP_DIR/t1.ibd $MYSQL_TMP_DIR/alt_dir/$DB/t1.ibd

--error ER_TABLE_SCHEMA_MISMATCH
ALTER TABLE t1 IMPORT TABLESPACE;
DROP TABLE t1;
--remove_file $MYSQL_TMP_DIR/alt_dir/$DB/t1.ibd


--echo #
--echo # Bug #30190199 ERROR WHEN IMPORTING TABLESPACE WITH DIFFERENT DATA
--echo # DIRECTORY LACKS DETAILS
--echo #
--echo # Test-case-3
# Same as test-case-1 but .cfg file is available during
# import tablespace.

--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
eval CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY) $data_directory;
INSERT INTO t1 VALUES (1), (2), (3);
FLUSH TABLES t1 FOR EXPORT;

--copy_file '$MYSQL_TMP_DIR/alt_dir/$DB/t1.ibd' $MYSQL_TMP_DIR/t1.ibd
--copy_file '$MYSQL_TMP_DIR/alt_dir/$DB/t1.cfg' $MYSQL_TMP_DIR/t1.cfg

UNLOCK TABLES;
DROP TABLE t1;
CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY);
ALTER TABLE t1 DISCARD TABLESPACE;

--move_file $MYSQL_TMP_DIR/t1.cfg $MYSQLD_DATADIR/$DB/t1.cfg
--move_file $MYSQL_TMP_DIR/t1.ibd $MYSQLD_DATADIR/$DB/t1.ibd

--error ER_TABLE_SCHEMA_MISMATCH
ALTER TABLE t1 IMPORT TABLESPACE;
DROP TABLE t1;
--remove_file $MYSQLD_DATADIR/$DB/t1.ibd
--remove_file $MYSQLD_DATADIR/$DB/t1.cfg

--echo #
--echo # Test-case-4
# Same as test-case-2 but .cfg file is available during
# import tablespace.

CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY);
INSERT INTO t1 VALUES (1), (2), (3);
FLUSH TABLES t1 FOR EXPORT;

--copy_file '$MYSQLD_DATADIR/$DB/t1.ibd' $MYSQL_TMP_DIR/t1.ibd
--copy_file '$MYSQLD_DATADIR/$DB/t1.cfg' $MYSQL_TMP_DIR/t1.cfg

UNLOCK TABLES;
DROP TABLE t1;
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
eval CREATE TABLE t1 (id int unsigned NOT NULL PRIMARY KEY) $data_directory;
ALTER TABLE t1 DISCARD TABLESPACE;

--move_file $MYSQL_TMP_DIR/t1.ibd $MYSQL_TMP_DIR/alt_dir/$DB/t1.ibd
--move_file $MYSQL_TMP_DIR/t1.cfg $MYSQL_TMP_DIR/alt_dir/$DB/t1.cfg

--error ER_TABLE_SCHEMA_MISMATCH
ALTER TABLE t1 IMPORT TABLESPACE;
DROP TABLE t1;
--remove_file $MYSQL_TMP_DIR/alt_dir/$DB/t1.ibd
--remove_file $MYSQL_TMP_DIR/alt_dir/$DB/t1.cfg

--echo #
--echo # Cleanup
--echo #

--rmdir $MYSQL_TMP_DIR/alt_dir/test
--rmdir $MYSQL_TMP_DIR/alt_dir
30 changes: 30 additions & 0 deletions storage/innobase/row/row0import.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1326,6 +1326,17 @@ row_import::match_schema(
" and the meta-data file has %s",
(const char*)dict_tf_to_row_format_string(m_table->flags),
(const char*)dict_tf_to_row_format_string(m_flags));
} else if (DICT_TF_HAS_DATA_DIR(m_flags) !=
DICT_TF_HAS_DATA_DIR(m_table->flags)) {
/* If the meta-data flag is set for data_dir,
but table flag is not set for data_dir or vice versa
then return error. */
ib_errf(thd, IB_LOG_LEVEL_ERROR, ER_TABLE_SCHEMA_MISMATCH,
"Table data_dir flag don't match, "
"server table has data_dir flag = %lu and"
" the meta-data file has data_dir flag = %lu",
(ulint)DICT_TF_HAS_DATA_DIR(m_table->flags),
(ulint)DICT_TF_HAS_DATA_DIR(m_flags));
} else {
ib_errf(thd, IB_LOG_LEVEL_ERROR, ER_TABLE_SCHEMA_MISMATCH,
"Table flags don't match");
Expand Down Expand Up @@ -3635,6 +3646,7 @@ row_import_for_mysql(
rw_lock_s_lock_func(dict_operation_lock, 0, __FILE__, __LINE__);

row_import cfg;
ulint space_flags = 0;

/* Read CFP file */
if (dict_table_is_encrypted(table)) {
Expand Down Expand Up @@ -3726,6 +3738,24 @@ row_import_for_mysql(
}
}

space_flags = fetchIndexRootPages.get_space_flags();

/* If the fsp flag is set for data_dir, but table flag is not
set for data_dir or vice versa then return error. */
if (err == DB_SUCCESS
&& FSP_FLAGS_HAS_DATA_DIR(space_flags) !=
DICT_TF_HAS_DATA_DIR(table->flags)) {
ib_errf(trx->mysql_thd, IB_LOG_LEVEL_ERROR,
ER_TABLE_SCHEMA_MISMATCH,
"Table data_dir flag don't match, "
"server table has data_dir flag = %lu "
"and .ibd file has data_dir flag = %lu",
(ulint)DICT_TF_HAS_DATA_DIR(table->flags),
(ulint)FSP_FLAGS_HAS_DATA_DIR(space_flags));
err = DB_ERROR;
return(row_import_error(prebuilt, trx, err));
}

} else {
rw_lock_s_unlock_gen(dict_operation_lock, 0);
}
Expand Down

0 comments on commit bd24fc6

Please sign in to comment.