問題の説明
Docker によって クラウドサーバーに インストールされた Mysql5.7 データベースは、最初は正常に使用されていましたが、ある日から突然接続できなくなり、 エラー 1045 (28000):ユーザー 'root' のアクセスが拒否されましたというエラーが報告されました。 @'1xxx' (パスワードを使用: YES)、 MySQL データベースへのログイン時にエラー 1045 エラーが発生した場合、入力されたユーザー名またはパスワードが間違っており、 アクセスが拒否されたことを示します。
原因分析
mysqlサーバーが停止しました
ユーザーのポート番号または IP は、
Mysql 設定ファイルのエラー: my.ini およびその他のファイル
root ユーザーのパスワードが間違っています
注: MySQL サービスがセットアップされると、 デフォルトの root ユーザーはリモート アクセス接続を実行できなくなります。
具体的な解決策
以下の検査手順により上記のエラーを解消します。
(1).mysqlサービスが起動しているか確認する
mysqlサーバーが停止すると上記のエラーが報告されますが、ここではdockerを使用しているので、 docker ps コマンドでmysql関連のサービスが正常か確認してください。
#查看docker 相关服务
docker ps
...
#进入docker-mysql
docker exec -it docker_mysql bash
...
#进入mysql
mysql -uroot -p
#然后输入密码
...
上記のコマンドにより、mysqlが起動しているかどうかを確認できます。
(2). mysqlパスワードを変更する
MySQL サービスのセットアップ後、 デフォルトの root ユーザーはリモート アクセス接続を実行できません。または、 root ユーザーのパスワードが間違っている場合も上記のエラーが報告されるため、mysql パスワードを変更して除外します。
1). 仮パスワードを確認する
初めてインストールした mysql のパスワードは変更されていません。次のコマンドを使用して、生成された一時パスワードを表示します。
grep "A temporary password is generated for root@localhost" /var/log/mysqld.log
2). ログイン
mysql -uroot -p
#然后输入临时密码,进入mysql端
3).パスワードを変更する
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
localhost は アドレスを表し、 root は データベースのパスワード を表します 。root は独自のパスワードに変更できます。
上記のコードを実行すると、エラーが発生する場合があります。
解決:
現在のパスワード ポリシーを表示する
show variables like '%validate_password_policy%';
show variables like '%validate_password_length%';
パスワードポリシーを変更する
長さと弱さを変更する
set global validate_password_policy=0; #设置为弱口令
set global validate_password_length=1; #密码最小长度为1
もう一度見直す
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
リフレッシュする
flush privileges;
やめる
quit;
再登録
mysql -uroot -p
show databases;
(3). リモートアクセスを有効にする
use mysql; #访问mysql库
update user set host = '%' where user = 'root'; #使root能在任何的host访问
FLUSH PRIVILEGES; #刷新
上記の更新を実行すると、エラーが報告される場合があります。
Duplicate entry ‘%-root’ for key ‘PRIMARY’
これは、 USER テーブルに複数の ROOT ユーザーが記録されている ためです。ユーザー フィールドが '%' または 'localhost' であるホストを除き、ユーザー フィールドが root であるユーザーを削除し、コマンド FLUSH PRIVILEGES を使用し て 、リフレッシュしてください。問題は
select host from user where user = 'root' を使用し 、ホストにすでに 値 %があるかどうかを確認してください。
次に、 FLUSH PRIVILEGES コマンドを使用して 更新すると、上記の問題が解決されます。データベースに再度接続して、成功したかどうかを確認します。
(4). mysqlの設定を変更する
1).方法1
my.cnf の [ mysqlId ] に設定を追加します
skip-grant-tables
この設定によりリモートログインが実現できますが、権限をスキップして設定ファイルに直接記述すること は 推奨しません。
2).方法2
操作するには次のコマンドを使用します
grant all privileges on *.* to 'root'@'%' identified by '密码' with grant option;
FLUSH PRIVILEGES;
通过mysql -uroot -p 命令,并输入密码进入数据库
mysql -uroot -p
然后执行下面命令
grant all privileges on *.* to 'root'@'%' identified by '密码' with grant option;
刷新并退出
FLUSH PRIVILEGES;
exit;
(5).总结
通过以上排除方法就可以解决 ERROR 1045 (28000)_ Access denied for user 'root'@'localhost'报错了
注意:
如果mysql是docker部署的,当每次重启容器时,可能需要再一次跑一下 步骤(4).修改mysql配置 这个命令,这个也有解决的办法:
#配置mysql密码还有默认的身份验证插件-解决每隔一段时间就会登陆不上问题
#身份插件-mysql_native_password 本地密码
default_authentication_plugin=mysql_native_password
#密码失效时间-永不过期
default_password_lifetime=0
其他解决办法:
docker exec -it 进入mysql,执行下面命令解决:
主要是 mysql_native_password 这个参数要注意
mysql -u root -p
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
flush privileges;
exit;