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