を使用してmysqlデータベースにデータをロードしようとしています
LOAD DATA LOCAL
INFILE A.txt
INTO DB
LINES TERMINATED BY '|';
この質問のトピックは、私が受け取る応答です。ローカルデータオフロードはデフォルトでオフになっていることを理解しており、コマンドlocal-infile=1
を使用して有効にする必要がありますが、このコマンドを配置する場所がわかりません。
クライアント接続をセットアップするときに、追加のオプションとしてそれを指定できます。
mysql -u myuser -p --local-infile somedatabase
これは、その機能がセキュリティホールを開くためです。したがって、本当に使用したい場合には、明示的に有効にする必要があります。
クライアントとサーバーの両方でローカルファイルオプションを有効にする必要があります。それ以外の場合は機能しません。サーバー側サーバー上のファイルに対して有効にするには、my.cnf
構成ファイルに以下を追加します。
loose-local-infile = 1
http://dev.mysql.com/doc/refman/5.6/en/load-data-local.html
これをmy.cnfに入れます-[client]
セクションは既に存在しているはずです(セキュリティについてあまり心配していない場合)。
[client]
loose-local-infile=1
これらすべては、私の新しいUbuntu 15.04では解決しませんでした。
LOCAL
を削除して、次のコマンドを取得しました。
LOAD DATA
INFILE A.txt
INTO DB
LINES TERMINATED BY '|';
しかし、私は得た:
MySQL said: File 'A.txt' not found (Errcode: 13 - Permission denied)
それが私を stackoverflowの別の質問に対するNelsonからのこの回答 に導き、問題を解決しました!
デフォルトのMySQLコネクタを備えたSpringBoot 2.1
これを解決するには、指示に従ってください
このグローバル変数を設定するには、MySQLのドキュメントに記載されている指示に従ってください https://dev.mysql.com/doc/refman/8.0/en/load-data-local.html
allowLoadLocalInfile = true例:jdbc:mysql:// localhost:3306/xxxx?useSSL = false&useUnicode = yes&characterEncoding = UTF-8&allowLoadLocalInfile = true
AWS MySQL 8.0 RDSでCSVファイルをインポートするときに同じ問題が発生しました。
mysql> LOAD DATA LOCAL INFILE '/tmp/your.csv' INTO TABLE test.demo2 FIELDS Terminateted by '、' ENCLOSED BY '"' Lines Terminateted by '\ n' IGNORE 1 LINES;
エラー1148(42000):このMySQLバージョンでは使用されたコマンドは許可されません
1)local_infile
パラメーターを確認します
mysql> SHOW VARIABLES LIKE 'local_infile';
2)クライアントからログアウトし、以下のパラメーターを使用して再ログインします。
mysql -u root -p -h rdsendpoint --local-infile=1
3)同じコマンドを実行する
mysql> LOAD DATA LOCAL INFILE '/tmp/your.csv' INTO TABLE test.demo2 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;
Query OK, 300 rows affected (0.01 sec)
Records: 300 Deleted: 0 Skipped: 0 Warnings: 0
ほんの少し追加。
Mysql.connector ver 8.0.16で別の生まれ変わりを見つけました。今ではallow_local_infile = Trueが必要です。そうでない場合、上記のエラーが表示されます。以前のバージョンで働いていた。
conn = mysql.connector.connect(Host=host, user=user, passwd=passwd, database=database, allow_local_infile=True)
MySQL 8.0リファレンスマニュアルを参照してください- 6.1.6 LOAD DATA LOCALのセキュリティ問題
サーバー側で、実行します
mysql.server start --local-infile
クライアント側で、実行します
mysql --local-infile database_name -u username -p
一番上の答えは正しいです。最初にMySQL CLIで直接確認してください。これで問題が解決した場合、Python [3]で動作させたい場合は、MySQLdb.connect
asパラメーターに渡すだけです。
self.connection = MySQLdb.connect(
Host=host, user=settings_DB.db_config['USER'],
port=port, passwd=settings_DB.db_config['PASSWORD'],
db=settings_DB.db_config['NAME'],
local_infile=True)