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

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

时间:2023-11-29 14:32:13浏览次数:47  
标签:Shell name skip resolve MySQL root 浅析 localhost

这里简单总结一下mysql shell访问数据库时报MySQL Error 1045 (28000): Access denied for user 'root'@'::1' (using password: YES)的原因以及如何解决这个问题

这里测试的环境为MySQL 8.0.35,我们先来看看报错案例:

$ mysqlsh -h localhost -P 7306 -u root -p
Please provide the password for 'root@localhost:7306': ***********
MySQL Shell 8.0.35

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

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'root@localhost:7306'
MySQL Error 1045 (28000): Access denied for user 'root'@'::1' (using password: YES)

先用root账号连接数据(socket方式),检查用户信息,如下所示,root账号限定为localhost

$ mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 24
Server version: 8.0.35 MySQL Community Server - GPL

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

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

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

mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
13 rows in set (0.00 sec)

mysql>

然后,检查变量skip_name_resolve,如下所示,skip_name_resolve为ON

mysql> show variables like 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON   |
+-------------------+-------+
1 row in set (0.01 sec)

mysql>

数据库参数skip_name_resolve设置为ON,它是禁止域名解析的,一般都推荐将这个参数设置为ON, 因此服务器不会尝试解析连接客户端的名称或每次都在主机名缓存中查找它们(甚至localhost也会被解析/搜索),根据官方文档的解释,它会限制@localhost的连接。

官方文档的详细解释:

Depending on the network configuration of your system and the Host values for your accounts, clients may need to connect using 
an explicit --host option, such as --host=127.0.0.1 or --host=::1.
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

with skip_name_resolve enabled. If you plan to do that, make sure an account exists that can accept a connection. For example,

to be able to connect as root using --host=127.0.0.1 or --host=::1, create these accounts:
CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'root-password';
CREATE USER 'root'@'::1' IDENTIFIED BY 'root-password';


CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'root-password';
CREATE USER 'root'@'::1' IDENTIFIED BY 'root-password';

那么怎么解决这个问题呢?一共有下面几种方法。

方案1:skip_name_resolve设置为OFF

我们需要在参数文件my.cnf中 将参数skip-name-resolve注释或者设置skip_name_resolve设置为OFF的.

注意事项,虽然官方文档中,参数skip-name-resolve是Boolean类型,但是如果你像下面这样设置是不会生效的,具体原因不是很清楚

skip-name-resolve=0 
或
skip-name-resolve=FALSE

正确的做法

方法1:
skip-name-resolve=OFF

方法2:
#skip-name-resolve  注释掉参数

修改skip_name_resolve的值为OFF后,重启一下MySQL实例,然后我们验证一下测试结果。

mysql> show variables like 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | OFF   |
+-------------------+-------+
1 row in set (0.01 sec)

mysql>
$ mysqlsh -h localhost -P 7306 -u root -p
MySQL Shell 8.0.35

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

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'root@localhost:7306'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 10
Server version: 8.0.35 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
 MySQL  localhost:7306 ssl  JS >

这种方案需要修改参数,需要重启MySQL实例,所以一般来说,不建议使用。

方案2:新增账号

如下所示,我们新增下面账号

CREATE USER 'root'@'::1' IDENTIFIED BY '********';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'::1';
FLUSH PRIVILEGES;

当然,如果报错为MySQL Error 1045 (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)的话,那么可以创建下面用户

CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY '**********';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1';
FLUSH PRIVILEGES;

创建账号后,mysqlsh就可以连接,不会报上面错误了,如下所示:

$ mysqlsh -h localhost -P 7306 -u root -p
Please provide the password for 'root@localhost:7306': ***********
Save password for 'root@localhost:7306'? [Y]es/[N]o/Ne[v]er (default No): y
MySQL Shell 8.0.35

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

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'root@localhost:7306'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 20
Server version: 8.0.35 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
 MySQL  localhost:7306 ssl  JS >

方案3:使用socket方式连接

mysql shell也可以使用socket连接,一般的方式如下:

mysqlsh -h localhost  -u root -p -S /tmp/mysql.sock  #根据实际情况填写具体的mysql.sock文件
或
\connect root@localhost?socket=(/tmp/mysql.sock)

测试验证如下所示:

