MySQL:LOAD DATA LOCAL INFILEを有効にする


127

Mysql 5.5をUbuntu 12 LTSで実行しています。my.cnfでLOAD DATA LOCAL INFILEを有効にするにはどうすればよいですか?

さまざまな場所で設定にlocal-infileを追加しようとしましたが、「このMySQLバージョンでは使用されたコマンドは許可されていません」というメッセージが表示されます

回答:


197

MySQL 5.5マニュアルページから:

LOCALは、サーバーとクライアントの両方が許可するように構成されている場合にのみ機能します。たとえば、mysqldが--local-infile = 0で起動された場合、LOCALは機能しません。セクション6.1.6「LOAD DATA LOCALのセキュリティ問題」を参照してください。

オプションを設定する必要があります:

local-infile=1

あなたに[mysqlの]とmy.cnfのファイルまたはコールmysqlクライアントのエントリ--local-infileをオプション:

mysql --local-infile -uroot -pyourpwd yourdbname

「ローカルinfile」機能のサーバー側を有効にするには、同じパラメーターが[mysqld]セクションにも定義されていることを確認する必要があります。

これはセキュリティ制限です。


4
どうも。ところで、my.cnfパスは/etc/mysql/my.cnf私のマシン(AWS EC2)にあります。
SparkAndShine 2015年

興味深いことに、my.cnfファイルは/ etcディレクトリにありました。
SgtRock 2015

これがまだ失敗する場合にどこに行くかについてのアイデア。[client]、[mysqld]、および[mysql]の下のmy.cnfファイルにlocal-infile = 1を追加し、これらの組み合わせを使用しました。すべて同じ結果になります。ワークベンチを再起動してみましたが、うまくいきませんでした。各変更の間にmySQLワークベンチも停止して開始しました。
OrwellHindenberg、2015

2
mySQLを6.2.5に更新すると、この問題は解決しました
OrwellHindenberg、2015

答えは正しい方向です。しかし、ここでこの問題に直面している人にとっては、別の問題があります。システムでapparmorを有効にしても問題が解決しない場合は、syslogをチェックして、mysqldデーモンがブロックされているかどうかを確認してください。私はこの問題を抱えていました:apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/var/www/myfile.csv" pid=19488 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=106 ouid=33。解決策は非常に簡単です。を更新して/etc/apparmor.d/local/usr.sbin.mysqld、apparmorサービスをリロードしてください。
レオ

60

編集するmy.cnfファイルは/etc/mysql/my.cnfファイルです。ただ:

sudo nano /etc/mysql/my.cnf

それから加えて:

[mysqld]
local-infile 

[mysql]
local-infile 

ヘッダー[mysqld][mysql]はすでに指定されています。ファイルでそれらを見つけて、それぞれの下にlocal-infileを追加します。

Ubuntu 12.04 LTS上のMySQL 5.5で動作します。


1
これにより、Ubuntu 12.04で間違いなく修正されました。
John Fiala

4
確認Ubuntu 14.04.2 LTS not workingもでき ます。
Ain Tohvri 2015年

Macでも動作します。Macユーザーの場合、/mysql/my.cnfデフォルトでは存在しません。ディレクトリとファイルを作成し、これらの行をファイルに貼り付けるだけです。
鄭劉

mysqlがアップグレードされたときにこの構成を上書きしたくない場合は、これを次の場所に配置する必要があります。/etc/mysql/conf.d/enable-local-infile.cnf またsudo service mysql restart、構成を変更した後、それを有効にしてください。
Stephen Ostermiller

これは適切な解決策です。最高賛成のソリューションでは、local-infileの行の前に[mysqld]を最初に配置する必要があることに言及していません。
user3260912

30

php5-mysqlドライバーをネイティブドライバーに置き換えます。

デビアンについて

apt-get install php5-mysqlnd

これはうまくいった!ストックaws 12.04 ubuntuを使用して、RDSに接続しているときに「ローカル」が必要でした。どうもありがとう!
Jamesボウラー、2014

おかげで、このソリューションは私のために働いた。私はstackoverflow.com/questions/36526102/…
user75472

成功なしubuntu 12.04
Zbyszek 2017年

