今回は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: