くま's Tech系Blog

基本的には技術で学んだことを書き留めようと思います。雑談もやるかもね!

MySQLのアクセス権限エラーの解決方法

今回はMySQLで「Access denied for user ‘root’@’localhost’」というエラーが発生した場合の対処法についてです。

$ mysql -u rootを実行すると「Access denied for user ‘root’@’localhost’ (using password: NO)」というエラーが表示されました。

rootユーザーなのでコマンドが間違っていることもなく、別に原因がありそうです。

「(using password: NO)」という部分について調べてみると、以下2つの可能性がありそうです。(「using password: YES」でも下記の原因があるかもしれないので疑ってみてください)

①rootユーザーにパスワードを設定していない
②そのそもrootユーザーを作成していない

②のrootユーザーを作成していない場合にはユーザーを作成しましよう。

今回メインで説明するのは①のrootユーザーにパスワードを設定していない場合です。 パスワードを設定するためにはrootユーザーで接続する必要があります。

まず、MySQLを起動している場合には、停止します。

$ mysql.server stop

そして、権限を回避してアクセスできるように下記コマンドを実行します。

$ mysqld_safe --skip-grant-tables

上記コマンドを入力したら、新しくターミナルタブを開きます。 その状態で、rootユーザーでの接続を行うと、接続できるはずです。

$ mysql -u root

mysql>

rootに接続してパスワードを設定していなければ、下記コマンドのようにしてパスワードを変更しましょう。 パスワードはMySQLが定めるパスワードポリシーに準拠する必要があるので注意してください。

alter user root identified by 'password';

そして、権限を変更します。 ユーザーが使用できるその他の一般的なアクセス権限一覧を変更します。 具体的には次のような権限に変更できます。

権限 内容
ALL PRIVILEGES ユーザーは指定されたデータベースへフルアクセスができます。データベースが選択されていない場合は、システム全体のグローバルアクセスができます
CREATE 新しいテーブル、データベースを作成できます
DROP テーブル、データベースを削除できます
DELETE テーブルから行を削除できます
INSERT テーブルに行を挿入できます
SELECT データベースを読み取ることができます
UPDATE テーブルの行を更新できます
GRANT OPTION 他のユーザーの権限の付与または削除ができます

今回は「ALL PRIVILEGES」で変更してみます。

mysql> grant all privileges on *.* to 'root';
Query OK, 0 rows affected (0.01 sec)

成功したら、下記コマンドを実行しましょう。 直接userテーブルをメンテナンスするオペレーションする場合はFLUSH PRIVILEGESを実行して、有効化します。

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

もしかしたら、権限を変更する際に失敗する可能性があります。コマンドが間違っていない場合でも失敗する場合にはflush privileges;を実行してから権限変更のコマンドを実行すると成功することがあります。

ここで、exitコマンドからMySQLから抜けて、MySQL再起動に再アクセスを行うとエラーは発生しないはずです。

$ mysql.server start
Starting MySQL
.. SUCCESS! 

$ mysql -u root -p
Enter password: 

参照

qiita.com

qiita.com

qiita.com

ssabcire.hatenablog.com

qiita.com

qiita.com