7

を使用して 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でしょうか?

4

4 に答える 4

16
mysqlimport --local <database> <infile>

また

LOAD DATA LOCAL INFILE... should fix the issue.
于 2010-12-01T19:47:41.250 に答える
2

同様の問題(でファイルを読み取ることができない)が発生し、問題を修正した後/tmpに追加しました。LOCALLOAD DATA INFILE

このLaunchpadのバグレポートには、なぜこれが起こっているのかについての説明があるかもしれません。

于 2011-01-06T17:57:52.540 に答える
2

Errcode 13 は、アクセス許可がないことを意味します (ファイルが存在しないことを意味する Errcode 2 とは対照的です)。MySQL は、ファイルが誰でも読み取り可能である必要があります。ファイルのアクセス許可は問題ありません。

以前、CentOS サーバーで同じ問題が発生しました。これは、MySQL アプリケーションが /etc/apparmor.d/usr. sbin. mysqld のホワイトリストにリストされていないファイルにアクセスすることを禁止するAppArmorが原因でした。おそらく、同様の動作を引き起こす何らかのセキュリティスーツを持っていますか?

他の人が述べたように、 LOAD DATA INFILE LOCALを使用すると回避できます。

于 2013-02-01T09:26:58.820 に答える
1

Linux サーバー ディストリビューション (RedHat Enterprise Linux や CentOS など) を使用している場合、Errno 13 は SELinux が原因である可能性があります。「audit.log」をチェックして、SELinux がパスについて不平を言っているかどうかを確認し/tmp2ます。その後、パスを追加してsemanage fcontext -a -t mysqld_db_t "/tmp2(/.*)?"実行できますrestorecon -R /tmp2

ただし、解決策はもっと簡単かもしれません。方法を知っていれば、(回答を提供するのではなく)あなたの質問の下に直接回答したでしょう..

于 2010-10-19T18:51:06.590 に答える