LoginSignup
2
2

More than 5 years have passed since last update.

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

Posted at

ローカルでうまく動いていた、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:

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2