MySQL设置管理员密码无法生效的问题解析

昨天某位客户向我咨询这样一个问题:他通过本地 MySQL 命令行连接数据库发现管理员不需要验证密码即可进行后续操作。为了查明原因,他尝试过修改管理员密码,依然无效。为了对比,他还特意创建了一个带密码的新用户,通过 MySQL 命令行可以正常进行密码验证。

经过对他遇到的问题做了详细了解后,我大概知道问题出在哪,不过还需要继续验证。

此类问题大致会有如下几种原因:

  • 此用户本身并没有设置密码。
  • 配置文件里开启 skip-grant-tables 跳过授权表。
  • 配置文件里有明文 password 选项来跳过密码。
  • 用户的认证插件有可能使用 auth_socket 。

我先来大致复现下这个问题。现象如下:MySQL 命令行客户端打印“hello world ”不需要验证密码。

root@ytt-large:/home/ytt# mysql -e "select 'hello world'"
+-------------+
| hello world |
+-------------+
| hello world |
+-------------+

换个用户就必需验证密码后方可正常打印字符串:

root@ytt-large:/home/ytt# mysql -uadmin -e "select 'hello world'"
ERROR 1045 (28000): Access denied for user 'admin'@'localhost' (using password: NO)
root@ytt-large:/home/ytt# mysql -uadmin -p -e "select 'hello world'"
Enter password:
+-------------+
| hello world |
+-------------+
| hello world |
+-------------+

尝试修改管理员密码,依然不需要验证密码即可执行命令:看结果好像是修改密码无效。

root@ytt-large:~# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 35
Server version: 8.0.29 MySQL Community Server - GPL
...
mysql> alter user root@localhost identified by 'root';
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
root@ytt-large:/home/ytt# mysql -e "select 'hello world'"
+-------------+
| hello world |
+-------------+
| hello world |
+-------------+

那接下来基于我复现的场景以及我开头想到的可能原因来逐步判断到底问题出在哪里。

  • 此用户本身并没有设置密码。

这个原因可以快速排除掉!已经执行过一次 alter user 改密码的操作,所以不可能没有密码。

  • 配置文件里开启 skip-grant-tables 跳过授权表。

这个原因也可以快速排除掉!如果是因为开启这个选项,那必定所有用户都不会验证密码,而不只是针对管理员账号本身。

  • 配置文件里有明文 password 选项来跳过密码。

有可能是这个原因。可以用工具 my_print_defaults 来打印相关配置、或者直接手动检查配置文件有没有[client] 、[mysql] 等段里包含有 password 明文选项。例如:

root@ytt-large:/home/ytt# my_print_defaults /etc/mysql/my.cnf client mysql
--password=*****

结果确实是设置了 password 选项,但是仔细想想,有点站不住脚。如果是因为这个原因,那修改密码后,为什么依然不验证新密码?因此这个可能性也被排除掉。

  • 用户的认证插件有可能使用 auth_socket 。

极有可能是这个原因!

插件 auth_socket MySQL 官网全称为:Socket Peer-Credential Pluggable Authentication(套接字对等凭据可插拔的身份验证)。

官方文档地址:https://dev.mysql.com/doc/refman/8.0/en/socket-pluggable-authentication.html

阅读官方文档后可以得出的结论为插件 auth_socket 不需要验证密码即可进行本地认证!它有两个认证条件:

  • 客户端通过本地 unix socket 文件连接 MySQL 服务端。
  • 通过 socket 的选项 SO_PEERCRED 来获取运行客户端的 OS 用户名,随后判断 OS 用户名是否在 mysql.user 表里。

另外,想了解更多关于 socket 的选项 SO_PEERCRED 可以参考这个网址:https://man7.org/linux/man-pages/man7/unix.7.html

那我们接下来验证结论是否正确。查看当前登录用户是不是 root@localhost :确认无疑。

root@ytt-large:/home/ytt# mysql  -e "select user(),current_user()"
   +----------------+----------------+
   | user()         | current_user() |
   +----------------+----------------+
   | root@localhost | root@localhost |
   +----------------+----------------+

检查 mysql.user 表记录:检查字段 plugin、authentication_string(此字段有可能不为空)。

mysql> select plugin,authentication_string from mysql.user where user = 'root' ;
   +-------------+-----------------------+
   | plugin      | authentication_string |
   +-------------+-----------------------+
   | auth_socket |                       |
   +-------------+-----------------------+
   1 row in set (0.01 sec)

确认管理员账号插件为 auth_socket ,难怪改密码无效。接下来把插件改为非 auth_socket 即可。

mysql> alter user root@localhost identified with mysql_native_password by 'root';
   Query OK, 0 rows affected (0.04 sec)

再次执行 MySQL 命令行:无密码正常报错,输入正确密码后执行成功。

root@ytt-large:/home/ytt# mysql -p -e "select 'hello world'"
   ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
   root@ytt-large:/home/ytt# mysql -proot -e "select 'hello world'"
   mysql: [Warning] Using a password on the command line interface can be insecure.
   +-------------+
   | hello world |
   +-------------+
   | hello world |
   +-------------+