別の幸せな顧客!ubuntu 14.04 mysql 5.7
nodoze

27

MySQL 8.0.11でこの問題をmysqlターミナルコマンドで解決しました。

SET GLOBAL local_infile = true;

私はいつものように最初にログインしたことを意味します:

mysql -u user -p*

その後、次のコマンドでステータスを確認できます。

SHOW GLOBAL VARIABLES LIKE 'local_infile';

オンになっているはずです。ここでは、ローカルファイルをデータベースにロードすることによって発行されるセキュリティについては説明しません。


他の多くの解決策を試しましたが、コマンドのみがSET GLOBAL local_infile = true; 機能します。MySQLのバージョンは8.0.12です。多分これは最新の解決策です。どうもありがとう。
mathsyouth 2018

1
残念ながら、サーバーを再起動した後、変数は再びオフになります。
ペドロ

再起動後もグローバル変数 'local_infile'が常にONになるため、Mohit、どういうわけか私はそれを解決しました。そして、これにはmy.cnfファイルを使用しなかったようです。PhpMyAdmin、最新バージョンにrootとしてログインし、「変数」セクションに移動して「local_infile」を検索し、「編集」をクリックして「オン」に変更し、最後にEnterキーを押してみてください。うまくいきましたか?
Oleksiy Muzalyev

2
この答えだけ8.0.12 MySQL Community ServerがWindows で私に役立ちました。
endo64 2018年

MySQL 8.0.16をWindowsサーバー2016にインストールしましたSET GLOBAL local_infile = true;が、コマンドを実行しましたが、同じエラーERROR 1148 (42000): The used command is not allowed with this MySQL versionが発生しますが、mysqlへの--load-infile = 1での接続は機能しましたmysql --local-infile=1 -u root -p
Junior

13

ubuntu上のmysqlのフレーバーがどのような状況でも機能せず、依然として1148エラーが発生する場合は、load data infileコマンドラインからコマンドを実行できます

ターミナルウィンドウを開く

走る mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

mysqluserパスワードを挿入するように要求されます

MySQLMonitorを実行し、コマンドプロンプトは次のようになります。 mysql>

load data infileコマンドを実行します(セミコロンで終了することを忘れないでください;

このような:

load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

9

下の画像を参照...

--local-infile=1通常のmysqlコマンドに追加し ましたmysql -u root -p

したがって、合計行は次のようになります。

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

ここに画像の説明を入力してください


SET GLOBAL ..うまくいかなかったとき、これは私のために働きました。「ソース」コマンド(\. file.sql)はどういうわけか新しいセッションを開始するか、これをリセットしますか?私は設定をmmy sqlスクリプトに入れようとしませんでした。
toddkaufmann

5

また、他のリーダーの場合、Djangoでこれを実行しようとしていて、サーバーがlocal_infileを許可している場合(mysqlクライアントを介してSHOW VARIABLESと入力して確認できます)、これをsettings.pyファイルに追加できます(python MySQLdbはtデフォルトでは.my.cnfファイルを読み取ります):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'myname',
        'PASSWORD': 'mypass',
        'HOST': 'myserver',
        'PORT': '3306',
        'OPTIONS' : {
            'local_infile':1,
        },
    }
}

3

mysqli接続を確立する方法に注意する必要があります。このソリューションの全額は、ホルヘアルバレンケに提供されます。

それを修正するために私はしなければなりませんでした:

  • (上記のコメントで説明されているように)my.cnfの[mysqld]セクションと[mysql]セクションにlocal-infile = 1を追加します。
  • mysqli_real_connect関数を使用します(PHPドキュメント)。

問題は、その関数を使用して、LOAD DATA LOCAL INFILEのサポートを明示的に有効にできることです。例(手続き型):

$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $host, $username, $password, $database);

またはオブジェクト指向

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
$mysqli->real_connect($host, $username, $password, $database);

1
@マスク確認できません。私のソリューションは5.5.46(Ubuntu)で実行されています
sieppl

3

csvファイルがdb と同じ場所にある場合、LOAD DATA INFILEのLOCALを削除する必要があります。そうしないと、エラーが発生します

使用されたコマンドは、このMySQLバージョンでは許可されていません


