web-dev-qa-db-ja.com

LOAD DATA INFILEエラーコード:13

リモートMySQLで、このクエリを実行しようとすると、MySQLエラーコード:13が表示されます。

クエリ-

_LOAD DATA INFILE 
'/httpdocs/.../.../testFile.csv'
INTO TABLE table_temp
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\r \\n'
(sku, qty);
_

エラーコード:13 Can't get stat of '/httpdocs/.../.../testFile.csv' (Errcode: 2)

a。データベースuserloginには、すべての付与特権があります。

_CREATE USER 'userName'@'%' IDENTIFIED BY '************';

GRANT ALL PRIVILEGES ON * . * TO 'userName'@'%' IDENTIFIED BY '************' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT ALL PRIVILEGES ON `userName\_%` . * TO 'userName'@'%';
_

b。 FTPツールを使用して、ファイルとフォルダーのアクセス許可をchmod 777(rwxrwxrwx)に設定しました

47
user292049

私はこの投稿が古いことを知っていますが、これはまだ検索結果に表示されます。この問題の解決策をオンラインで見つけることができなかったので、自分で解決することになりました。 Ubuntuを使用している場合は、MySQLがファイルを表示できないようにする「Apparmor」というプログラムがあります。 MySQLが「tmp」ディレクトリからファイルを読み取れるようにする場合、次の手順を実行する必要があります。

Sudo vim /etc/apparmor.d/usr.sbin.mysqld

