realpath()の呼び出しの機能が完全でないシステムではテーブルのシンボリックリンクを行わないでください。(少なくとも、Linux
と Solaris では
realpath()がサポートされています)。
SHOW VARIABLES LIKE
'have_symlink'ステートメントを発行することで、ユーザのシステムがシンボリックリンクをサポートするかチェックできます。.
MySQL 4.0 では
MyISAMテーブルでのみシンボリックリンクが完全サポートされています。
これ以外のテーブル型で上記のコマンドを使用すると、予想外の問題の発生の恐れがあります。
MySQL 4.0
でのMyISAMテーブルのシンボリックリンクの処理は次のように機能します。
データディレクトリには常にテーブル定義ファイル(.frm)
、データファイル(.MYD)
およびインデックスファイル(.MYI)
がある。データファイルとインデックスファイルは、別の場所に移動し、データディレクトリ内でシンボリックリンクによって置換できる。定義ファイルはこれができない。
データファイルとインデックスファイルは、それぞれ独立して別のディレクトリにシンボリックリンクを作成できる。
シンボリックリンクは、オペレーティングシステムレベル(mysqld
が実行されていない場合)、または SQL で
CREATE TABLEに DATA
DIRECTORYおよび INDEX
DIRECTORYオプションを指定して実行できる。
詳しくは項12.1.8. 「CREATE TABLE 構文」を参照してください。あるいは、シンボリックリンクはln
-sを使用してコマンドラインから手動で行えますが、
これはmysqldが作動していない場合に限ります。
myisamchkは、データファイルやインデックスファイルのシンボリックリンクを置き換えない。myisamchk
はリンクで指し示されているファイルに直接作用する。テンポラリファイルはすべてデータファイルやインデックスファイルが配置されているのと同じディレクトリに作成されます。
同様のことがALTER
TABLE、OPTIMIZE
TABLE、そしてREPAIR
TABLEステートメントでいえます。
注:シンボリックリンクを使用しているテーブルをドロップすると、シンボリックリンクとシンボリックリンクが指しているファイルの両方がドロップされる。このため、rootとして
mysqldを実行すべきではなく、また、MySQL
データベースディレクトリへの書き込みアクセスをユーザに許可するべきでもない。
ALTER TABLE ...
RENAMEを使用してテーブルの名前を変更し、テーブルを他のデータベースに移動しない場合、データベースディレクトリのシンボリックリンクの名前が新しい名前に変更され、データファイルとインデックスファイルもそれに従って名前が変更される。
ALTER TABLE ...
RENAMEを使用してテーブルを別のデータベースに移動すると、テーブルが別のデータベースディレクトリに移動され、それまであったシンボリックリンクとそれが指すファイルが削除される(新規テーブルのシンボリックリンクは作成されない)。
シンボリックリンクを使用していない場合は、mysqldに
--skip-symbolic-linksオプションを指定して使用し、確実に誰もデータディレクトリの外でファイルのドロップや名前の変更を行う
mysqldを使用できないようにする。
サポートされていないテーブルシンボリックリンクオペレーション
ALTER TABLEでは DATA
DIRECTORYと INDEX DIRECTORY
テーブルオプションが無視される。
BACKUP TABLEとRESTORE
TABLEではシンボリックリンクが考慮されない。
.frmファイルはシンボリックリンクにすることがまったくできない(前述のように、データファイルとインデックスファイルのみシンボリックリンクにできる)。
これを実行した場合(シノニム作成など)、正しい結果が得られなくなる。
MySQL データディレクトリにデータベース
db1があり、このデータベースにはテーブル
tbl1が、db1ディレクトリには
tbl1を指すシンボリックリンク
tbl2があるとする。
shell>cdshell>/path/to/datadir/db1ln -s tbl1.frm tbl2.frmshell>ln -s tbl1.MYD tbl2.MYDshell>ln -s tbl1.MYI tbl2.MYI
あるスレッドで
db1.tbl1が読み取られ、別のスレッドで
db1.tbl2が更新されると、問題が発生する。
クエリキャッシュが「欺かれ」(tbl1が更新されていないと判断され、最新でない結果が返される)。
tbl2に対するALTERステートメントもエラーになる。
