を使用して MySQL にデータをロードしようとするスクリプトがありますLOAD DATA INFILE
。何らかの理由で、ファイルが/tmp
ディレクトリにある場合は機能しますが、ファイルが同じ権限を持つ別のディレクトリにある場合は機能しません。MySQL にディレクトリまたはデータベース ディレクトリの外部からデータをインポートさせる方法が見つかりませんが/tmp
、その理由を説明しているマニュアルは見つかりません。
状況:
$ ls -l /
...
drwxrwxrwt 21 root root 4096 2010-10-19 20:02 tmp
drwxrwxrwt 2 root root 4096 2010-10-19 20:14 tmp2
$ ls -l /tmp/data.csv
-rwxr-xr-x 1 timm timm 415431 2010-10-19 20:02 /tmp/data.csv
$ ls -l /tmp2/data.csv
-rwxr-xr-x 1 timm timm 415431 2010-10-19 20:14 /tmp2/data.csv
AFAICT これらは重要な点で同一です。ただし、MySQL コマンドラインで次のようにすると:
> LOAD DATA INFILE '/tmp2/data.csv' IGNORE INTO TABLE ports
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY ' ';
ERROR 29 (HY000): File '/tmp2/data.csv' not found (Errcode: 13)
> LOAD DATA INFILE '/tmp/data.csv' IGNORE INTO TABLE ports
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY ' ';
Query OK, 1 row affected, 1 warning (0.04 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
フォーラムの投稿から、errno 13 が許可の問題を示していることを収集しました。は MySQL で特別扱いされているようです/tmp
が、なぜですか? 私ができる最も近いのは、マニュアルの次の行です。
セキュリティ上の理由から、サーバー上にあるテキスト ファイルを読み取る場合、ファイルはデータベース ディレクトリに存在するか、すべてのユーザーが読み取り可能である必要があります。
/tmp
データベースディレクトリにはありませんが、そうであるかのように扱われる可能性があります。では、外部のファイルを読み取るためには、どのように設定すればよい/tmp
でしょうか?