Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


8.11.3.1 シンボリックリンクの使用

データベースやテーブルをデータベースディレクトリからほかの場所に移動して、それらを新しい場所へのシンボリックリンクに置き換えることができます。これを実行したいと考える可能性があるのは、たとえば、データベースを空き領域の多いファイルシステムに移動する場合や、テーブルを別のディスクに分散させてシステムの速度を高める場合です。

InnoDB テーブルの場合、セクション14.5.4「テーブルスペースの位置の指定」に説明するように、シンボリックリンクの代わりに、CREATE TABLE ステートメントで DATA DIRECTORY 句を使用します。この新機能は、サポートされるクロスプラットフォーム技法です。

これを実行する推奨される方法は、データベースディレクトリ全体の別のディスクへのシンボリックリンクを作成することです。MyISAM テーブルのシンボルリンク作成は最後の手段として行います。

データディレクトリの場所を特定するには、次のステートメントを使用します。

SHOW VARIABLES LIKE 'datadir';
8.11.3.1.1 Unix 上のデータベースへのシンボリックリンクの使用

Unix で、データベースのシンボリックリンクを作成する方法は、まず空き領域のあるディスクにディレクトリを作成してから、MySQL データディレクトリからそれへのソフトリンクを作成することです。

shell> mkdir /dr1/databases/test
shell> ln -s /dr1/databases/test /path/to/datadir

MySQL は、1 つのディレクトリから複数のデータベースへのリンクをサポートしていません。データベースディレクトリとシンボリックリンクの置換は、データベース間のシンボリックリンクを作成しないかぎり、機能します。MySQL データディレクトリにデータベース db1 があり、db1 を指すシンボリックリンク db2 を作成するとします。

shell> cd /path/to/datadir
shell> ln -s db1 db2

その結果、db1 のすべてのテーブル tbl_a は、db2 にもテーブル tbl_a として表示されます。あるクライアントが db1.tbl_a を更新し、ほかのクライアントが db2.tbl_a を更新すると、問題が発生する可能性があります。

8.11.3.1.2 Unix 上の MyISAM へのシンボリックリンクの使用

シンボリックリンクは、MyISAM テーブルに対してのみ完全にサポートされています。ほかのストレージエンジンのテーブルで使用されているファイルの場合、シンボリックリンクを使用しようとすると、未知の問題が発生することがあります。InnoDB テーブルの場合は、代わりにセクション14.5.4「テーブルスペースの位置の指定」に説明する代替の技法を使用します。

完全に動作する realpath() 呼び出しがないシステムでは、テーブルのシンボリックリンクを作成しないでください。(Linux と Solaris では realpath() をサポートしています)。システムでシンボリックリンクをサポートしているかどうかを判断するには、次のステートメントを使用して、have_symlink システム変数の値をチェックします。

SHOW VARIABLES LIKE 'have_symlink';

