Help us understand the problem. What is going on with this article?

MySQLでmysqlimportが出来ない問題を解消

More than 3 years have passed since last update.

ローカルでうまく動いていた、mysqlimportを含むバッチを開発用サーバーで動かそうとすると
うまく動きません。その原因について調査しました。

アクセス拒否エラー

以下のようなコマンドを叩くと、

mysqlimport --fields-enclosed-by='\"' -h [IPアドレス] -u [ユーザー] -p[パスワード] -d [DB] '/tmp/members.tsv'

このようなエラーが発生しました。

mysqlimport: Error: 1045, Access denied for user 'someone'@'%' (using password: YES), when using table: members

どうやら権限が足りないのでアクセス拒否されたみたいです。
調べてみると同様の質問をしている人が見つかりました。

stackoverflow mysqlimport: Error: 1045, Access denied

権限を確認してみます。

show grants;
→ GRANT ALL PRIVILEGES ON `xxx`.* TO 'someone'@'localhost'

GRANT 'ALL' PRIVILEGESと書いてあるから良いのでは?と思ったのですが、
これはDBレベルの権限に該当するもの全てが、特定DBの特定ユーザーに割り当てられているという意味でしかありません。
mysqlimportをするにはFILE権限が必要ですが、権限にも種類があり、FILE権限は「グローバル」レベルというDBレベルよりも上の層にあります。
以下のサイトに権限とレベルの対応表があります。

権限の種類と設定されている権限の確認

したがって、グローバルレベルで権限を設定するために、

GRANT FILE ON *.* to 'someone'@'%';

を行う必要があります。普段使っているユーザーでやるとまたAccess deniedと言われてしまったので、
mysqlのrootユーザで入り直して実行しました。

またエラー

気を取り直してもう一度mysqlimportすると……。

The MySQL server is running with the --secure-file-priv option so it cannot execute this statement, when using table: members

secure-file-privオプション付きで実行しているのでmysqlimport出来ません!とでました。
解除の方向で調査したのですが、どうもセキュリティ的によろしくないようです。
secure-file-privオプションは特定の場所に置かれているファイルのみインポート出来る設定です。
以下のコマンドをmysql上で叩くことで特定場所を調べられます。

SELECT @@global.secure_file_priv;
-> /var/lib/mysql-files/

この場所rootじゃないとpermission deniedが出てしまうのでrootでtsvファイル置いて……。

mysqlimport --fields-enclosed-by='\"' -h [IPアドレス] -u [ユーザー] -p[パスワード] -d [DB] '/var/lib/mysql-files/members.tsv'

うまく動きました!:relaxed:

Hirata-Masato
Webプログラミング経験3年、機械学習・ディープラーニングの経験2年です。オートエンコーダに興味あり
ikyu
「こころに贅沢を」をコンセプトに一休.com、一休レストランなどのサービスを提供しています。
https://www.ikyu.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away