翼度科技»论坛 编程开发 mysql 查看内容

MySQL Shell连接数据库报MySQL Error 1045 (28000)错误浅析

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
这里简单总结一下mysql shell访问数据库时报MySQL Error 1045 (28000): Access denied for user 'root'@'::1' (using password: YES)的原因以及如何解决这个问题
这里测试的环境为MySQL 8.0.35,我们先来看看报错案例:
  1. $ mysqlsh -h localhost -P 7306 -u root -p
  2. Please provide the password for 'root@localhost:7306': ***********
  3. MySQL Shell 8.0.35

  4. Copyright (c) 2016, 2023, Oracle and/or its affiliates.
  5. Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
  6. Other names may be trademarks of their respective owners.

  7. Type '\help' or '\?' for help; '\quit' to exit.
  8. Creating a session to 'root@localhost:7306'
  9. MySQL Error 1045 (28000): Access denied for user 'root'@'::1' (using password: YES)
复制代码
先用root账号连接数据(socket方式),检查用户信息,如下所示,root账号限定为localhost
  1. $ mysql -uroot -p
  2. Enter password: 
  3. Welcome to the MySQL monitor.  Commands end with ; or \g.
  4. Your MySQL connection id is 24
  5. Server version: 8.0.35 MySQL Community Server - GPL

  6. Copyright (c) 2000, 2023, Oracle and/or its affiliates.

  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.

  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

  11. mysql> select user,host from mysql.user;
  12. +------------------+-----------+
  13. | user             | host      |
  14. +------------------+-----------+
  15. | mysql.infoschema | localhost |
  16. | mysql.session    | localhost |
  17. | mysql.sys        | localhost |
  18. | root             | localhost |
  19. +------------------+-----------+
  20. 13 rows in set (0.00 sec)

  21. mysql> 
复制代码
然后,检查变量skip_name_resolve,如下所示,skip_name_resolve为ON
  1. mysql> show variables like 'skip_name_resolve';
  2. +-------------------+-------+
  3. | Variable_name     | Value |
  4. +-------------------+-------+
  5. | skip_name_resolve | ON   |
  6. +-------------------+-------+
  7. 1 row in set (0.01 sec)

  8. mysql>
复制代码
数据库参数skip_name_resolve设置为ON,它是禁止域名解析的,一般都推荐将这个参数设置为ON, 因此服务器不会尝试解析连接客户端的名称或每次都在主机名缓存中查找它们(甚至localhost也会被解析/搜索),根据官方文档的解释,它会限制@localhost的连接。
官方文档的详细解释:
  1. Depending on the network configuration of your system and the Host values for your accounts, clients may need to connect using
  2. an explicit --host option, such as --host=127.0.0.1 or --host=::1.
  3. <p>An attempt to connect to the host 127.0.0.1 normally resolves to the localhost account. However, this fails if the server is run
  4. with skip_name_resolve enabled. If you plan to do that, make sure an account exists that can accept a connection. For example,
  5. to be able to connect as root using --host=127.0.0.1 or --host=::1, create these accounts:</p>
  6. [code]CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'root-password';
  7. CREATE USER 'root'@'::1' IDENTIFIED BY 'root-password';
复制代码
[/code]
那么怎么解决这个问题呢?一共有下面几种方法。
方案1:skip_name_resolve设置为OFF

我们需要在参数文件my.cnf中 将参数skip-name-resolve注释或者设置skip_name_resolve设置为OFF的.
注意事项,虽然官方文档中,参数skip-name-resolve是Boolean类型,但是如果你像下面这样设置是不会生效的,具体原因不是很清楚
  1. skip-name-resolve=0 

  2. skip-name-resolve=FALSE
复制代码
正确的做法
  1. 方法1:
  2. skip-name-resolve=OFF

  3. 方法2:
  4. #skip-name-resolve  注释掉参数
