mysqlユーザー 'root' @ 'localhost'に対して拒否されたアクセスを修正する方法


123

何かを台無しにする前に$ mysql -u root -p、を使用してログインし、データベースを表示するとき:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| game_data          |
| test               |
+--------------------+

次に、新しいユーザーを作成しようとしましたが、PRIVILEGESに問題があることに気付きました。

そのため、新しいユーザーを削除しましたが、「root」と「Admin」を誤って削除したと思います。

次に、「ルート」を再度作成しようとしますが、すべての権限を付与するとアクセス拒否エラーが発生します。

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
mysql> grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

を使用してMySQLに再度ログインし$ mysql -u root -p、データベースを表示すると、

+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+

他のすべてのデータベースはなくなりました。

今すぐMySQLを修正するにはどうすればよいですか?

データベース 'mysql'が見つからない、データベースを作成できない、ユーザーを作成できない、何をしようとするとエラーが発生します。

エラー1045(28000):ユーザー 'root' @ 'localhost'のアクセスが拒否されました(パスワードを使用:YES)。

MacPortsを使用してMySQLを再インストールする必要がありますか?再インストールすると、データベースが失われますgame_dataよね?


「root」@「localhost」とは異なる「root」@「127.0.0.1」でサーバーにアクセスしてみてください。次に、コマンドを発行してユーザー「root」@「localhost」を作成し、すべての特権を付与します。
ギミー

また、MySQLにルートユーザーの資格を付与する方法を参照してくださいスーパーユーザー。パスワードのリセットを回避しようとします。
-jww

-pパスワードとパスワードの間にスペースがありました。私はその愚かなことを知っていますが、誰かを助けるかもしれません。
ヴィナイワドワ

回答:


132

以下の手順に従ってください。

  1. --skip-grant-tablesオプション(セキュリティ設定)を使用して、MySQLサーバーインスタンスまたはデーモンを起動します。

    $ mysqld --skip-grant-tables
    
  2. これらのステートメントを実行します。

    $ mysql -u root mysql
    $mysql> UPDATE user SET Password=PASSWORD('my_password') where USER='root';
    $mysql> FLUSH PRIVILEGES;
    

上記の不明なフィールドのパスワードエラーに直面した場合:

update user set authentication_string=password('my_password') where user='root';
  1. 最後に、--skip-grant-tablesオプションなしでインスタンス/デーモンを再起動します。

    $ /etc/init.d/mysql restart
    

これで、新しいパスワードで接続できるようになります。

$ mysql -u root -p

パスワードを入力する: my_password

MySQLの「ibdata1をロックできません」エラーを修正

sudo mv /usr/local/mysql/data/ibdata1 /usr/local/mysql/data/ibdata1.bak
sudo mv /usr/local/mysql/data/ib_logfile0 /usr/local/mysql/data/ib_logfile0.bak
sudo mv /usr/local/mysql/data/ib_logfile1 /usr/local/mysql/data/ib_logfile1.bak
sudo cp -a /usr/local/mysql/data/ibdata1.bak /usr/local/mysql/data/ibdata1
sudo cp -a /usr/local/mysql/data/ib_logfile0.bak /usr/local/mysql/data/ib_logfile0
sudo cp -a /usr/local/mysql/data/ib_logfile1.bak /usr/local/mysql/data/ib_logfile1
sudo /etc/init.d/mysql restart

1
「$ mysqld --skip-grant-tables」および「InnoDB:./ibdata1をロックできません:エラー:35 InnoDB:別のmysqldプロセスがまだないことを確認してくださいInnoDB:同じInnoDBデータまたはログファイルを使用しています。」

上記の私の更新を参照してください
ヨグス

最初のコマンドを発行する前にmysqlを停止すると、ロックエラーが発生しなくなります-サービスmysql停止
フランクツァナベティス

7
どうやら「パスワード」列はもはや存在しません...「authentication_string」に置き換えられました。したがって、パスワード更新文字列は次のようになります。UPDATE user SET authentication_string = PASSWORD( 'my_password')where USER = 'root';
jdmcnair

1
ありがとうございました!そして今、私は興味があります:これは何が原因でしたか?Windowsで?
イリアアンドリエンコ

64

上記のどれも私には役に立たなかった。プラグインメソッドをクリアする必要があることがわかりました。5.6では、次のことができました。

sudo mysql -u root
use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;

5.7では、次のことが必要であることがわかりました。

sudo mysql -u root
use mysql;
[mysql] update user set plugin='mysql_native_password' where User='root';
[mysql] flush privileges;

ドキュメントによると、プラグインを空の文字列に設定すると、mysql_native_passwordがデフォルトで有効になっているはずですが、空のパスワードハッシュによって混乱する可能性があります。詳細については、次のドキュメントを参照してください:https : //dev.mysql.com/doc/refman/5.7/en/native-authentication-plugin.html