ファイルを開くと、MySQLが使用できる一連のディレクトリが表示されます。行/tmp/** rwkをファイルに追加します(どこに問題があるかわかりませんが、ここに配置場所のサンプルを示します)。

  /etc/mysql/*.pem r,

  /etc/mysql/conf.d/ r,

  /etc/mysql/conf.d/* r,

  /etc/mysql/*.cnf r,

  /usr/lib/mysql/plugin/ r,

  /usr/lib/mysql/plugin/*.so* mr,

  /usr/sbin/mysqld mr,

  /usr/share/mysql/** r,

  /var/log/mysql.log rw,

  /var/log/mysql.err rw,

  /var/lib/mysql/ r,

  /var/lib/mysql/** rwk,


  /tmp/** rwk,


  /var/log/mysql/ r,

  /var/log/mysql/* rw,

  /var/run/mysqld/mysqld.pid w,

  /var/run/mysqld/mysqld.sock w,

  /run/mysqld/mysqld.pid w,

  /run/mysqld/mysqld.sock w,

これで、Apparmorをリロードするだけで済みます。

Sudo /etc/init.d/apparmor reload

注: "vim"を使用しましたが、これをあなたの好きなテキストエディターに置き換えてください。

98
Nelson

キーワード「LOCAL」をクエリに追加するとうまくいきました:

LOAD DATA LOCAL INFILE 'file_name' INTO TABLE table_name

キーワードの詳細な説明は here にあります。

53
Matthias Munz

これは通常、ファイルアクセス許可の問題ですが、ポイントbで既に対処しているようですが、念のために検討する価値があります。別のオプションは、LOAD DATA LOCAL INFILEを使用することです。これは、ファイルアクセス許可のこれらの問題の多くを乗り越えます。この方法を使用するには、最初にファイルをローカルにコピーする必要があります(mysqlフォルダーが最適です)。 LOCALが指定されている場合、ファイルはクライアントホスト上のクライアントプログラムによって読み取られ、サーバーに送信されます。

ディレクトリの権限が不十分です

この例のエラーは、インポートしようとしているファイルが、MySqlサーバーを実行しているユーザーが読み取り可能なディレクトリにないために発生しました。これが機能するためには、MySqlユーザーが読み取り可能なディレクトリのすべての親ディレクトリに注意してください。これは通常、すべてのユーザーが読み取り可能(および書き込み可能)であるため、ファイルを/ tmpに保存すると正常に機能します。エラーコード番号は13です。ソース

編集:

ファイルを保持するフォルダーだけでなく、上位ディレクトリのアクセス許可も必要になることを忘れないでください。

this の例は、MySqlフォーラムに投稿します。

ファイルが次の構造内に含まれていた場合:/tmp/imports/site1/data.file

これらのディレクトリの 'other'にはr + xが必要だと思います(755は機能したと思います):

/ tmp

/ tmp/imports

主な2つ:

/ tmp/imports/site1

/tmp/imports/site1/data.file

ファイルとディレクトリは誰でも読み取り可能にする必要があります。既にこの方法を試してみたが、手順をたどる価値がある場合はおifび申し上げますが、二度と確認する必要はありません。

19
JonVD

セクション[mysqld]の下のmysql構成ファイルには、名前がtmpdirのプロパティが1つあります

例えば:

tmpdir = c:/temp (Windows) or tmpdir = /tmp (Linux)

およびLOAD DATA INFILEコマンドは、この場所でのみ読み取りと書き込みを実行できます。

そのため、指定した場所にファイルを配置すると、LOAD DATA INFILEは、任意のファイルを簡単に読み書きできます。

もう1つのソリューション

次のコマンドでもデータをインポートできます

load data local infile

この場合、ファイルをtmpdirに移動する必要はありません。ファイルの絶対パスを指定できますが、このコマンドを実行するには、1つのフラグ値を変更する必要があります。フラグは

--local-infile

mysqlにアクセスしながらコマンドプロンプトで値を変更できます。

mysql -u username -p --local-infile=1

乾杯

14
Ankit Sharma

エラー13は、許可の問題に他なりません。私でも同じ問題があり、mysqlテーブルにデータをロードすることができず、自分で問題を解決しました。

解決策は次のとおりです:

デフォルトでは

--local-infileは値0に設定されます

LOAD DATA LOCAL INFILEを使用するには、有効にする必要があります。

mySQLを開始このように:

mysql -uユーザー名-p --local-infile

これにより、起動時にLOCAL INFILEが有効になり、使用時に問題が発生しなくなります。

5
Avnish Mehta

私はUbuntu 12.04を使用しています。テーブルを作成してから、次のいずれかを実行する必要がありました。

Localを使用するとエラーが発生します(mysql 5.5):

> LOAD DATA LOCAL INFILE "file.csv" INTO table inverter FIELDS TERMINATED BY ',';
ERROR 1148 (42000): The used command is not allowed with this MySQL version

LOAD DATA INFILEコマンドは、セキュリティ上の理由からデフォルトで無効になっています。ここで再度有効にすると、動作するはずです: https://stackoverflow.com/a/16286112/445131

Mysqlimportを使用してcsvファイルをインポートできます。

mysqlimport -u root -p --fields-terminated-by=',' --local dbname tablename.csv

Csvファイルには、拡張子の前にテーブルと同じ名前を付ける必要があります。

5
Flem

Fedora/RHEL/CentOOを使用している場合、SELinuxを一時的に無効にできます。

setenforce 0

データをロードしてから、再度有効にします。

setenforce 1
2
bryant1410

私はこれを修正するのに多くの問題を抱えていました、するべき2つのことがあります:

  • ファイル/etc/mysql/my.cnftwolocal-infile =1段落の後の[mysql]で更新します(これにより、LOCAL INFILE sqlコマンドを使用できます)。

  • Sudo gedit /etc/apparmor.d/usr.sbin.mysqldを介して更新すると、apparmorは次の行を追加することで/var/www/の特殊ファイルに書き込むことができます。

/name of your directory/ r,

/name of your directory/* rw,

ディレクトリの名前は/var/www/toto/にすることができます(これにより、ファイルがあるディレクトリを使用できます)。

2
solo

MacでXAMPPを使用している場合、これは私のために働いた:

次のようにCSV/TXTファイルを/ Applications/XAMPP/xamppfiles/htdocs /に移動します

LOAD DATA LOCAL INFILE '/Applications/XAMPP/xamppfiles/htdocs/file.csv' INTO TABLE `tablename` FIELDS TERMINATED BY ',' LINES TERMINATED BY ';'
1
MMSA

私も過去数日にわたってこの問題に苦しんでおり、私も答えを求めてスタックオーバーフローに目を向けました。

ただし、MySQLにデータをインポートする最も簡単な方法は、実際には独自のインポートデータウィザードツールを使用することだという人はいません。

テーブルを右クリックすると、テーブルが表示されます。

just right click on the table and it comes up there

上記の回答のどれも私を助けてくれなかったので、行き詰まっているならこれを使ってください! :)

1
marcz2007

ubuntuユーザー向け

私はUbuntu 15.10でmysql 5.6.28を実行していますが、まったく同じ問題に遭遇しました.my.cnf tmpdir =/tmp local-infile = 1にすべての必要なフラグがあり、mysqlを再起動しましたが、まだLOAD DATA INFILEを取得しますエラーコード:13

ネルソンがこの問題が「装甲」であると述べたように、許可に関するmysqlをご愛顧いただいているように、 this 迅速かつ簡単なチュートリアルのおかげで解決策を見つけました。

基本的に、tmpディレクトリが/tmp

新しいtmpdirエントリを/etc/apparmor.d/local/usr.sbin.mysqldに追加します

Sudo nano /etc/apparmor.d/local/usr.sbin.mysqld

*これを追加

/tmp/ r,
/mnt/foo/tmp/** rw,

AppArmorをリロードする

Sudo service apparmor reload

MySQLを再起動します

Sudo service mysql restart

それが少数のUbuntu-ersに役立つことを願っています

1
Arnaud Bouchot

同じ問題が発生し、上記のソリューションを適用しました。

まず、私のテスト環境は次のとおりです

  • Ubuntu 14.04.3 64ビット
  • mysql Ver 14.14 Distrib 5.5.47、readline 6.3を使用したdebian-linux-gnu(x86_64)用(「Sudo apt-get install ...」コマンドでインストール)

私のテスト結果は

i)AppArmorソリューションは、/ tmpの場合にのみ機能します。

ii)以下のソリューションは、AppArmorソリューションなしで機能します。 Avnish Mehtaの回答に感謝します。

$ mysql -u root -p --in-file=1
...
mysql> LOAD DATA LOCAL INFILE '/home/hongsoog/study/mysql/member.dat'
    -> INTO TABLE member_table;

重要な3つのポイントは

  • --in-file = 1オプションでmysqlクライアントを起動します
  • lOAD DATA INFILEの代わりにLOAD DATA LOCAL INFILEを使用します
  • すべてのパス要素が/からデータファイルパスへの読み取り権限を持っていることを確認します。たとえば、INFILEが「/home/hongsoog/study/mysql/memer.dat」をターゲットにしている場合、次のサブパスは誰でも読み取り可能、またはmysqlグループが読み取り可能です

    • / home
    • / home/hongsoog
    • / home/hongsoog/study/mysql
    • /home/hongsoog/study/mysql/member.data

Mysqlクライアントを「--in-file = 1」オプションなしで起動して使用する場合

データローカルファイルのロード...

エラー1148(42000):このMySQLバージョンでは使用されたコマンドは許可されません


要約すると、mysqlクライアントコマンドの「--in-file = 1」オプションと「LOAD DATA LOCAL INFILE ...」は密接に関連しています。

誰にでも役立つことを願っています。

0
Hongsoog

古い:

LOAD DATA INFILE '/home/root12/Downloads/task1.csv' INTO TABLE test.task FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;

File '/home/root12/Downloads/task1.csv' not found (Errcode: 13 - Permission denied)

私のための新しい仕事:

LOAD DATA LOCAL INFILE '/home/root12/Downloads/task1.csv' INTO TABLE test.task FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;

Query OK, 500 rows affected, 284 warnings (1.24 sec)
Query OK, 5000 rows affected, 2846 warnings (1.24 sec)
0
Ashish Gupta
  1. このシステム変数をチェックアウトlocal_infileはオンです
 SHOW VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON    |
+---------------+-------+

そうでない場合は、mysqldを再起動します:

Sudo ./mysqld_safe --local-infile
  1. csvファイルを/tmpフォルダーに変更して、mysqlsが読み取れるようにします。

  2. dbへのインポート

mysql> LOAD DATA INFILE '/tmp/a.csv'  INTO TABLE table_a  FIELDS TERMINATED BY ','  ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
Query OK, 18 rows affected (0.17 sec)
Records: 18  Deleted: 0  Skipped: 0  Warnings: 0
0
bitfishxyz

CPanelまたはphpmyadminを使用してCSV using LOAD DATAをインポートする場合は、必ずUse LOCAL keywordを有効にしてください。これは共有サーバー環境で機能しました。

0
J R

load data infile '/root/source/in.txt' into table employee; ==>エラーコード:13

load data infile '/tmp/in.txt' into table employee; ==>動作します

CentOSリリース6.6(最終)-5.5.32 MySQL Community Server(GPL)

linuxファイルの許可に関連するもの

0
shaluotuo