MySQLで「mysqldump」コマンドを使ってバックアップファイルを作成しようとしたところ以下のようなエラーが発生。
mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces
このエラーの原因と対処法についてまとめています。
エラーの詳細
発生したエラーの内容は以下のようになっています。
mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces
↓ 翻訳
mysqldump:エラー: 'アクセスが拒否されました; テーブルスペースをダンプしようとするときは、この操作にPROCESS権限(少なくとも1つ)が必要です。
エラーの原因
エラーの原因はMySQL 5.7.31以上になって、「INFORMATION_SCHEMA.FILESテーブル」にアクセスするときに、PROCESS権限が必要になったためです。
「mysqldump」は「INFORMATION_SCHEMA.FILESテーブル」にアクセスしようとするため、実行するユーザーにPROCESS権限が必要となったため、ユーザーにその権限が与えられていないとエラーが発生します。
MySQL 5.7.31の仕様書にも以下のように記載があります。
Incompatible Change: Access to the INFORMATION_SCHEMA.FILES table now requires the PROCESS privilege.
This change affects users of the mysqldump command, which accesses tablespace information in the FILES table, and thus now requires the PROCESS privilege as well. Users who do not need to dump tablespace information can work around this requirement by invoking mysqldump with the --no-tablespaces option.
↓ 翻訳
互換性のない変更:INFORMATION_SCHEMA.FILESテーブルへのアクセスには、PROCESS権限が必要になりました。
この変更は、FILESテーブルのテーブルスペース情報にアクセスする、mysqldumpコマンドのユーザーに影響を与えるため、PROCESS権限も必要になります。
テーブルスペース情報をダンプする必要がないユーザーは、--no-tablespacesオプションを指定してmysqldumpを呼び出すことにより、この要件を避けることができます。
PROCESS権限とは何か?
PROCESS権限とは、SHOW FULL PROCESSLISTコマンドで接続中の全てのユーザーや実行中のクエリなどを確認できる権限です。
MySQLにおいてユーザーに全ての権限を与えるときに、グローバルで権限を与える方法と、データベースに限って権限を与える方法の2種類があります。
データベースに限って権限を与えた場合、PROCESS権限が付与されず、現在ログイン中のユーザーの情報しか見えない設定になります。
このため、PROCESS権限を必要とする「INFORMATION_SCHEMA.FILESテーブル」にアクセスするには、このユーザーに対してグローバルな権限を与える必要があります。
グローバルとデータベースで権限を与えるコマンド
スコープをグローバルとデータベースのそれぞれに限って全ての権限を与える場合はmysqlで以下のコマンドを実行します。
グローバルな権限を与えるコマンド
GRANT ALL PRIVILEGES ON *.* TO 'ユーザ名'@'%';
ONの後ろのデータベース名を指定するところで「*.*
」を指定しています。
データベースに限った権限を与えるコマンド
GRANT ALL PRIVILEGES ON `%`.* TO 'ユーザ'@'%';
ONの後ろのデータベース名を指定するところで「
」を指定しています。%
.*
対処法
対処法は2つあります。
ルートユーザーでログインし権限を付与できる場合は「1」を実行します。そうでない場合は「2」を使用すればダンプファイルが作成できます。
ユーザーにPROCESS権限を与える
コマンド
「mysqldump」を実行しているユーザーにPROCESS権限がないというのが問題なので、PROCESS権限を与えます。
ルートルーザーでmysqlにログインして、対象のユーザーに権限を付与します。
GRANT ALL PRIVILEGES ON *.* TO 'ユーザ名'@'%';
実行して「Query OK, 0 rows affected (0.00 sec)」と表示されれば、権限設定が完了です。
実例
まずはルートユーザーでmysqlにログインします。
# mysql -u root -pパスワード
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 80
Server version: 5.7.37 MySQL Community Server (GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
対象のユーザーに権限を付与します。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'user'@'%';
Query OK, 0 rows affected (0.00 sec)
対象のユーザーの権限を確認します。
mysql> SHOW GRANTS FOR user;
+-------------------------------------------------------------------+
| Grants for user@% |
+-------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' |
| GRANT ALL PRIVILEGES ON `database`.* TO 'user'@'%' |
+-------------------------------------------------------------------+
2 rows in set (0.00 sec)
もともと付与されていた権限「GRANT ALL PRIVILEGES ON database.* TO 'user'@'%'
」に加えて、「GRANT ALL PRIVILEGES ON . TO 'user'@'%'
」が付与されていることがわかります。
一旦、exitして「mysqldump」コマンドを実行します。
mysql> exit
Bye
# mysqldump -u user -pパスワード --no-tablespaces データベース名 > ファイル名.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
#
無事実行できました。
アクセス権限がない場合はエラーになる
ルートユーザー以外などアクセス権限がない場合は、以下のようなエラーが発生します。
ERROR 1045 (28000): Access denied for user 'ユーザー名' (using password: YES)
この場合は、以下で対処できます。
--no-tablespacesオプションをつけて実行する
--no-tablespaces
オプションをつけて「mysqldump」を実行すれば、ダンプファイルを作成することができます。
mysqldump -u ユーザー名 -pパスワード --no-tablespaces データベース名 > ファイル名.sql