5
これで解決しました。mysqlデーモンのステータスを見ると、「[警告] 'user'エントリ 'root @ localhost'にはパスワードと認証プラグインの両方が指定されています。パスワードは無視されます。」という警告が表示されました。プラグインを ''に設定すると、再度ログインできました。ありがとう、@マリオフローレス
SpacePope

プラグインが空白でした。面白いことに、自動的に空白に変更されます。dist-upgradesを使用するパーソナルコンピューターへのインストールについて話していることに注意してください。これが、rootユーザーが壊れた理由かもしれません。
キムの友人

2
set plugin='mysql_native_password'おかげでした!参考のために:dev.mysql.com/doc/refman/5.7/en/...
公園。

なぜこれが2018年に入るパッケージインストールの問題にとってまだ問題なのですか?
mckenzm

1
Ubuntuの18、そしてそれが働いた
レイホールカニシカ1世

8

また、テーブル内の必要なレコードにuser空のpluginフィールドがあることを確認します(たとえば、可能性があります"unix_socket")。

バージョン5.5.7以降、mysqlにはさまざまな認証プラグインがサポートされてい ますhttps://dev.mysql.com/doc/refman/5.6/en/authentication-plugins.html

したがって、空でないpluginフィールドがある場合、パスワードは無視され、mysqlエラーログに警告が表示されます(私にとっては/var/log/mysql/error.log):

[Warning] 'user' entry 'root@localhost' has both a password and an authentication plugin specified. The password will be ignored.


1
mysqlサーバー5.7.15を実行しているときに、これにまたがって実行される他の誰かについては、プラグインを提供しない場合、実際にユーザーをロックアウトします。おそらくあなたが探しているのpluginmysql_native_passwordです。
ジョナサンカントレル

8
grep 'temporary password' /var/log/mysqld.log
Sort date (newest date)

このようなものが表示される場合があります。

[root@SERVER ~]# grep 'temporary password' /var/log/mysqld.log
2016-01-16T18:07:29.688164Z 1 [Note] A temporary password is generated for root@localhost: O,k5.marHfFu
2016-01-22T13:14:17.974391Z 1 [Note] A temporary password is generated for root@localhost: b5nvIu!jh6ql
2016-01-22T15:35:48.496812Z 1 [Note] A temporary password is generated for root@localhost: (B*=T!uWJ7ws
2016-01-22T15:52:21.088610Z 1 [Note] A temporary password is generated for root@localhost: %tJXK7sytMJV
2016-01-22T16:24:41.384205Z 1 [Note] A temporary password is generated for root@localhost: lslQDvgwr3/S
2016-01-22T22:11:24.772275Z 1 [Note] A temporary password is generated for root@localhost: S4u+J,Rce_0t
[root@SERVER ~]# mysql_secure_installation

MySQLサーバーのデプロイメントを保護します。

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password:

表示された場合

... Failed! Error: Your password does not satisfy the current policy requirements
That means your password needs to have a character such as ! . # - etc...
mix characters well, upper case, lower case, ! . , # etc...

New password: 

Re-enter new password: 
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done! 
[root@SERVER ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.10 MySQL Community Server (GPL)

このビデオの最後の10分間をご覧ください。どのようにそれを行うかを教えてくれます。


これで質問に答えることができますが、リンクされたコンテンツのより詳細な説明を提供し、質問との関連性を説明する必要があります。これにより、リンクされたページが削除されたりオフラインになった場合に、この回答が引き続き有用であることが保証されます。詳細については、Meta Stack Exchangeの投稿を参照してください。
bwDraco

これは私が見たユースケースです。Ansibleを使用してAWSのRHEL7にmysqlをインストールしており、DBを再構成して再起動した後も同じ動作をしています。これがそもそもなぜ起こるのか、Ansibleがローカルのmysqldにアクセスして設定するのをブロックしている理由を知っていますか。これは単にテスト目的のためです。
einarc

:どうやらそれはあなたがサーバーを初期化する方法によって異なり、ここではステップ4で見てdev.mysql.com/doc/refman/5.7/en/...
einarc

3

それを試してみてください:

mysql --no-defaults --force --user=root --host=localhost --database=mysql 
UPDATE user SET Password=PASSWORD('NEWPASSWORD') where USER='root';
FLUSH PRIVILEGES;

6
--no-defaults --forceスイッチの機能を説明できますか?それ以外の場合、上記の承認済み回答のVLQ複製です。
カナダのルーク14

@CanadianLuke no defaultsは、含まれていない設定ファイルをスキップしません。発行されたSQLコマンドのいずれかが失敗した場合でも、強制的に操作を続行します。疑問がある場合は、マニュアルを
-deucalion

3
答えに編集する必要があります
カナダのルーク

2
私は得ますERROR 1054 (42S22): Unknown column 'Password' in 'field list'
ジョナサン


3

私の場合、データベースが破損しており、Debianでmysqlを再起動した後、ルートログインにパスワードがありませんでした。解決策はこれでした:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';

他のいくつかの答えもnative_passwordプラグインについて言及していますが、これは複雑な操作をせずにこれを行う方法です。それはそれが変更されることを意味する方法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.