これは私のためにそれをしました、しかし私はまたここでネルソンの答え
ドミニク

1

別の方法は、mysqlimportクライアントプログラムを使用することです。

次のように呼び出します。

mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt

これにより、テーブルにLOAD DATAロードするステートメントが生成さtableName.txttableNameます。

次の点に注意してください。

mysqlimport指定したファイルからテーブル名を決定します。ファイル名の最初から最初のピリオドまでのすべてのテキストをテーブル名として使用します。したがって、複数のファイルを同じテーブルにロードする場合は、たとえば、、...などのようtableName.1.txtに区別できますtableName.2.txt


1

ある日から次の日まで、何日か機能していたスクリプトが機能しなくなったため、これは私にとって少し奇妙なことでした。新しいバージョンのmysqlやあらゆる種類のアップグレードはありませんでしたが、同じエラーが発生したので、CSVファイルを最後に試してみましたが、行末が期待どおりではなく\ nを使用していることに気付きました(スクリプトごと) )\ r \ n正しいEOLで保存し、問題なくスクリプトを再度実行します。

mysqlが教えてくれるのはちょっと変だと思う理由がまったく異なるため、このMySQLバージョンでは使用されたコマンドは許可されていません。

私の作業コマンドは次のようになります:

LOAD DATA LOCAL INFILE 'file-name' IGNORE INTO TABLE table-name CHARACTER SET latin1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES.

1

私はmysql-5.5.51-winx64および5.5.50-MariaDBでテストされたconfigの変更を必要しない以下の方法を使用しました。

「データのロード...」を.sqlファイルに入れます(例:LoadTableName.sql)

LOAD DATA INFILE 'D:\\Work\\TableRecords.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (col1,col2);

次に:

mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"

1

Mysql 5.7の場合は、「show local variables like "local_infile";」を使用できます。ローカルのinfileステータスが表示されます。「set global local_infile = ON;」を使用してオンにできます。


0

ここで奇妙なことが起こっています。これを機能させるために、/etc/mysql/my.cnfの構成を変更する必要はありません。ターミナルで現在のmysqlサービスを再起動するだけです。

sudo service mysql restart

次に、バグを「再作成」する場合は、Apacheサービスを再起動するだけです。

sudo service apache2 restart

これは、次のコマンドを入力することで再度修正できます。

sudo service mysql restart

したがって、apache2は起動時にこの機能を許可しないように何かを行っているようです(mysqlサービスを再起動すると、この機能は逆転/修正されます)。

Debianベースのディストリビューションで有効です。

service mysqld restart
service httpd restart

RedHatベースのディストリビューションで有効


0

LOCAL私のようにLOAD DATA INFILEを機能させるための答えを探している人にとって、これはおそらく機能するでしょう。まあそれは私のために働いたので、ここに行きます。perconaリンクからの手順に従って、mysqlサーバーおよびクライアントとしてインストールします。インストール中にパスワードの入力を求められるので、覚えておいて後で使用するパスワードを入力してください。インストールが完了したら、システムを再起動し、に移動terminalしてmysql -u root -p、次にパスワードを入力して、サーバーが稼働していることをテストします。LOAD DATA LOCAL INFILE今すぐコマンドを実行してみてください。うまくいくことを願っています:)

ところで私は、Ubuntu 12.04でRuby 1.9.3を使用してRails 2.3で作業していました。


0

すべて:明らかに、これは設計どおりに機能しています。2019-7-23日付の新しいref man、セクション6.1.6、LOAD DATA LOCALのセキュリティ問題をご覧ください。


0

とセクションのlocal_infile両方に追加します。clientmysqld

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

WindowsとLinuxの両方でMySQL 8.xでテストされています。


0

xampp v3.2.4とmysqlサーバー8.0.20を使用しています。

私は追加local-infile=1する[mysql][mysqld]「にmy.ini」ファイルに。ファイルは「C:\ xampp \ mysql \ bin \ my.ini」にあります。

次に、次のコードを使用してcsvファイルからデータを挿入しました LOAD DATA INFILE ...。ローカルに移動することが重要です。それ以外の場合は機能しません。

上記のすべての提案をありがとう。ようやく組み合わせがうまくいきました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.