回答:
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]セクションにも定義されていることを確認する必要があります。
これはセキュリティ制限です。
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サービスをリロードしてください。
編集する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で動作します。
Ubuntu 14.04.2 LTS not working
もでき ます。
/mysql/my.cnf
デフォルトでは存在しません。ディレクトリとファイルを作成し、これらの行をファイルに貼り付けるだけです。
/etc/mysql/conf.d/enable-local-infile.cnf
またsudo service mysql restart
、構成を変更した後、それを有効にしてください。
php5-mysqlドライバーをネイティブドライバーに置き換えます。
デビアンについて
apt-get install php5-mysqlnd
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です。多分これは最新の解決策です。どうもありがとう。
8.0.12 MySQL Community Server
がWindows で私に役立ちました。
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
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';
下の画像を参照...
--local-infile=1
通常のmysqlコマンドに追加し ましたmysql -u root -p
したがって、合計行は次のようになります。
mysql --local-infile = 1 -u root -p
SET GLOBAL ..
うまくいかなかったとき、これは私のために働きました。「ソース」コマンド(\. file.sql
)はどういうわけか新しいセッションを開始するか、これをリセットしますか?私は設定をmmy sqlスクリプトに入れようとしませんでした。
また、他のリーダーの場合、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,
},
}
}
mysqli接続を確立する方法に注意する必要があります。このソリューションの全額は、ホルヘアルバレンケに提供されます。
それを修正するために私はしなければなりませんでした:
問題は、その関数を使用して、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);
csvファイルがdb と同じ場所にある場合、LOAD DATA INFILEのLOCALを削除する必要があります。そうしないと、エラーが発生します
使用されたコマンドは、このMySQLバージョンでは許可されていません
別の方法は、mysqlimport
クライアントプログラムを使用することです。
次のように呼び出します。
mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt
これにより、テーブルにLOAD DATA
ロードするステートメントが生成さtableName.txt
れtableName
ます。
次の点に注意してください。
mysqlimport
指定したファイルからテーブル名を決定します。ファイル名の最初から最初のピリオドまでのすべてのテキストをテーブル名として使用します。したがって、複数のファイルを同じテーブルにロードする場合は、たとえば、、...などのようtableName.1.txt
に区別できますtableName.2.txt
。
ある日から次の日まで、何日か機能していたスクリプトが機能しなくなったため、これは私にとって少し奇妙なことでした。新しいバージョンの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.
私は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"
ここで奇妙なことが起こっています。これを機能させるために、/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ベースのディストリビューションで有効
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で作業していました。
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 ...
。ローカルに移動することが重要です。それ以外の場合は機能しません。
上記のすべての提案をありがとう。ようやく組み合わせがうまくいきました。
my.cnf
パスは/etc/mysql/my.cnf
私のマシン(AWS EC2)にあります。