$ mysqlsh -h localhost  -u root -p -S /tmp/mysql.sock
Please provide the password for 'root@/tmp%2Fmysql.sock': ***********
Save password for 'root@/tmp%2Fmysql.sock'? [Y]es/[N]o/Ne[v]er (default No): y
MySQL Shell 8.0.35

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

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'root@/tmp%2Fmysql.sock'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 22
Server version: 8.0.35 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
 MySQL  localhost  JS >

标签:Shell,name,skip,resolve,MySQL,root,浅析,localhost
From: https://blog.51cto.com/u_15338523/8616316

相关文章

  • Odoo16_Odoo Shell
    OdooShell浅尝-CSDN博客1.启动命令python3odoo-binshell-codoo.conf-ddb0012.内置变量变量类型envodoo.api.Environment 对象odooodoo 模块openerpodoo 模块selfres.users(1,) 记录3.内置方法方法必要参数......
  • MySQL安装与配置(免安装版)
    MySQL下载1)进入官网下载地址:https://downloads.mysql.com/archives/installer/2)然后选择自己想要下载的MySQL版本,这里我选择的是5.7.40免安装版。MySQL安装配置1)将压缩包解压至你想要放置的文件夹中,注意:绝对路径中要避免出现中文。2)在解压目录下新建my.ini文件,并在文件中输入......
  • Mysql - Error 1055: Expression #1 of SELECT list is not in GROUP BY clause and c
    执行SQL时出现错误ERROR1055,SELECT列表不在GROUPBY语句内且存在不函数依赖GROUPBY语句的非聚合字段'edusassvc.u.nickname'这是和sql_mode=only_full_group_by不兼容的(即不支持)。分析问题1)原理层面这个错误会发生在mysql5.7版本及以上版本mysql5.7版本以上默认的sql......
  • [转]Linux 安装 MySQL 经验
    也可以参考:https://www.cnblogs.com/z5337/p/16514955.html本文内容参考:https://www.cnblogs.com/syncmr/p/11991050.html在Centos7.9安装MySQL5.7步骤记录:1、新建目录,保存安装包cdhomemkdirinstall_packetcd/home/install_packet2、下载mysql5.7rpm源wgeth......
  • 如何查看MySQL会话连接方式?
    MySQL总共支持四种连接方式访问数据库,如下表格所示,其中Linux平台环境下,主要有两种连接方式,一种是TCP/IP连接方式,另外一种是socket方式。Namepipe和Sharememory是Windows平台下独有的连接方式。那么,MySQL数据库中,我们能否查看会话具体使用的连接方式呢(例如,使用TCP/IP连接方式)?如果......
  • [翻译]——How the MySQL Optimizer Calculates the Cost of a Query (Doc ID 1327497
    本文是对这篇文章HowtheMySQLOptimizerCalculatestheCostofaQuery(DocID1327497.1)[1]的翻译,翻译如有不当的地方,敬请谅解,请尊重原创和翻译劳动成果,转载的时候请注明出处。谢谢!适用于:MySQL4.0及后续更高的版本本文档中的内容适用于任何平台。目标了解MySQL优化器如......
  • 【Azure Web Job】Azure Web Job执行Powershell脚本报错 The term 'Select-Az
    问题描述AzureWebJob执行Powershell脚本报错 Select-AzContext:Theterm'Select-AzContext'isnotrecognizedasthenameofacmdlet,function,scriptfile,oroperableprogram.Checkthespellingofthename,orifapathwasincluded,verifythatthepa......
  • linux启动mysql数据库,报错mysql: error while loading shared libraries: libtinfo.so
    如下 原因: 解决方案:1、在/usr/lib64目录里面找一个差不多名称版本的文件进行链接#软连接出一个新的文件sudoln-s/usr/lib64/libtinfo.so.6.1/usr/lib64/libtinfo.so.5若本服务器没有相近版本的文件2、从其他服务器下载一个libtinfo.so.5拷贝进去即可,或者下载相近版本......
  • linux安装MySQL数据库初始化报错
    在使用如下初始化命令进行数据库初始化时报错,./bin/mysqld--user=mysql--basedir=/usr/local/mysql/mysql/--datadir=/usr/local/mysql/mysql/data/--initialize--lower-case-table-names=1; 权限不足导致,修改命令为:./bin/mysqld--user=root--basedir=/usr/local/mysql/m......
  • Linux shell简介
    Linuxshell简介一、什么是shell?shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。为什么要学习和使用shell?Shell属于......