MySQL 4.0
より前は、テーブルのシンボリックリンクの実行を非常に慎重に行う必要がありました。シンボリックリンクが行われているテーブルで、ALTER
TABLE
、REPAIR
TABLE
、あるいは OPTIMIZE
TABLE
を実行する際に、シンボリックリンクが削除され、オリジナルファイルに置換されるという問題がありました。これらのステートメントは、データベースディレクトリにテンポラリファイルを作成し、ステートメントの操作が完了するとオリジナルファイルとテンポラリファイルの置換が行われる仕様であるため、この問題が発生しました。
realpath()
の呼び出しの機能が完全でないシステムではテーブルのシンボリックリンクを行わないでください(少なくとも、Linux
と Solaris では realpath()
がサポートされています)。
MySQL 4.0 では MyISAM
テーブルでのみシンボリックリンクが完全サポートされています。これ以外のテーブル型で上記のコマンドを使用すると、予想外の問題の発生の恐れがあります。
MySQL 4.0
でのシンボリックリンクの処理は、次のように機能します(ほとんどが
MyISAM
テーブルのみに適しています)。
データディレクトリには常にテーブル定義ファイル、データファイルおよびインデックスファイルがある。データファイルとインデックスファイルは、別の場所に移動し、データディレクトリ内でシンボリックリンクによって置換できる。定義ファイルはこれができない。
データファイルとインデックスファイルは、それぞれ独立して別のディレクトリにシンボリックリンクを作成できる。
シンボリックリンクは、オペレーティングシステムレベル(mysqld
が実行されていない場合)、または SQL で
CREATE TABLE
に DATA
DIRECTORY
および INDEX
DIRECTORY
オプションを指定して実行できる。 See
項6.5.3. 「CREATE TABLE
構文」。
myisamchk
は、データファイルやインデックスファイルのシンボリックリンクを置き換えない。
myisamchk
はリンクで指し示されているファイルに直接作用する。テンポラリファイルはすべてデータファイルやインデックスファイルが配置されているのと同じディレクトリに作成される。
シンボリックリンクを使用しているテーブルをドロップすると、シンボリックリンクとシンボリックリンクが指しているファイルの両方がドロップされる。このため、root
として mysqld
を実行すべきではなく、また、MySQL
データベースディレクトリへの書き込みアクセスをユーザに許可するべきでもない。
ALTER TABLE RENAME
を使用してテーブルの名前を変更し、テーブルを他のデータベースに移動しない場合、データベースディレクトリのシンボリックリンクの名前が新しい名前に変更され、データファイルとインデックスファイルもそれに従って名前が変更される。
ALTER TABLE RENAME
を使用してテーブルを別のデータベースに移動すると、テーブルが別のデータベースディレクトリに移動され、それまであったシンボリックリンクとそれが指すファイルが削除される(新規テーブルのシンボリックリンクは作成されない)。
シンボリックリンクを使用していない場合は、mysqld
に --skip-symlink
オプションを指定して使用し、確実に誰もデータディレクトリの外でファイルのドロップや名前の変更を行う
mysqld
を使用できないようにする。
サポートされていない事項
ALTER TABLE
では DATA
DIRECTORY
と INDEX DIRECTORY
テーブルオプションが無視される。
MySQL 4.0.15
より前は、テーブルにシンボリックリンクがある場合、SHOW
CREATE TABLE
でレポートが行われない。これは、SHOW
CREATE TABLE
を使用して CREATE
TABLE
ステートメントを生成する
mysqldump
についても同様である。
BACKUP TABLE
と RESTORE
TABLE
ではシンボリックリンクが考慮されない。
frm
ファイルはシンボリックリンクにすることがまったくできない(前述のように、データファイルとインデックスファイルのみシンボリックリンクにできる)。
これを実行した場合(シノニム作成など)、正しい結果が得られなくなる。
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
コマンドもエラーになる。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.