Mysql

我可以為特定的 MySQL 表指定不同的磁碟嗎?

  • September 7, 2017

我將家用機器用作我的愛好分析項目的個人數據庫。這台機器有一個 SSD 用於 MySQL 儲存其數據的主驅動器。它還有一個更大的輔助硬碟驅動器,而不是 SSD。我即將創建一個我擔心可能太大而無法放入我的 SSD 的表;我是否可以將一張表儲存在更大(但更慢)的驅動器上?如果重要的話,我通常使用 MyISAM 表,但如果有幫助的話,我可以說服使用 InnoDB。

正如這裡已經討論過的,MySQL 中沒有對符號連結的自動支持。但是,您可以自己創建符號連結。

將文件從數據目錄移動到其他地方,因為管理員創建符號連結

mklink 原始路徑 新路徑

如果你有一個古老的 Windows(比如 XP 或 Windows 2003),這是行不通的。NTFS 中的符號連結支持在 Vista 中首次亮相。

將單個 MyISAM 表遷移到另一個磁碟只能在 MySQL 的 Linux 版本而不是 Windows 中使用 MyISAM 表上的 ALTER TABLE 的 DATA DIRECTORY 和 INDEX DIRECTORY 子句進行。

但是,在 Windows 中,您可以手動將 .MYD 和 .MYI 文件移動到您想要的位置。

更新 2012-01-03 22:03 EDT

有趣的是,我的 Windows 7 機器上的 MySQL 5.5.15 說存在符號連結支持:

mysql> show variables like 'have_sym%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_symlink  | YES   |
+---------------+-------+
1 row in set (0.09 sec)

我還發現在 Windows 中可以進行符號連結:

在我家裡的 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>

您仍然不能在or中使用DATA DIRECTORYANDINDEX DIRECTORY選項。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 DIRECTORYandINDEX DIRECTORY選項,因為預設儲存引擎現在是 InnoDB。

儘管如此,您還是創建了空表,將 .MYD 和 .MYI 從作業系統移動到不同的文件夾,創建硬連結,執行FLUSH TABLES;和插入數據。

試一試,告訴我進展如何…

引用自:https://dba.stackexchange.com/questions/10108