0

ファイルを DB にロードしようとしています。

CREATE TEMPORARY TABLE IF NOT EXISTS tt_emails (
    id INT PRIMARY KEY AUTO_INCREMENT,
    util_account_id VARCHAR(40) NULL,
    email VARCHAR(344) NOT NULL,
    optout INT NOT NULL
    );

LOAD DATA INFILE '/shared/implementation/emails.tsv'
    INTO TABLE tt_emails (util_account_id, email, optout);

email.tsv ファイルには 3 つの列があり、作成した一時テーブルには 4 つの列があります。これが正しい構文かどうかはわかりません。ID主キー列を持つために4番目の列を含めました。

このコードを実行すると、次のエラーが発生します。

ERROR 13 (HY000): Can't get stat of '/nfs/shared/implementation/ngma/CO-48812_NGMA_Load_email/exclude_emails.tsv' (Errcode: 13)
4

1 に答える 1

0

これは、UNIX/Linux ファイル システムのアクセス許可の問題です。

オペレーティング システムは、指定されたファイルへのアクセスを OS ユーザー権限で許可していません。

ファイルへのパス内のすべてのディレクトリに対する権限は、少なくとも読み取りと実行である必要があり、ファイル自体に対する権限は少なくとも読み取りである必要があります。

ファイルにアクセスしようとしている OS ユーザーは、MySQL Server プロセスが実行されている UNIX/Linux ユーザー アカウントです。(これは多くの場合「mysql」ですが、そうである必要はありません。実際には、MySQL がどのようにインストールおよびセットアップされたかによって異なります。

mysql サーバー ホストのシェル プロンプトから、次を実行します。

ps -ef | grep mysqld

出力には、mysqld を含む行が含まれているはずです。例えば:

mysql      2247  1233  0 Mar21 ?    00:24:09 /opt/mysql/bin/mysqld --basedir=/opt/...

出力の最初のフィールドは、MySQL サーバーが実行されている OS ユーザーを示しています。この場合、OS ユーザー「mysql」です。

「mysql」として OS にログインするか、「su - mysql」を実行してそのユーザーに切り替えると、そのファイルにアクセスしようとすると、同じ権限の問題が発生します。

/nfs/shared/implementation/ngma/CO-48812_NGMA_Load_email/exclude_emails.tsv

ファイルのパーミッションが OS ユーザー "mysql" によるファイルの読み取りを許可していないか、ファイルの上のディレクトリのパーミッションが OS ユーザー "mysql" による "read+execute" を許可していません。

ディレクトリとファイルのアクセス許可を適切に変更する必要があります。


厄介な回避策として、ファイルを /tmp にコピーします (シェル プロンプトから、ファイルに対する「読み取り」権限を持つ OS ユーザーとしてログインします)。/tmp ディレクトリでは、OS ユーザー "mysql" を含むすべてのユーザーが "read+execute" を許可する必要があります。

 cp /nfs/shared/implementation/ngma/CO-48812_NGMA_Load_email/exclude_emails.tsv /tmp/ 

次に、ファイルのアクセス許可を変更して、OS ユーザー「mysql」がファイルを読み取れるようにすることができます。ファイルを誰でも読めるようにするには:

 chmod ugo+r /tmp/exclude_emails.tsv

次に、MySQL サーバーに接続し、新しい /tmp/exclude_emails.tsv ファイルを参照する LOAD DATA を unning してみます。

もちろん、他のオプションは、元のファイルに適切にアクセス許可を設定することです (「mysql」ユーザー (または mysqld を実行している OS ユーザー) が必要なアクセス許可を持ち、パス内のすべてのディレクトリに.

要約すると、これは実際には MySQL サーバーの問題ではありません。これは、mysql OS ユーザーが実行しようとしているファイルへのアクセスを禁止するオペレーティング システムのアクセス許可の問題です。

于 2016-04-19T19:56:14.923 に答える