为表中的所有分区设置公共DATA DIRECTORY

时间:2018-02-06 11:31:33

标签: mysql database-partitioning

我正在尝试使用DATA DIRECTORY

在另一个驱动器上创建分区表
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/stats_tables/test/db/mysql/';
Query OK, 0 rows affected (0.03 sec)

mysql> \! ls /stats_tables/test/db/mysql/db_test/
t1.ibd
mysql> drop table t1;
Query OK, 0 rows affected (0.01 sec)

因此我们看到在驱动器上成功创建了未分区的表。现在让我们用分区表尝试相同的事情:

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/stats_tables/test/db/mysql/' PARTITION BY HASH ( c1 ) PARTITIONS 10;
Query OK, 0 rows affected (0.34 sec)

mysql> \! ls /stats_tables/test/db/mysql/db_test/
mysql> \! ls /defa_storage/test/db/mysql/db_test/t1* | xargs -n1 basename
t1.frm
t1.par
t1#P#p0.ibd
t1#P#p1.ibd
t1#P#p2.ibd
t1#P#p3.ibd
t1#P#p4.ibd
t1#P#p5.ibd
t1#P#p6.ibd
t1#P#p7.ibd
t1#P#p8.ibd
t1#P#p9.ibd

我们看到,在这种情况下,它是在常规数据目录下创建的。 这在MySQL 5.5 documentation

中有完美的解释
  

使用InnoDB存储引擎为表定义分区时,DATA DIRECTORY和INDEX DIRECTORY选项无效。

虽然我使用的是5.6版,但its documentation中没有提到这样的限制。

无论如何,有没有办法为我的所有DATA DIRECTORY分区设置一个公共BY HASH

1 个答案:

答案 0 :(得分:1)

最后我发现我实际上可以用这种方式控制创建的分区:

CREATE TABLE ...
PARTITION BY HASH( ... )
(
    PARTITION p0 DATA DIRECTORY = '/another/directory',
    PARTITION p1 DATA DIRECTORY = '/another/directory', 
    PARTITION p2 DATA DIRECTORY = '/another/directory', 
    PARTITION p3 DATA DIRECTORY = '/another/directory', 
    ...
);

最后一部分可以通过任何脚本语言轻松生成,比如Python:

max_partitions = 100
for i in range(0, max_partitions):
  print("PARTITION p" + str(i) + " DATA DIRECTORY = '/another/directory',")