结语:

一般在遇到 MySQL 问题时,建议对 MySQL 系统函数、数据库内部对象等进行检索而不是直接打印字符串,有时候可能对快速定位问题原因有帮助。

到此这篇关于MySQL设置管理员密码无法生效的问题解析的文章就介绍到这了,更多相关MySQ管理员密码无法生效内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL修改账号密码方法大全(小结)

    前言: 在日常使用数据库的过程中,难免会遇到需要修改账号密码的情景,比如密码太简单需要修改.密码过期需要修改.忘记密码需要修改等.本篇文章将会介绍需要修改密码的场景及修改密码的几种方式. 1.忘记 root 密码 忘记 root 密码的场景还是比较常见的,特别是自己搭的测试环境经过好久没用过时,很容易记不得当时设置的密码.这个时候一般常用的方法是跳过权限验证,然后更改 root 密码,之后再启用权限验证.以 MySQL 5.7 版本为例简单讲下主要过程: 首先修改配置文件,在[mysqld]部分

  • MySQL8忘记密码的快速解决方法

    前言 当我们忘记mysql数据库密码时我们就无法正常进入数据库,也就无法修改密码,那么这时该怎么修改密码呢,这里教大家一个简单常用修改密码的方式. 方法如下: 1.以管理员身份打开命令行: 2.停止mysql服务: 3.输入以下命令无密码启动mysql,百度到的很多版本都是修改my.ini文件,但这个在版本8里面没有作用: mysqld --console --skip-grant-tables --shared-memory 4. 另开一个dos窗口,输入mysql -u root无密码登录:

  • mysql密码忘记后如何修改密码(2022年最新版详细教程保姆级)

    目录 注意事项 步骤 总结 注意事项 一共用到两个cmd窗口,每一个都要以管理员身份打开,且在修改密码后,要先关闭第一个跳过验证密码的mysql服务的cmd窗口,再启动mysql,否则会出错. 在修改密码前,mysql必须处于关闭状态. 步骤 1.以管理员的身份打开cmd窗口,找到mysql安装的路径并打开bin目录 2.在bin路径下执行如下语句,开启跳过验证密码的mysql服务 mysqld --console --skip-grant-tables --shared-memory 如果执行

  • Mysql忘记密码解决方法

    目录 一.前言 二.环境介绍 三.具体操作 1.关闭mysql服务 2.修改配置文件 3.启动mysql服务 4.连接mysql服务 5.修改密码 6.将配置文件中的skip-grant-tables删除 7.测试 一.前言 经常做测试的朋友都知道,自己弄的各种服务,各种账户,有时候就会遗忘,mysql忘记密码就是其中一种情况.当我们忘记mysql密码时,我们可以通过mysql的配置文件设置登录不需要认证就可以不需要密码进行登录了,所以接下来我介绍的方法就是怎么配置mysql登录无需密码认证.

  • mysql实现不用密码登录的实例方法

    具体方法: 第一步:停止mysql服务 /etc/init.d/mysqld stop 第二步:跳过密码验证 /usr/bin/mysqld_safe --skip-grant-tables 或 mysqld_safe --skip-grant-tables 跳过权限表启动mysql. 第三步:另开一个命令提示符窗口 use mysql;#删除的记录要insert进去,然后修改密码 update user set password=password("new_pass") where 

  • 重置mysql的root密码最简单的方法

    我的mysql版本 MYSQL V5.7.9,旧版本请使用: UPDATE mysql.user SET Password=PASSWORD('新密码') WHERE User='root'; Mac OS X - 重置 MySQL Root密码 密码太多记不住??你是否忘记了Mac OS 的MySQL的root密码? 通过以下4步就可重新设置新密码: 1. 停止 mysql server. 通常是在 '系统偏好设置' > MySQL > 'Stop MySQL Server' 2. 打开终端

  • mysql密码中有特殊字符&在命令行下登录的操作

    在服务器上,通常为了快速登录数据库,我们会使用mysql -hhost -uusername -ppassword db的方式登录数据库,如果密码中没有特殊字符&,会直接进入数据库sql命令行下,如果有特殊字符&,那么就会出现如下提示: -bash: syntax error near unexpected token `&' 一般情况,我们可以通过命令mysql -hhost -uusername -p db然后根据提示手动输入密码. 另外,这里可以对特殊字符的密码做处理. 1.

  • MySQL设置管理员密码无法生效的问题解析

    昨天某位客户向我咨询这样一个问题:他通过本地 MySQL 命令行连接数据库发现管理员不需要验证密码即可进行后续操作.为了查明原因,他尝试过修改管理员密码,依然无效.为了对比,他还特意创建了一个带密码的新用户,通过 MySQL 命令行可以正常进行密码验证. 经过对他遇到的问题做了详细了解后,我大概知道问题出在哪,不过还需要继续验证. 此类问题大致会有如下几种原因: 此用户本身并没有设置密码. 配置文件里开启 skip-grant-tables 跳过授权表. 配置文件里有明文 password 选项

  • mysql修改用户密码报错的解决方法

    目录 mysql修改密码报错 解决办法: 关于 mysql 密码策略相关参数: 关于 validate_password_policy 的取值: mysql修改密码报错 Your password does not satisfy the current policy requirements 这是 mysql 初始化时,使用临时密码,修改自定义密码时,由于自定义密码比较简单,就出现了不符合密码策略的问题. 密码策略问题异常信息: ERROR 1819 (HY000): Your passwor

  • CentOS下安装mysql时忘记设置root密码致无法登录的解决方法

    前言 昨天一天都是启动mysql时提示:The server quit without updating PID file,今天重装了mysql之后还是同样报错,然后恢复了一下/usr/my.cnf突然就可以启动了.(明明昨天/usr/my.cnf就是默认的,有个解决方法说改这个文件才改的) 然后现在就到没有设置root密码的问题了,搜了几个方法都不行,直到看到下面这个方法一才行. 解决方法一: # /etc/init.d/mysql stop # mysqld_safe --user=mysq

  • mysql设置更改root密码、mysql服务器的连接、mysql常用命令的图解

    1.设置更改root密码 查看mysql 启动与否,若没启动就运行:/usr/local/mysql56/bin/mysql ps aux |grep mysql 或 netstat -tulnp |grep 3306 运行mysql 命令,会出现: -bash: mysql: command not found 就把mysql 添加到环境变量: 临时添加:PAHT=$PATH:/usr/local/mysql56/bin 永久添加:echo "export PATH=$PATH:/usr/lo

  • Windows10下MySQL5.7.19安装教程 MySQL忘记root密码修改方法

    以MySQL5.7.19安装为例,先进行下载 当然首先是要下载咯https://dev.mysql.com/downloads/mysql/ 官网下载地址. 选择适合自己电脑的版本,点击Download,跳转,直接No thanks下载好了. 静静的等待下载,解压.这是我的解压路径D:\MySQL 正式开始安装 :Windows10 :MySQL5.7.19 解压之后 然而并没有my.ini 创建一个就行了,新建文本文档->后缀名改成ini就行了. [Client] #设置3306端口 port

  • mysql修改用户密码的方法和mysql忘记密码的解决方法

    修改密码: 复制代码 代码如下: //选择数据库use mysql;//修改密码update user set password=password('新密码') where user='root';//立即生效flush privileges 忘记管理员密码: 在my.ini的[mysqld]字段下面加入: 复制代码 代码如下: skip-grant-tables 重启mysql服务,这时的mysql不需要密码即可登录数据库然后进入mysql 复制代码 代码如下: use mysql;updat

  • MAC上Mysql忘记Root密码或权限错误的快速解决方案

    最近一段时间都在倒腾mantis发现总是连接mysql出错,就随手修改了root权限,导致登录不上了. 下面给大家分享还原root权限和更改root密码的最便捷方法. 1:装mysql workbench .可视化界面直接操作. 2:苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服务 3:进入终端 输入: cd /usr/local/mysql/bin/ 回车后 登录管理员权限 sudo su 回车后输入以下命令来禁止mysql验证功能 ./mysqld_safe -

  • windows下mysql忘记root密码的解决方法

    方法一: 1.在DOS窗口下输入net stop mysql5 或 net stop mysql 2.开一个DOS窗口,这个需要切换到mysql的bin目录. 一般在bin目录里面创建一个批处理1.bat,内容是cmd.exe运行一下即可就切换到当前目录,然后输入 mysqld-nt --skip-grant-tables; 或 mysqld --skip-grant-tables; 不要关闭窗口 3.再开一个DOS窗口,mysql -u root 4.输入: 复制代码 代码如下: use my

  • Windows下mysql修改root密码的4种方法

    MySQL是一个关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一.搭配 PHP 和 Apache 可组成良好的开发环境.因此用的很广泛.很多人都会遇到MySQL需要修改密码的情况,比如密码太简单.忘记密码等等.这里我就教大家几种修改MySQL密码的方法.这里以修改root密码为例,操作系统为windows. 先要声明一点,大部分情况下,修改MySQL是需要

  • MySQL 8忘记密码的最佳处理方式浅析

    前言 对MySQL有研究的读者,可能会发现MySQL更新很快,在安装方式上,MySQL提供了两种经典安装方式:解压式和一键式,虽然是两种安装方式,但我更提倡选择解压式安装,不仅快,还干净.在操作系统上,MySQL也支持多类型操作系统,如linux,windows等,如下为MySQL几个重大变化的操作系统. 通过研究分析,不难发现:MySQL从低版本向高版本迭代变化的过程,越来越严谨的安全性是其一大特点之一,我们举个例子,在版本6前,当忘记密码,重置密码,非常方面,只需使用执行如下两步即可: 步骤

随机推荐