Ubuntu 12 LTS で Mysql 5.5 を実行しています。my.cnf で LOAD DATA LOCAL INFILE を有効にするにはどうすればよいですか?
さまざまな場所で構成に local-infile を追加しようとしましたが、「使用されたコマンドはこの MySQL バージョンでは許可されていません」というメッセージが引き続き表示されます。
Ubuntu 12 LTS で Mysql 5.5 を実行しています。my.cnf で LOAD DATA LOCAL INFILE を有効にするにはどうすればよいですか?
さまざまな場所で構成に local-infile を追加しようとしましたが、「使用されたコマンドはこの MySQL バージョンでは許可されていません」というメッセージが引き続き表示されます。
MySQL 5.5のマニュアルページから:
LOCALは、サーバーとクライアントの両方がそれを許可するように構成されている場合にのみ機能します。たとえば、mysqldが--local-infile = 0で開始された場合、LOCALは機能しません。6.1.6項「LOADDATALOCALのセキュリティ問題」を参照してください。
次のオプションを設定する必要があります。
local-infile=1
my.cnfファイルの[mysql]エントリに追加するか、-local-infileオプションを指定してmysqlクライアントを呼び出します。
mysql --local-infile -uroot -pyourpwd yourdbname
「ローカル入力ファイル」機能サーバー側を有効にするには、 [mysqld]セクションにも同じパラメーターが定義されていることを確認する必要があります。
これはセキュリティ上の制限です。
編集する必要がある 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 で動作します。
ドライバ php5-mysql をネイティブ ドライバに置き換えます
デビアンで
apt-get install php5-mysqlnd
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';
また、他の読者の場合、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,
},
}
}
csv ファイルが dbと同じ場所にある場合は、LOAD DATA INFILEのLOCALを削除する必要があります。そうしないと、エラーが発生します。
使用されたコマンドは、この MySQL バージョンでは許可されていません
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);
config を変更する必要のない以下の方法を使用し、mysql-5.5.51-winx64 および 5.5.50-MariaDB でテストしました。
'load data...' を .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"
これは私にとって少し奇妙でした。ある日から次の日まで、何日も機能していたスクリプトが機能しなくなりました。新しいバージョンの 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.
わかりました、ここで奇妙なことが起こっています。これを機能させるために、 /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 ベースのディストリビューションで有効