MyISAM テーブルのシンボリックリンクの処理は次のように機能します。

  • データディレクトリには、常にテーブルフォーマット (.frm) ファイル、データ (.MYD) ファイル、およびインデックス (.MYI) ファイルがあります。データファイルとインデックスファイルは、ほかの場所に移動し、データディレクトリ内でシンボリックリンクによって置き換えることができます。フォーマットファイルはできません。

  • データファイルとインデックスファイルは、独立して別々のディレクトリへのシンボリックリンクを作成できます。

  • 実行中の MySQL サーバーにシンボリックリンクの作成を実行するように指示するには、CREATE TABLEDATA DIRECTORY および INDEX DIRECTORY オプションを使用します。セクション13.1.17「CREATE TABLE 構文」を参照してください。または、mysqld が実行中でない場合は、コマンド行から ln -s を使用して、シンボリックリンクの作成を手動で実行できます。

    注記

    DATA DIRECTORY および INDEX DIRECTORY オプションのいずれか、または両方で使用されるパスには、MySQL data ディレクトリを含めることができません。(Bug #32167)

  • myisamchk が、シンボリックリンクをデータファイルやインデックスファイルに置き換えません。それは、シンボリックリンクが指しているファイルに対して直接作用します。一時ファイルはすべてデータファイルやインデックスファイルが配置されているディレクトリに作成されます。同じことが ALTER TABLEOPTIMIZE TABLE、および REPAIR TABLE ステートメントにも当てはまります。

  • 注記

    シンボリックリンクを使用しているテーブルを削除すると、シンボリックリンクとシンボリックリンクが指しているファイルの両方が削除されます。これは、システム root として mysqld を実行したり、システムユーザーに MySQL データベースディレクトリへの書き込みアクセス権を許可したりしないきわめて正当な理由です。

  • ALTER TABLE ... RENAME または RENAME TABLE を使用してテーブルの名前を変更し、テーブルを別のデータベースに移動しない場合、データベースディレクトリのシンボリックリンクの名前が新しい名前に変更され、データファイルとインデックスファイルもそれに従って名前が変更されます。

  • ALTER TABLE ... RENAME または RENAME TABLE を使用してテーブルを別のデータベースに移動すると、テーブルが別のデータベースディレクトリに移動されます。テーブル名が変更された場合、新しいデータベースディレクトリ内のシンボリックリンクの名前が新しい名前に変更され、データファイルとインデックスファイルもそれに従って名前が変更されます。

  • シンボリックリンクを使用していない場合、--skip-symbolic-links オプションを付けて mysqld を起動し、だれも mysqld を使用して、データディレクトリ外のファイルを削除したり名前を変更したりできないようにします。

これらのテーブルシンボリックリンクの操作はサポートされていません。

  • ALTER TABLEDATA DIRECTORY および INDEX DIRECTORY テーブルオプションを無視します。

  • 前に示したように、データファイルとインデックスファイルにのみシンボリックリンクにできます。.frm ファイルはシンボリックリンクにできません。これを実行しようとすると (たとえば、1 つのテーブル名を別のテーブルのシノニムにするなど) 正しくない結果が生成されます。MySQL データディレクトリにデータベース db1、このデータベースにテーブル tbl1 があり、db1 ディレクトリに tbl1 を指すシンボリックリンク tbl2 を作成するとします。

    shell> cd /path/to/datadir/db1
    shell> ln -s tbl1.frm tbl2.frm
    shell> ln -s tbl1.MYD tbl2.MYD
    shell> ln -s tbl1.MYI tbl2.MYI

    あるスレッドが db1.tbl1 を読み取り、別のスレッドで db1.tbl2 を更新すると、問題が発生します。

    • クエリーキャッシュがだまされます (tbl1 が更新されていないことを知る方法がないため、古くなっている結果を返します)。

    • tbl2 に対する ALTER ステートメントが失敗します。

8.11.3.1.3 Windows 上のデータベースへのシンボリックリンクの使用

Windows では、データベースディレクトリにシンボリックリンクを使用できます。これにより、データベースディレクトリへのシンボリックリンクを設定して、それを別の場所 (別のディスク上など) に置くことができます。Windows でのデータベースシンボリックリンクの使用は、Unix でのそれらの使用に似ていますが、リンクのセットアップの手順は異なります。

mydb というデータベースのデータベースディレクトリを D:\data\mydb に配置したいとします。これを実行するには、MySQL データディレクトリ内に D:\data\mydb を指すシンボリックリンクを作成します。ただし、シンボリックリンクを作成する前に、必要に応じて D:\data\mydb ディレクトリを作成して、それが存在することを確認します。データディレクトリ内に mydb というデータベースディレクトリがすでにある場合は、それを D:\data に移動します。そうしないと、シンボリックリンクは無効になります。問題を避けるために、データベースディレクトリの移動時にサーバーが実行していないことを確認してください。

データベースシンボリックリンクを作成するための手順は Windows のバージョンによって異なります。

Windows Vista、Windows Server 2008 以降には、ネイティブのシンボリックリンクのサポートがあるため、mklink コマンドを使用して、シンボリックリンクを作成できます。このコマンドには管理者権限が必要です。

  1. 場所をデータディレクトリ内に変更します。

    C:\> cd \path\to\datadir
  2. データディレクトリで、データベースディレクトリの場所を指す mydb というシンボリックリンクを作成します。

    C:\> mklink /d mydb D:\data\mydb

このあと、データベース mydb に作成されるすべてのテーブルが D:\data\mydb に作成されます。

または、MySQL でサポートされる任意のバージョンの Windows で、データディレクトリに宛先ディレクトリのパスを格納する .sym ファイルを作成して、MySQL データベースへのシンボリックリンクを作成できます。ファイルは、db_name.sym という名前にしてください。ここで db_name はデータベース名です。

Windows で、.sym ファイルを使用したデータベースシンボリックリンクのサポートは、デフォルトで有効にされています。.sym ファイルシンボリックリンクが必要でない場合は、--skip-symbolic-links オプションで mysqld を起動して、それらのサポートを無効にできます。システムで .sym ファイルシンボリックリンクをサポートしているかどうかを判断するには、次のステートメントを使用して、have_symlink システム変数の値をチェックします。

SHOW VARIABLES LIKE 'have_symlink';

.sym ファイルシンボリックリンクを作成するには、次の手順を使用します。

  1. 場所をデータディレクトリ内に変更します。

    C:\> cd \path\to\datadir
  2. データディレクトリ内に、パス名 D:\data\mydb\ を含む mydb.sym というテキストファイルを作成します。

    注記

    新しいデータベースとテーブルのパス名は絶対パスにしてください。相対パスを指定する場合、場所は mydb.sym ファイルに相対的になります。

このあと、データベース mydb に作成されるすべてのテーブルが D:\data\mydb に作成されます。

注記

.sym ファイルのサポートは、mklink を使用して使用可能なネイティブシンボリックリンクのサポートと重複しているため、.sym ファイルの使用は、MySQL 5.6.9 現在非推奨にされ、それらのサポートは将来の MySQL リリースで削除されます。

Windows でのデータベースシンボリックリンクへの .sym ファイルの使用には、次の制限が適用されます。これらの制限は mklink を使用して作成されるシンボリックリンクには適用されません。

  • MySQL データディレクトリにデータベースと同じ名前のディレクトリが存在する場合、シンボリックリンクは使用されません。

  • --innodb_file_per_table オプションは使用できません。

  • mysqld をサービスとして実行する場合、リモートサーバーにマップされたドライブをシンボリックリンクのリンク先として使用することはできません。回避方法として、フルパス (\\servername\path\) を使用できます。


User Comments
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
Sign Up Login You must be logged in to post a comment.