リモート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)に設定しました
私はこの投稿が古いことを知っていますが、これはまだ検索結果に表示されます。この問題の解決策をオンラインで見つけることができなかったので、自分で解決することになりました。 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"を使用しましたが、これをあなたの好きなテキストエディターに置き換えてください。
キーワード「LOCAL」をクエリに追加するとうまくいきました:
LOAD DATA LOCAL INFILE 'file_name' INTO TABLE table_name
キーワードの詳細な説明は here にあります。
これは通常、ファイルアクセス許可の問題ですが、ポイント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び申し上げますが、二度と確認する必要はありません。
セクション[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
乾杯
エラー13は、許可の問題に他なりません。私でも同じ問題があり、mysqlテーブルにデータをロードすることができず、自分で問題を解決しました。
解決策は次のとおりです:
デフォルトでは
--local-infileは値0に設定されます
、LOAD DATA LOCAL INFILEを使用するには、有効にする必要があります。
mySQLを開始このように:
mysql -uユーザー名-p --local-infile
これにより、起動時にLOCAL INFILEが有効になり、使用時に問題が発生しなくなります。
私は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ファイルには、拡張子の前にテーブルと同じ名前を付ける必要があります。
Fedora/RHEL/CentOOを使用している場合、SELinuxを一時的に無効にできます。
setenforce 0
データをロードしてから、再度有効にします。
setenforce 1
私はこれを修正するのに多くの問題を抱えていました、するべき2つのことがあります:
ファイル/etc/mysql/my.cnf
をtwolocal-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/
にすることができます(これにより、ファイルがあるディレクトリを使用できます)。
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 ';'
私も過去数日にわたってこの問題に苦しんでおり、私も答えを求めてスタックオーバーフローに目を向けました。
ただし、MySQLにデータをインポートする最も簡単な方法は、実際には独自のインポートデータウィザードツールを使用することだという人はいません。
テーブルを右クリックすると、テーブルが表示されます。
上記の回答のどれも私を助けてくれなかったので、行き詰まっているならこれを使ってください! :)
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に役立つことを願っています
同じ問題が発生し、上記のソリューションを適用しました。
まず、私のテスト環境は次のとおりです
私のテスト結果は
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つのポイントは
すべてのパス要素が/からデータファイルパスへの読み取り権限を持っていることを確認します。たとえば、INFILEが「/home/hongsoog/study/mysql/memer.dat」をターゲットにしている場合、次のサブパスは誰でも読み取り可能、またはmysqlグループが読み取り可能です
Mysqlクライアントを「--in-file = 1」オプションなしで起動して使用する場合
データローカルファイルのロード...
エラー1148(42000):このMySQLバージョンでは使用されたコマンドは許可されません
要約すると、mysqlクライアントコマンドの「--in-file = 1」オプションと「LOAD DATA LOCAL INFILE ...」は密接に関連しています。
誰にでも役立つことを願っています。
古い:
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)
local_infile
はオンです SHOW VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
そうでない場合は、mysqld
を再起動します:
Sudo ./mysqld_safe --local-infile
csvファイルを/tmp
フォルダーに変更して、mysqlsが読み取れるようにします。
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
CPanelまたはphpmyadminを使用してCSV using LOAD DATA
をインポートする場合は、必ずUse LOCAL keyword
を有効にしてください。これは共有サーバー環境で機能しました。
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ファイルの許可に関連するもの