お仕事の関係で「MySQLのデータディレクトリ(インスタンス)を、物理的に別のディレクトリにしたい。」との要望があって、調査を依頼されました。
ちょっと調べて見たところ、MySQLのデータベースの実体はファイル(ディレクトリ)という事をしりました。
MySQLでは、datadir という変数があって、 この変数がデータベースディレクトリ名を保持しています。
このdatadirで指定されたパスの下にデータベースがフォルダとして作成されていくわけですね。
で、このdatadirの下に作成されるデータベースを物理的に違うディスクに置く方法ですが、 一番手っ取り早いのはシンボリックリンクです。 たとえば、/disk1/database1と/disk2/database2というデータベースを作りたければ、 CREATE DATABSEをせずに、mysql> SHOW VARIABLES LIKE 'datadir'; +---------------+-----------------------+ | Variable_name | Value | +---------------+-----------------------+ | datadir | /usr/local/mysql/var/ | +---------------+-----------------------+ 1 row in set (0.00 sec)
としてあげれば、大丈夫です。あとはリンク先のディレクトリに書き込みの権限を与えてあれば、 CREATE DATABASEせずに、USE database1とか通ります。で、CREATE TABLEでOK。 MySQLのデータベースって単なる空ディレクトリで、ファイルシステムを作成すると、データベースとして認識してくれるという凄いオチが・・・ つまり CREATE DATABASE hoge = mkdir hoge と等価なわけですね。 ・・・ちょっとビックリ。 ちなみに、InnoDB使っている場合は、my.cnfの設定で複数のディスクを指定できるんですが、 どのデータベースが、何処のディスクに入るか指定できるか見検証なので解らないです。 今度やってみよう。$ ln -s /disk1/database1 /usr/local/mysql/var/database1 $ ln -s /disk2/database2 /usr/local/mysql/var/database2