首页 > 数据库 > MySQL > 正文

MySQL 修改用户密码及重置root密码

2024-07-24 13:06:22
字体:
来源:转载
供稿:网友

为数据库用户修改密码是DBA比较常见的工作之一。对于MySQL用户账户的密码修改,有几种不同的方式,推荐的方式使用加密函数来修改密码。本文主要描述了通过几种不同的方式来修改用户密码以及mysql root账户密码丢失(重置root密码)的处理方法。

1、密码修改的几种方法

 

a、可以在创建用户的时候指定密码,以及直接使用grant创建用户的时候指定密码。

对于已经存在的用户直接使用grant方式也可以修改密码

如下:

--演示版本

root@localhost[(none)]>showvariableslike'version%';

+-------------------------+------------------------------+

|Variable_name|Value|

+-------------------------+------------------------------+

|version|5.5.37|

|version_comment|MySQLCommunityServer(GPL)|

|version_compile_machine|x86_64|

|version_compile_os|Linux|

+-------------------------+------------------------------+

--下面我们使用grant方式创建一个新帐户fred,并设定密码

root@localhost[(none)]>grantusageon*.*to'fred'@'localhost'identifiedby'fred';

QueryOK,0rowsaffected(0.00sec)

--查看刚刚创建的账户

root@localhost[(none)]>selecthost,user,passwordfrommysql.userwhereuser='fred';

+-----------+------+-------------------------------------------+

|host|user|password|

+-----------+------+-------------------------------------------+

|localhost|fred|*6C69D17939B2C1D04E17A96F9B29B284832979B7|

+-----------+------+-------------------------------------------+

--下面可以成功登陆mysql

SZDB:~#mysql-ufred-pfred

fred@localhost[(none)]>

b、使用setpassword方式来修改账户密码

--下面我们使用setpassword方式来设定密码

root@localhost[(none)]>setpasswordfor'fred'@'localhost'=password('passwd');

QueryOK,0rowsaffected(0.00sec)

root@localhost[(none)]>flushprivileges;

QueryOK,0rowsaffected(0.00sec)

--再次登陆时,之前的密码已经失效,无法登陆

SZDB:~#mysql-ufred-pfred

ERROR1045(28000):Accessdeniedforuser'fred'@'localhost'(usingpassword:YES)

--下面使用新密码登陆成功

SZDB:~#mysql-ufred-ppasswd

fred@localhost[(none)]>

--检索数据库是否存在jack用户,如下密码为null

root@localhost[(none)]>selecthost,user,passwordfrommysql.userwhereuser='jack';

+-----------+------+----------+

|host|user|password|

+-----------+------+----------+

|localhost|jack||

+-----------+------+----------+

c、加密方式更新系统表user的password列

--我们尝试直接更新密码列(不使用加密函数方式)

root@localhost[(none)]>updatemysql.usersetpassword='jack'whereuser='jack';

QueryOK,1rowaffected(0.00sec)

Rowsmatched:1Changed:1Warnings:0

--由于直接使用明文,因此系统表user列password显示为明文

root@localhost[(none)]>selecthost,user,passwordfrommysql.userwhereuser='jack';

+-----------+------+----------+

|host|user|password|

+-----------+------+----------+

|localhost|jack|jack|

+-----------+------+----------+

--Author:Leshami

--Blog:http://blog.csdn.net/leshami

root@localhost[(none)]>flushprivileges;

QueryOK,0rowsaffected(0.02sec)

--此时无法登陆

SZDB:~#mysql-ujack-pjack-hlocalhost

ERROR1045(28000):Accessdeniedforuser'jack'@'localhost'(usingpassword:YES)

--下面我们通过set方式来修改jack的密码,提示找不到jack用户

root@localhost[(none)]>setpasswordfor'jack'@'localhost'=password('jack');

ERROR1133(42000):Can'tfindanymatchingrowintheusertable

--我们切换到mysql数据库下尝试,

root@localhost[(none)]>usemysql

root@localhost[mysql]>setpasswordfor'jack'@'localhost'=password('passwd');--在mysql数据库下依旧无法更新用户jack的密码

