特定のMySQLテーブルに別のディスクを指定できますか?
-
16-10-2019 - |
質問
私は趣味分析プロジェクトの個人データベースとしてホームマシンを使用しています。このマシンには、MySQLがデータを保存するメインドライブ用のSSDがあります。また、SSDではなく大きくて大きいセカンダリハードドライブもあります。私は、SSDに収まるには大きすぎるのではないかと恐れているテーブルを作成しようとしています。代わりに、その1つのテーブルをより大きな(しかし遅い)ドライブに保存することは可能ですか?それが重要な場合、私は一般的にMyisamテーブルを使用していますが、それが役立つ場合はInnodbを使用するように説得される可能性があります。
解決 3
ローランドの答え ハードリンクが必要であることを除いて、ほとんど機能します。私が理解する限り、2つの異なる物理ドライブの間でハードリンクは不可能です(異なる物理ドライブを使用することが、新しいディレクトリが必要な唯一の理由です)。
しかし、彼の答え(そして Vladislav's)私にインスピレーションを見つけることができました 答え それは私のために働いているようです。要するに、aを作成します database_name.sym
ファイルして、ディレクトリに配置します database_name
のデータディレクトリ。その中に新しいディレクトリの名前を入れます .sym
ファイルしてから移動します database_name
で参照されている新しい場所へのデータディレクトリ .sym
ファイル。
他のヒント
ここですでに説明したように、MySQLにはSymlinksの自動サポートはありません。ただし、シンリンクを作成することができます。
管理者がシンボリックリンクを作成すると、ファイルをデータディレクトリから他の場所に移動します
Mklinkオリジナルパスニューパス
古代の窓(XPやWindows 2003など)がある場合、これは機能しません。 VistaでデビューしたNTFSのSymlinkサポート。
Sシングルミサムテーブルを別のディスクに移行します データディレクトリとインデックスディレクトリ条項を備えたMySQLのWindowsではなくLinuxバージョンでのみ可能 myisamテーブルのアルターテーブルの。
ただし、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
自宅のWindows7マシンでは、コマンドラインユーティリティ 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
オプション 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;
私は2つのディレクトリを作りました
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
Symlinksの代わりにハードリンクを作成します。おお !!!
WindowsのMySQLについて何かを学びました。 Oracleが実装するかどうかは疑わしい DATA DIRECTORY
と INDEX DIRECTORY
オプションデフォルトのストレージエンジンはInnodbになりました。
それにもかかわらず、空のテーブルを作成し、.mydと.myiをOSから異なるフォルダーに移動し、ハードリンクを作成し、実行します FLUSH TABLES;
データを挿入します。
試してみて、どうなるか教えてください...
これにハードリンクを使用するには、各ファイルにハードリンクを作成する必要があります。 MKLINKコマンドで /jを使用すると、ディレクトリジャンクションが作成され、その後、1つのコマンドMySQLがディレクトリ内のファイルを他のドライブに書き込みます。たとえば、c: datのジャンクションをより遅いドライブに作成し、クエリがインデックス付けされたときにより速いアクセスを得るためにSSDにC: ndxを残すことができます。