mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-26870 --skip-symbolic-links does not disallow .isl file creation
The InnoDB DATA DIRECTORY attribute is not implemented via symbolic links but something similar, *.isl files that contain the names of data files. InnoDB failed to ignore the DATA DIRECTORY attribute even though the server was started with --skip-symbolic-links. Native ALTER TABLE in InnoDB will retain the DATA DIRECTORY attribute of the table, no matter if the table will be rebuilt or not. Generic ALTER TABLE (with ALGORITHM=COPY) as well as TRUNCATE TABLE will discard the DATA DIRECTORY attribute. All tests have been run with and without the ./mtr option --mysqld=--skip-symbolic-links and some tests that use the InnoDB DATA DIRECTORY attribute have been adjusted for this.
This commit is contained in:
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2010, 2021, MariaDB Corporation.
|
Copyright (c) 2010, 2022, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -276,7 +276,7 @@ extern int my_umask_dir,
|
|||||||
my_recived_signals, /* Signals we have got */
|
my_recived_signals, /* Signals we have got */
|
||||||
my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */
|
my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */
|
||||||
my_dont_interrupt; /* call remember_intr when set */
|
my_dont_interrupt; /* call remember_intr when set */
|
||||||
extern my_bool my_use_symdir;
|
extern MYSQL_PLUGIN_IMPORT my_bool my_use_symdir;
|
||||||
|
|
||||||
extern ulong my_default_record_cache_size;
|
extern ulong my_default_record_cache_size;
|
||||||
extern MYSQL_PLUGIN_IMPORT my_bool my_disable_locking;
|
extern MYSQL_PLUGIN_IMPORT my_bool my_disable_locking;
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
DROP TABLE IF EXISTS t1,t2,t3;
|
|
||||||
CREATE TABLE t1 (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB;
|
CREATE TABLE t1 (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB;
|
||||||
CREATE TABLE t2 (id INT PRIMARY KEY, t1_id INT, INDEX par_ind (t1_id, id),
|
CREATE TABLE t2 (id INT PRIMARY KEY, t1_id INT, INDEX par_ind (t1_id, id),
|
||||||
FOREIGN KEY (t1_id) REFERENCES t1(id) ON DELETE CASCADE,
|
FOREIGN KEY (t1_id) REFERENCES t1(id) ON DELETE CASCADE,
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
-- source include/have_innodb.inc
|
-- source include/have_innodb.inc
|
||||||
-- source include/have_file_key_management_plugin.inc
|
-- source include/have_file_key_management_plugin.inc
|
||||||
-- source include/not_embedded.inc
|
-- source include/not_embedded.inc
|
||||||
|
-- source include/have_symlink.inc
|
||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
SET GLOBAL innodb_file_format = `Barracuda`;
|
SET GLOBAL innodb_file_format = `Barracuda`;
|
||||||
|
54
mysql-test/suite/innodb/r/skip_symbolic_links.result
Normal file
54
mysql-test/suite/innodb/r/skip_symbolic_links.result
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
SELECT @@have_symlink;
|
||||||
|
@@have_symlink
|
||||||
|
DISABLED
|
||||||
|
CREATE TABLE t1(a INT) ENGINE=InnoDB DATA DIRECTORY 'MYSQL_TMP_DIR';
|
||||||
|
Warnings:
|
||||||
|
Warning 1618 <DATA DIRECTORY> option ignored
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1(a INT) ENGINE=InnoDB;
|
||||||
|
ALTER TABLE t1 DATA DIRECTORY 'MYSQL_TMP_DIR';
|
||||||
|
Warnings:
|
||||||
|
Warning 1618 <DATA DIRECTORY> option ignored
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1(a INT PRIMARY KEY, b INT) ENGINE=InnoDB
|
||||||
|
DATA DIRECTORY 'MYSQL_TMP_DIR';
|
||||||
|
CREATE TABLE t2(a INT PRIMARY KEY, b INT) ENGINE=InnoDB
|
||||||
|
DATA DIRECTORY 'MYSQL_TMP_DIR';
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
TRUNCATE TABLE t2;
|
||||||
|
ALTER TABLE t1 FORCE, ALGORITHM=INPLACE;
|
||||||
|
Warnings:
|
||||||
|
Warning 1618 <DATA DIRECTORY> option ignored
|
||||||
|
ALTER TABLE t2 FORCE, ALGORITHM=COPY;
|
||||||
|
Warnings:
|
||||||
|
Warning 1618 <DATA DIRECTORY> option ignored
|
||||||
|
OPTIMIZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
|
||||||
|
test.t1 optimize status OK
|
||||||
|
Warnings:
|
||||||
|
Warning 1618 <DATA DIRECTORY> option ignored
|
||||||
|
t1.ibd
|
||||||
|
DROP TABLE t2;
|
||||||
|
RENAME TABLE t1 TO t2;
|
||||||
|
ALTER TABLE t2 ADD UNIQUE INDEX(b), RENAME TO t3;
|
||||||
|
Warnings:
|
||||||
|
Warning 1618 <DATA DIRECTORY> option ignored
|
||||||
|
ALTER TABLE t3 RENAME TO t2;
|
||||||
|
ALTER TABLE t2 DROP INDEX b, RENAME TO t1;
|
||||||
|
Warnings:
|
||||||
|
Warning 1618 <DATA DIRECTORY> option ignored
|
||||||
|
ALTER TABLE t1 CHANGE b c INT;
|
||||||
|
Warnings:
|
||||||
|
Warning 1618 <DATA DIRECTORY> option ignored
|
||||||
|
ALTER TABLE t1 CHANGE c b INT NOT NULL;
|
||||||
|
Warnings:
|
||||||
|
Warning 1618 <DATA DIRECTORY> option ignored
|
||||||
|
t1.ibd
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
@ -1,5 +1,6 @@
|
|||||||
--source include/innodb_page_size.inc
|
--source include/innodb_page_size.inc
|
||||||
--source include/not_embedded.inc
|
--source include/not_embedded.inc
|
||||||
|
--source include/have_symlink.inc
|
||||||
|
|
||||||
-- echo #
|
-- echo #
|
||||||
-- echo # MDEV-11623 MariaDB 10.1 fails to start datadir created with
|
-- echo # MDEV-11623 MariaDB 10.1 fails to start datadir created with
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
--source include/not_embedded.inc
|
--source include/not_embedded.inc
|
||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_symlink.inc
|
||||||
|
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
CALL mtr.add_suppression(".*Failed to set O_DIRECT on file.*");
|
CALL mtr.add_suppression(".*Failed to set O_DIRECT on file.*");
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_symlink.inc
|
||||||
|
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
# These values can change during the test
|
# These values can change during the test
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
--source include/not_embedded.inc
|
--source include/not_embedded.inc
|
||||||
--source include/have_debug.inc
|
--source include/have_debug.inc
|
||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_symlink.inc
|
||||||
|
|
||||||
# These messages are expected in the log
|
# These messages are expected in the log
|
||||||
call mtr.add_suppression("Cannot find space id [0-9]+ in the tablespace memory cache");
|
call mtr.add_suppression("Cannot find space id [0-9]+ in the tablespace memory cache");
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
--source include/innodb_page_size.inc
|
--source include/innodb_page_size.inc
|
||||||
--source include/not_embedded.inc
|
--source include/not_embedded.inc
|
||||||
|
--source include/have_symlink.inc
|
||||||
|
|
||||||
let datadir= `select @@datadir`;
|
let datadir= `select @@datadir`;
|
||||||
let page_size= `select @@innodb_page_size`;
|
let page_size= `select @@innodb_page_size`;
|
||||||
|
1
mysql-test/suite/innodb/t/skip_symbolic_links.opt
Normal file
1
mysql-test/suite/innodb/t/skip_symbolic_links.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--skip-symbolic-links
|
51
mysql-test/suite/innodb/t/skip_symbolic_links.test
Normal file
51
mysql-test/suite/innodb/t/skip_symbolic_links.test
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
--source include/have_innodb.inc
|
||||||
|
--source include/not_windows.inc
|
||||||
|
|
||||||
|
SELECT @@have_symlink;
|
||||||
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||||
|
eval CREATE TABLE t1(a INT) ENGINE=InnoDB DATA DIRECTORY '$MYSQL_TMP_DIR';
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1(a INT) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||||
|
eval ALTER TABLE t1 DATA DIRECTORY '$MYSQL_TMP_DIR';
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--let $restart_parameters=--symbolic-links
|
||||||
|
--source include/restart_mysqld.inc
|
||||||
|
|
||||||
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||||
|
eval CREATE TABLE t1(a INT PRIMARY KEY, b INT) ENGINE=InnoDB
|
||||||
|
DATA DIRECTORY '$MYSQL_TMP_DIR';
|
||||||
|
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||||
|
eval CREATE TABLE t2(a INT PRIMARY KEY, b INT) ENGINE=InnoDB
|
||||||
|
DATA DIRECTORY '$MYSQL_TMP_DIR';
|
||||||
|
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
TRUNCATE TABLE t2;
|
||||||
|
|
||||||
|
--let $restart_parameters=
|
||||||
|
--source include/restart_mysqld.inc
|
||||||
|
|
||||||
|
# Native ALTER will retain DATA DIRECTORY
|
||||||
|
ALTER TABLE t1 FORCE, ALGORITHM=INPLACE;
|
||||||
|
ALTER TABLE t2 FORCE, ALGORITHM=COPY;
|
||||||
|
OPTIMIZE TABLE t1;
|
||||||
|
--list_files $MYSQL_TMP_DIR/test
|
||||||
|
DROP TABLE t2;
|
||||||
|
|
||||||
|
RENAME TABLE t1 TO t2;
|
||||||
|
ALTER TABLE t2 ADD UNIQUE INDEX(b), RENAME TO t3;
|
||||||
|
|
||||||
|
ALTER TABLE t3 RENAME TO t2;
|
||||||
|
ALTER TABLE t2 DROP INDEX b, RENAME TO t1;
|
||||||
|
ALTER TABLE t1 CHANGE b c INT;
|
||||||
|
ALTER TABLE t1 CHANGE c b INT NOT NULL;
|
||||||
|
|
||||||
|
--list_files $MYSQL_TMP_DIR/test
|
||||||
|
# TRUNCATE TABLE will discard DATA DIRECTORY.
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
--list_files $MYSQL_TMP_DIR/test
|
||||||
|
DROP TABLE t1;
|
@ -4,6 +4,7 @@
|
|||||||
--source include/innodb_page_size_small.inc
|
--source include/innodb_page_size_small.inc
|
||||||
--source include/have_partition.inc
|
--source include/have_partition.inc
|
||||||
--source include/not_embedded.inc
|
--source include/not_embedded.inc
|
||||||
|
--source include/have_symlink.inc
|
||||||
SET default_storage_engine=InnoDB;
|
SET default_storage_engine=InnoDB;
|
||||||
LET $MYSQLD_DATADIR = `select @@datadir`;
|
LET $MYSQLD_DATADIR = `select @@datadir`;
|
||||||
LET $INNODB_PAGE_SIZE = `select @@innodb_page_size`;
|
LET $INNODB_PAGE_SIZE = `select @@innodb_page_size`;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
--source include/have_debug.inc
|
--source include/have_debug.inc
|
||||||
|
--source include/have_symlink.inc
|
||||||
let $table_data_dir=$MYSQLTEST_VARDIR/tmp/ddir;
|
let $table_data_dir=$MYSQLTEST_VARDIR/tmp/ddir;
|
||||||
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup;
|
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup;
|
||||||
mkdir $table_data_dir;
|
mkdir $table_data_dir;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
--source include/have_symlink.inc
|
||||||
let $table_data_dir=$MYSQLTEST_VARDIR/ddir;
|
let $table_data_dir=$MYSQLTEST_VARDIR/ddir;
|
||||||
mkdir $table_data_dir;
|
mkdir $table_data_dir;
|
||||||
--replace_result $table_data_dir table_data_dir
|
--replace_result $table_data_dir table_data_dir
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
--source include/have_partition.inc
|
--source include/have_partition.inc
|
||||||
|
--source include/have_symlink.inc
|
||||||
let $targetdir=$MYSQLTEST_VARDIR/backup;
|
let $targetdir=$MYSQLTEST_VARDIR/backup;
|
||||||
mkdir $targetdir;
|
mkdir $targetdir;
|
||||||
mkdir $MYSQLTEST_VARDIR/partitdata;
|
mkdir $MYSQLTEST_VARDIR/partitdata;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
--source include/have_partition.inc
|
--source include/have_partition.inc
|
||||||
|
--source include/have_symlink.inc
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-15953 Alter InnoDB Partitioned Table Moves Files (which were originally not in the datadir) to the datadir
|
--echo # MDEV-15953 Alter InnoDB Partitioned Table Moves Files (which were originally not in the datadir) to the datadir
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
--source include/have_partition.inc
|
--source include/have_partition.inc
|
||||||
|
--source include/have_symlink.inc
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-15953 Alter InnoDB Partitioned Table Moves Files (which were originally not in the datadir) to the datadir
|
--echo # MDEV-15953 Alter InnoDB Partitioned Table Moves Files (which were originally not in the datadir) to the datadir
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
-- source include/testdb_only.inc
|
-- source include/testdb_only.inc
|
||||||
-- source include/have_innodb.inc
|
-- source include/have_innodb.inc
|
||||||
--disable_warnings
|
-- source include/have_symlink.inc
|
||||||
DROP TABLE IF EXISTS t1,t2,t3;
|
|
||||||
--enable_warnings
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test for KEY_COLUMN_USAGE & TABLE_CONSTRAINTS tables
|
# Test for KEY_COLUMN_USAGE & TABLE_CONSTRAINTS tables
|
||||||
|
@ -4,7 +4,7 @@ Copyright (c) 2000, 2020, Oracle and/or its affiliates. All Rights Reserved.
|
|||||||
Copyright (c) 2008, 2009 Google Inc.
|
Copyright (c) 2008, 2009 Google Inc.
|
||||||
Copyright (c) 2009, Percona Inc.
|
Copyright (c) 2009, Percona Inc.
|
||||||
Copyright (c) 2012, Facebook Inc.
|
Copyright (c) 2012, Facebook Inc.
|
||||||
Copyright (c) 2013, 2021, MariaDB Corporation.
|
Copyright (c) 2013, 2022, MariaDB Corporation.
|
||||||
|
|
||||||
Portions of this file contain modifications contributed and copyrighted by
|
Portions of this file contain modifications contributed and copyrighted by
|
||||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||||
@ -11710,9 +11710,12 @@ create_table_info_t::create_options_are_invalid()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_create_info->data_file_name
|
if (!m_create_info->data_file_name
|
||||||
&& m_create_info->data_file_name[0] != '\0'
|
|| !m_create_info->data_file_name[0]) {
|
||||||
&& !create_option_data_directory_is_valid()) {
|
} else if (!my_use_symdir) {
|
||||||
|
my_error(WARN_OPTION_IGNORED, MYF(ME_JUST_WARNING),
|
||||||
|
"DATA DIRECTORY");
|
||||||
|
} else if (!create_option_data_directory_is_valid()) {
|
||||||
ret = "DATA DIRECTORY";
|
ret = "DATA DIRECTORY";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11986,7 +11989,8 @@ create_table_info_t::parse_table_name(
|
|||||||
CREATE TABLE ... DATA DIRECTORY={path} TABLESPACE={name}... ;
|
CREATE TABLE ... DATA DIRECTORY={path} TABLESPACE={name}... ;
|
||||||
we ignore the DATA DIRECTORY. */
|
we ignore the DATA DIRECTORY. */
|
||||||
if (m_create_info->data_file_name
|
if (m_create_info->data_file_name
|
||||||
&& m_create_info->data_file_name[0] != '\0') {
|
&& m_create_info->data_file_name[0]
|
||||||
|
&& my_use_symdir) {
|
||||||
if (!create_option_data_directory_is_valid()) {
|
if (!create_option_data_directory_is_valid()) {
|
||||||
push_warning_printf(
|
push_warning_printf(
|
||||||
m_thd, Sql_condition::WARN_LEVEL_WARN,
|
m_thd, Sql_condition::WARN_LEVEL_WARN,
|
||||||
@ -12457,8 +12461,9 @@ create_table_info_t::set_tablespace_type(
|
|||||||
used with TEMPORARY tables. */
|
used with TEMPORARY tables. */
|
||||||
m_use_data_dir =
|
m_use_data_dir =
|
||||||
m_use_file_per_table
|
m_use_file_per_table
|
||||||
&& (m_create_info->data_file_name != NULL)
|
&& m_create_info->data_file_name
|
||||||
&& (m_create_info->data_file_name[0] != '\0');
|
&& m_create_info->data_file_name[0]
|
||||||
|
&& my_use_symdir;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Initialize the create_table_info_t object.
|
/** Initialize the create_table_info_t object.
|
||||||
|
Reference in New Issue
Block a user