ERROR1133(42000):Can'tfindanymatchingrowintheusertable

--下面我们尝试用password函数方式来更新password列

root@localhost[mysql]>updateusersetpassword=password('passwd')whereuser='jack';--此方式更新成功

QueryOK,1rowaffected(0.04sec)

Rowsmatched:1Changed:1Warnings:0

root@localhost[mysql]>selecthost,user,passwordfromuserwhereuser='jack';--可以看到密码已经变成了密文

+-----------+------+-------------------------------------------+

|host|user|password|

+-----------+------+-------------------------------------------+

|localhost|jack|*59C70DA2F3E3A5BDF46B68F5C8B8F25762BCCEF0|

+-----------+------+-------------------------------------------+

root@localhost[mysql]>flushprivileges;

QueryOK,0rowsaffected(0.00sec)

--此时登陆成功

robin@SZDB:~>mysql-ujack-ppasswd

jack@localhost[(none)]>

2、重置root帐户密码

[sql]

view plaincopyprint?

--假定此时我们的root帐户忘记或遗失了密码,如下面的演示,我们给出的是xxx,不能登陆到mysql(真实的密码为mysql)

SZDB:~#mysql-uroot-pmysql

root@localhost[(none)]>

SZDB:~#mysql-uroot-pxxx#忘记密码,此时无法正常登录

Enterpassword:

ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(usingpassword:NO)

--首先停止mysql服务器

SZDB:~#servicemysqlstop

ShuttingdownMySQL..done

--使用--skip-grant-tables选项跳过授权表验证,

SZDB:~#mysqld--help--verbose#获取mysqld帮助信息

--skip-grant-tablesStartwithoutgranttables.ThisgivesallusersFULL

ACCESStoalltables.

--使用--skip-grant-tables启动mysql服务器

SZDB:~#mysqld--skip-grant-tables--user=mysql&

[1]10209

SZDB:~#ps-ef|grepmysql

mysql1020914240413:52pts/000:00:00mysqld--skip-grant-tables--user=mysql

root1022914240013:53pts/000:00:00grepmysql

SZDB:~#mysql

root@localhost[(none)]>selectuser,host,passwordfrommysql.userwhereuser='root';

+-------+-----------+-------------------------------------------+

|user|host|password|

+-------+-----------+-------------------------------------------+

|root|%|*E74858DB86EBA20BC33D0AECAE8A8108C56B17FA|

|root|127.0.0.1|*E74858DB86EBA20BC33D0AECAE8A8108C56B17FA|

+-------+-----------+-------------------------------------------+

--更新mysql账户密码为NULL或设定为新密码,注设定为空密码时可以直接设置,无须使用加密函数,2者等同

root@localhost[(none)]>updatemysql.usersetpassword=''whereuser='root';

QueryOK,2rowsaffected(0.00sec)

Rowsmatched:2Changed:2Warnings:0

root@localhost[(none)]>selectuser,host,passwordfrommysql.userwhereuser='root';

+------+-----------+----------+

|user|host|password|

+------+-----------+----------+

|root|%||

|root|127.0.0.1||

+------+-----------+----------+

root@localhost[(none)]>exit

Bye

#再次停止mysql数据库服务器

SZDB:~#servicemysqlstop

ShuttingdownMySQL.done

[1]+Donemysqld--skip-grant-tables--user=mysql

SZDB:~#servicemysqlstart

StartingMySQL..done

SZDB:~#mysql#重启后再次登陆,不再需要任何密码

root@localhost[(none)]>

3、小结

a、可以使用set password for'user_name'@'host_name'password=password('new_pwd')方式来修改密码

b、可以使用update系统表方式,update user set password=password('passwd') where user='user_name'

注: 对于user表password类,如果不用password函数的话,导致更新后无法登陆。

但如果将账户更新为空密码,可以使用加密函数,也可以不使用,2者等同。

c、也可以在用户创建后直接使用grant方式来更新用户密码。

d、对应root密码丢失或需要重置root密码的情形,需要使用系统选项--skip-grant-tables启动服务器后进行重置。

e、有关mysql权限及用户管理,创建用户时指定密码,请参考:MySQL 用户与权限管理

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表