我可以為特定的 MySQL 表指定不同的磁碟嗎?
我將家用機器用作我的愛好分析項目的個人數據庫。這台機器有一個 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 中可以進行符號連結:
- 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>
您仍然不能在or中使用
DATA DIRECTORY
ANDINDEX 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 DIRECTORY
andINDEX DIRECTORY
選項,因為預設儲存引擎現在是 InnoDB。儘管如此,您還是創建了空表,將 .MYD 和 .MYI 從作業系統移動到不同的文件夾,創建硬連結,執行
FLUSH TABLES;
和插入數據。試一試,告訴我進展如何…