我可以为特定的MySQL表指定其他磁盘吗?
-
16-10-2019 - |
题
我将家用机器用作我的个人数据库,用于我的爱好分析项目。该计算机具有用于MySQL存储数据的主驱动器的SSD。它还具有更大的次要硬盘驱动器,而不是SSD。我要创建一张桌子,我担心可能太大而无法适合我的SSD;我是否有可能将一张桌子存储在较大(但较慢)的驱动器上?如果重要的话,我通常使用Myisam表,但可以说服使用InnoDB,如果有帮助的话。
其他提示
如这里已经讨论的那样,MySQL中没有自动支持。但是,您可以自己创建符号链接。
将文件从数据目录移至其他地方,因为管理员创建了符号链接
Mklink原始路径新路径
如果您有古老的窗户(例如XP或Windows 2003),那将行不通。 NTF中的Symlink支持在Vista首次亮相。
迁移的单个Myisam表到另一个磁盘是 仅在Linux版本而不是Windows中,MySQL具有数据目录和索引目录条款 在Myisam桌子上的Alter表。
但是,在Windows中,您可以手动将.myd和.myi文件移至想要的位置。
更新2012-01-03 22:03 EDT
有趣的是,我的Windows 7机器上的MySQL 5.5.15表示Symlink支持存在:
mysql> show variables like 'have_sym%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_symlink | YES |
+---------------+-------+
1 row in set (0.09 sec)
我还发现在Windows中可以进行同步链接:
- http://en.wikipedia.org/wiki/ntfs_symbolic_link
- http://en.wikipedia.org/wiki/symbolic_link#windows_7_.26_vista_symbolic_link
在我家里的Windows 7机器上,命令行实用程序 mklink
存在:
C:\Windows\system32>mklink
Creates a symbolic link.
MKLINK [[/D] | [/H] | [/J]] Link Target
/D Creates a directory symbolic link. Default is a file
symbolic link.
/H Creates a hard link instead of a symbolic link.
/J Creates a Directory Junction.
Link specifies the new symbolic link name.
Target specifies the path (relative or absolute) that the new link
refers to.
C:\Windows\system32>
我很震惊 !!!这意味着您可以尝试 CREATE TABLE ... DATA DIRECTORY='...' INDEX DIRECTORY='...'
在Windows中。
我只是尝试了:
use test
drop table if exists data_table;
drop table if exists data_table_sharded;
CREATE TABLE data_table (a int,primary key(a)) ENGINE=MyISAM;
CREATE TABLE data_table_sharded LIKE data_table;
ALTER TABLE data_table_sharded DATA DIRECTORY='C:\DAT' INDEX DIRECTORY='C:\NDX';
我刚到这个:
mysql> use test
Database changed
mysql> drop table if exists data_table;
Query OK, 0 rows affected (0.02 sec)
mysql> drop table if exists data_table_sharded;
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE data_table (a int,primary key(a)) ENGINE=MyISAM;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE data_table_sharded LIKE data_table;
Query OK, 0 rows affected (0.01 sec)
mysql> ALTER TABLE data_table_sharded DATA DIRECTORY='C:\DAT' INDEX DIRECTORY='C:\NDX';
Query OK, 0 rows affected, 2 warnings (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 2
mysql> show warnings;
+---------+------+----------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------+
| Warning | 1618 | <DATA DIRECTORY> option ignored |
| Warning | 1618 | <INDEX DIRECTORY> option ignored |
+---------+------+----------------------------------+
2 rows in set (0.00 sec)
mysql>
您仍然无法使用 DATA DIRECTORY
和 INDEX DIRECTORY
选项in CREATE TABLE
或者 ALTER TABLE
.
更新2012-01-03 22:45 EDT
我运行了这些命令
use test
drop table if exists data_table;
drop table if exists data_table_sharded;
CREATE TABLE data_table (a int,primary key(a)) ENGINE=MyISAM;
INSERT INTO data_table VALUES (71),(22),(128),(97),(18),(4),(112),(277);
CREATE TABLE data_table_sharded LIKE data_table;
我做了两个目录
mkdir C:\dat
mkdir C:\ndx
我创建了这些文件夹,并为data_table_sharded创建了硬链接
C:\MySQL\data\test>mklink /H data_table_sharded.MYD C:\dat\data_table_sharded.MYD
Hardlink created for data_table_sharded.MYD <<===>> C:\dat\data_table_sharded.MYD
C:\MySQL\data\test>mklink /H data_table_sharded.MYI C:\ndx\data_table_sharded.MYI
Hardlink created for data_table_sharded.MYI <<===>> C:\ndx\data_table_sharded.MYI
C:\MySQL\data\test>
我回到mySQL,从data_table加载了数据:
mysql> flush tables;
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO data_table_sharded SELECT * FROM data_table;
Query OK, 8 rows affected (0.00 sec)
Records: 8 Duplicates: 0 Warnings: 0
mysql> show create table data_table_sharded\G
*************************** 1. row ***************************
Table: data_table_sharded
Create Table: CREATE TABLE `data_table_sharded` (
`a` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`a`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> select * from data_table_sharded;
+-----+
| a |
+-----+
| 4 |
| 18 |
| 22 |
| 71 |
| 97 |
| 112 |
| 128 |
| 277 |
+-----+
8 rows in set (0.00 sec)
mysql> flush tables;
Query OK, 0 rows affected (0.00 sec)
mysql>
因此,可以做到。只是使用 mklink
创建硬链接而不是符号链接。哇 !!!
我对Windows了解了一些有关MySQL的知识。我怀疑Oracle是否会实施 DATA DIRECTORY
和 INDEX DIRECTORY
选项由于默认存储引擎现在是InnoDB。
尽管如此,您可以创建空表,将.myd和.myi移动到OS的不同文件夹,创建硬链接,运行 FLUSH TABLES;
并插入您的数据。
尝试一下,让我知道它的发展...
为此使用硬链接需要为每个文件创建一个硬链接。使用 /j上的mklink命令创建一个目录交界处,然后在该命令中,mySQL将在目录中写入文件到另一个驱动器。例如,您可以为C: dat创建一个连接到较慢的驱动器,然后在索引查询时将SSD上的C: ndx留在SSD上,以便更快地访问。