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>cd
shell>/path/to/datadir
/db1ln -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
ステートメントもエラーになる。