复制代码
修改skip_name_resolve的值为OFF后,重启一下MySQL实例,然后我们验证一下测试结果。
  1. mysql> show variables like 'skip_name_resolve';
  2. +-------------------+-------+
  3. | Variable_name     | Value |
  4. +-------------------+-------+
  5. | skip_name_resolve | OFF   |
  6. +-------------------+-------+
  7. 1 row in set (0.01 sec)

  8. mysql>
复制代码
  1. $ mysqlsh -h localhost -P 7306 -u root -p
  2. MySQL Shell 8.0.35

  3. Copyright (c) 2016, 2023, Oracle and/or its affiliates.
  4. Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
  5. Other names may be trademarks of their respective owners.

  6. Type '\help' or '\?' for help; '\quit' to exit.
  7. Creating a session to 'root@localhost:7306'
  8. Fetching schema names for auto-completion... Press ^C to stop.
  9. Your MySQL connection id is 10
  10. Server version: 8.0.35 MySQL Community Server - GPL
  11. No default schema selected; type \use <schema> to set one.
  12.  MySQL  localhost:7306 ssl  JS > 
复制代码
这种方案需要修改参数,需要重启MySQL实例,所以一般来说,不建议使用。
方案2:新增账号

如下所示,我们新增下面账号
  1. CREATE USER 'root'@'::1' IDENTIFIED BY '********';
  2. GRANT ALL PRIVILEGES ON *.* TO 'root'@'::1';
  3. FLUSH PRIVILEGES;
复制代码
当然,如果报错为MySQL Error 1045 (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)的话,那么可以创建下面用户
  1. CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY '**********';
  2. GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1';
  3. FLUSH PRIVILEGES;
复制代码
创建账号后,mysqlsh就可以连接,不会报上面错误了,如下所示:
  1. $ mysqlsh -h localhost -P 7306 -u root -p
  2. Please provide the password for 'root@localhost:7306': ***********
  3. Save password for 'root@localhost:7306'? [Y]es/[N]o/Ne[v]er (default No): y
  4. MySQL Shell 8.0.35

  5. Copyright (c) 2016, 2023, Oracle and/or its affiliates.
  6. Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
  7. Other names may be trademarks of their respective owners.

  8. Type '\help' or '\?' for help; '\quit' to exit.
  9. Creating a session to 'root@localhost:7306'
  10. Fetching schema names for auto-completion... Press ^C to stop.
  11. Your MySQL connection id is 20
  12. Server version: 8.0.35 MySQL Community Server - GPL
  13. No default schema selected; type \use <schema> to set one.
  14.  MySQL  localhost:7306 ssl  JS > 
复制代码
方案3:使用socket方式连接

mysql shell也可以使用socket连接,一般的方式如下:
  1. mysqlsh -h localhost  -u root -p -S /tmp/mysql.sock  #根据实际情况填写具体的mysql.sock文件

  2. \connect root@localhost?socket=(/tmp/mysql.sock)
复制代码
测试验证如下所示:
  1. $ mysqlsh -h localhost  -u root -p -S /tmp/mysql.sock
  2. Please provide the password for 'root@/tmp%2Fmysql.sock': ***********
  3. Save password for 'root@/tmp%2Fmysql.sock'? [Y]es/[N]o/Ne[v]er (default No): y
  4. MySQL Shell 8.0.35

  5. Copyright (c) 2016, 2023, Oracle and/or its affiliates.
  6. Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
  7. Other names may be trademarks of their respective owners.

  8. Type '\help' or '\?' for help; '\quit' to exit.
  9. Creating a session to 'root@/tmp%2Fmysql.sock'
  10. Fetching schema names for auto-completion... Press ^C to stop.
  11. Your MySQL connection id is 22
  12. Server version: 8.0.35 MySQL Community Server - GPL
  13. No default schema selected; type \use <schema> to set one.
  14.  MySQL  localhost  JS > 
复制代码
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
来源:https://www.cnblogs.com/kerrycode/p/17833536.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具