MySQL?ERROR?1045の原因と解決策を徹底分析

目次
  • 解決策は通常オンラインで見つけることができます
    • 1.サービスを停止する
    • 2. 検証をスキップする
    • 3. パスワードを変更する
    • 4. サービスを再起動します
  • 原因分析
  • SOソリューション

コマンドラインで mysql -u root –p と入力したり、パスワードを入力したり、ツールを使用してデータベースに接続したりすると、次のようなエラー メッセージが頻繁に表示されます。MySQL を使用していると、このエラー メッセージに遭遇したことがある人も多いと思います。

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

解決策は通常オンラインで見つけることができます

1.サービスを停止する

MySQL サービスを停止します。

?

1

2

3

4

# windows

net stop mysql

# linux

service mysqld stop

2. 検証をスキップする

MySQL インストール ディレクトリの my.ini 設定ファイルを変更して、ログイン時の権限チェックをスキップします。

?

1

2

3

4

#到mysql根目录找到mysql配置文件

vim my.ini

#在my.ini,[mysqld]下添加一行,使其登录时跳过权限检查

skip_grant_tables

3. パスワードを変更する

MySQL サービスを起動し、MySQL にログインします。このとき、パスワードの入力を求められますので、任意のパスワードを入力し、Enter キーを押して MySQL に入ります。

?

1

2

#登录mysql

mysql -u root -p

次に、SQL ステートメントを使用して root ユーザーのパスワードを変更します。

?

1

2

3

4

5

6

7

#将数据库切换至mysql库

mysql> USE mysql;

#修改密码

mysql> UPDATE user SET password=PASSWORD(‘newpasswd')WHERE user='root';

#刷新MySQL权限相关的表

mysql> flush privileges;

mysql> exit;

4. サービスを再起動します

my.ini ファイルに追加されたスキップ許可ステートメントを削除またはコメント化します。

サービスを再起動し、変更したパスワードでログインします。

原因分析

root ユーザーで MySQL にログインし、次のようにユーザー テーブルのユーザー情報を確認すると、host のフィールドがそれぞれ % と localhost になっていることがわかります。

?

1

mysql>select host,user,password from user;

MySQL では、「%」は任意のホスト上の MySQL データベースにログインできることを意味します。では、なぜログイン ホストが localhost であるユーザーを明示的に作成する必要があるのでしょうか?

これには、初期化ユーザー、匿名ユーザー、MySQL インストール時の接続認証戦略などが含まれます。

以下の詳細な分析。

MySQL をインストールすると、root ユーザーや、ホスト フィールドが localhost でユーザー フィールドが空のユーザーなど、一部のユーザーがデフォルトで初期化されます。

「User」フィールドが空のユーザーは匿名ユーザーであり、このユーザーのパスワードも空です。誰でも匿名ユーザーを使用して MySQL データベースにログインできますが、できることは限られています。たとえば、次のように入力します。コマンドラインで mysql を直接使用してログインすると、匿名ユーザーがどのデータベースにアクセスできるかを確認できます。

?

1

mysql>select current_user;

?

1

mysql>show databases;

上の図からわかるように、匿名ユーザーは、information_schema データベースと test データベースに対するアクセス許可のみを持っています。

また、匿名ユーザーは他のユーザーのログインにどのような影響を及ぼし、28000 エラーが発生するのでしょうか?

MySQL データベースに接続しようとすると、データベースは提供された ID とパスワードに基づいて接続要求を受け入れるかどうかを決定します。ID は、ユーザー名とクライアント ホスト (つまり、mysql コマンドを入力するホスト) の 2 つの部分で構成されます。

ホスト フィールドの % は任意のホストと一致するか、ホスト フィールドにワイルドカードが含まれているため、複数の一致する行が表示される可能性があり、サーバーはどの行と一致するかを決定する必要があります。サーバーはユーザー テーブルのデータをメモリに読み取り、それに応じて行を処理します。ホストフィールドとユーザーフィールドに追加します。

?

1

mysql>select host,user,password from user order by host desc,user desc;

クライアントが接続しようとすると、サーバーはソートされた行を検索し、クライアントのホストとユーザー名に一致する最初の行を使用します。一致する行が見つかったら、パスワードが一致するかどうかを検証します。一致する場合、ログインは成功します。

ユーザーフィールドが空の場合は、どのユーザーでも一致できることを意味します。

ここに従ってください:

ユーザーは空です。つまり、任意のユーザーです。パスワードなしで localhost にログインする場合、匿名ユーザーには、information_schema データベースと test データベースに対する権限のみが与えられます。他のデータベースを使用すると、失敗します。

ユーザーが root で、パスワードが空として表示される場合、またはホスト フィールドが「%」以外として表示される場合は、デフォルトの一致順序に従うか、パスワードが間違っていることを示すプロンプトが表示されるか、エラー 1045 としてプロンプトが表示されます。

以下の図は参照用に修正され完成されたものです。たとえば、最初のシーケンスでは、ホストが localhost または 127 ループバック アドレスの場合、1045 エラーが発生します。

SOソリューション

?

1

2

3

4

mysql> select host,user,password from user order by host desc,user desc;

## 将排序序列中最前面的用户修改host为'%'

mysql> update user set host = '%' where host = 'oracle' and user = 'root';

mysql> flush privileges;

おすすめ

転載: blog.csdn.net/qq_15509251/article/details/131589766