mariadb创建表数据目录不起作用

时间:2019-04-24 09:08:16

标签: mysql mariadb

我正尝试在here之后使用CREATE TABLE选项来data directory

我正在使用MariaDB 5.5,命令列表在下面...

MariaDB [test]> select version();
+----------------+
| version()      |
+----------------+
| 5.5.60-MariaDB |
+----------------+
1 row in set (0.00 sec)

MariaDB [test]> select @@datadir;
+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)

MariaDB [test]> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

MariaDB [test]> create table foo(c1 int) data directory='/home/mysql';
Query OK, 0 rows affected, 1 warning (0.36 sec)

MariaDB [test]> \! ls -al /var/lib/mysql/test    
drwx------. 2 mysql mysql    47  4월 24 18:02 .
drwxr-xr-x. 8 mysql mysql  4096  4월 24 17:55 ..
-rw-rw----. 1 mysql mysql    61  4월 24 17:55 db.opt
-rw-rw----. 1 mysql mysql  8556  4월 24 18:02 foo.frm
-rw-rw----. 1 mysql mysql 98304  4월 24 18:02 foo.ibd

MariaDB [test]> show warnings;
+---------+------+---------------------------------+
| Level   | Code | Message                         |
+---------+------+---------------------------------+
| Warning | 1618 | <DATA DIRECTORY> option ignored |
+---------+------+---------------------------------+
1 row in set (0.00 sec)

我发现--skip-symbolic-link被禁用,我在symbolic-links=TRUE中用my.cnf重新启动了mysqld

MariaDB [test]> show variables like 'have_symlink';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_symlink  | YES   |
+---------------+-------+
1 row in set (0.00 sec)

MariaDB [test]> drop table foo;
Query OK, 0 rows affected (0.03 sec)

MariaDB [test]> create table foo(c1 int) data directory='/external_data_dir';
Query OK, 0 rows affected (0.16 sec)

MariaDB [test]> \! ls -al /external_data_dir
total 4
drwxr-xr-x.  2 mysql mysql    6  4월 25 13:36 .
dr-xr-xr-x. 18 root  root  4096  4월 25 13:36 ..

MariaDB [test]> \! ls -al /var/lib/mysql/test
total 212
drwx------. 2 mysql mysql    47  4월 25 13:40 .
drwxr-xr-x. 8 mysql mysql  4096  4월 25 13:33 ..
-rw-rw----. 1 mysql mysql    61  4월 24 17:55 db.opt
-rw-rw----. 1 mysql mysql  8556  4월 25 13:40 foo.frm
-rw-rw----. 1 mysql mysql 98304  4월 25 13:40 foo.ibd

我认为它无法正常运行。我想念什么?

谢谢。

2 个答案:

答案 0 :(得分:1)

----- 2012-08-07 5.6.6里程碑9-添加或更改了功能-InnoDB -----

  

InnoDB现在支持CREATE TABLE语句的DATA DIRECTORY ='directory'子句,它使您可以在MySQL数据目录之外的位置创建InnoDB file-per-table表空间(.ibd文件)。 / p>      

有关其他信息,请参见Specifying the Location of a Tablespace

您要问的是MariaDB 5.5,它早于更改。回顾过去,MariaDB 5.5相当接近于MySQL 5.5,因此我认为MariaDB在您的版本中没有该功能。推荐您升级。 10.0 可能具有此功能,以及10.1和10.2和10.3。

请记住,pip install git+https://github.com/user_name/repo_name 可以在DATA DIRECTORY上使用,但不能在CREATE TABLE上使用。

我看到我的答案与MariaDB CREATE TABLE doc不同。我不能说出差异在哪里。消息“ ALTER TABLE选项被忽略”表示我是对的。

答案 1 :(得分:0)

问题很可能是由于mysql / mariadb无权写入该/ external_data_dir

的事实而产生的

解决方案在很大程度上取决于您使用的操作系统。

首先,无论Linux家族如何,都要确保该目录存在并且由用户mysql拥有:

mkdir /external_data_dir
chown -R mysql.mysql /external_data_dir

现在,如果您的Linux是RHEL / CentOS / Fedora,则需要检查是否已启用SELinux,如果是,则将其禁用(不推荐)或设置该目录的适当安全上下文(推荐的方法)< / p>

# check if SELinux is enabled
getenforce
# if it outputs 'Enforcing' then SELinux is enabled

# set proper SELinux context 
chcon -R -t mysqld_db_t /external_data_dir

# you could disable SELinux with the command below but it is not recommended
setenforce 0

您可以通过以下链接了解有关SELinux和MySQL / MariaDB的更多信息:https://blogs.oracle.com/jsmyth/selinux-and-mysql

如果您的Linux是Debian / Ubuntu,则可能需要检查AppArmor设置,这与SELinux等效。我没有使用AppArmor的经验,但只能告诉我它也可以完全禁用或正确设置以允许mysql访问非标准目录。 首先,您可以检查以下链接:https://blogs.oracle.com/jsmyth/apparmor-and-mysql

您将需要root / sudo访问权限才能运行上述所有内容。