文章目录

  • 用户管理和权限安全
  • 1、user权限表
  • 1.1 用户列
  • 1.2 权限列
  • 1.3 安全列
  • 1.4 资源控制列
  • 2、其他权限表(db、tables_priv、columns_priv、procs_priv)
  • 2.1 db表
  • 2.2 tables_priv表和columns_priv表
  • 2.3 procs_priv表
  • 3、创建用户的方式
  • 3.1 使用create user创建
  • 3.2 在mysql.user表中添加用户
  • 4、修改用户名
  • 5、删除用户
  • 6、查看用户的权限和修改、删除用户权限
  • 6.1 查看用户权限
  • 6.2 修改用户权限
  • 6.3 删除用户权限
  • 7、登陆和退出服务器
  • 7.1 登陆服务器
  • 7.2 退出服务器
  • 8、修改用户密码
  • 8.1 root修改普通用户密码
  • 8.2 修改root密码
  • 9 MySQL忘记密码解决方案


用户管理和权限安全

MySQL 是一个多用户数据库,具有功能强大的访问控制系统,可以为不同用户指定不同权限。在前面的章节中我们使用的是 root 用户,该用户是超级管理员,拥有所有权限,包括创建用户、删除用户和修改用户密码等管理权限。为了实际项目的需要,可以创建拥有不同权限的普通用户。

1、user权限表

MySQL 在安装时会自动创建一个名为 mysql 的数据库,mysql 数据库中存储的都是用户权限表。用户登录以后,MySQL 会根据这些权限表的内容为每个用户赋予相应的权限。

user 表是 MySQL 中最重要的一个权限表,用来记录允许连接到服务器的账号信息。需要注意的是,在 user 表里启用的所有权限都是全局级的,适用于所有数据库。

user 表中的字段大致可以分为 4 类,分别是用户列、权限列、安全列和资源控制列,下面主要介绍这些字段的含义。

1.1 用户列

用户列存储了用户连接 MySQL 数据库时需要输入的信息。需要注意的是 MySQL 5.7 版本后不再使用 Password 来作为密码的字段,而改成了 authentication_string。

MySQL 5.7 版本的用户列如表所示。

user 表的用户列

字段名

字段类型

是否为空

默认值

说明

Host

char(60)

NO


主机名

User

char(32)

NO


用户名

authentication_string

text

YES


密码

用户登录时,如果这 3 个字段同时匹配,MySQL 数据库系统才会允许其登录。创建新用户时,也是设置这 3 个字段的值。修改用户密码时,实际就是修改 user 表的 authentication_string 字段的值。因此,这 3 个字段决定了用户能否登录。

实例

mysql 登录时效 mysql用户登录日志_数据库

1.2 权限列

权限列的字段决定了用户的权限,用来描述在全局范围内允许对数据和数据库进行的操作。

权限大致分为两大类,分别是高级管理权限和普通权限:

  • 高级管理权限主要对数据库进行管理,例如关闭服务的权限、超级权限和加载用户等;
  • 普通权限主要操作数据库,例如查询权限、修改权限等。

user 表的权限列包括 Select_priv、Insert_ priv 等以 priv 结尾的字段,这些字段值的数据类型为 ENUM,可取的值只有 Y 和 N:Y 表示该用户有对应的权限,N 表示该用户没有对应的权限。从安全角度考虑,这些字段的默认值都为 N。

mysql 登录时效 mysql用户登录日志_linux_02

如果要修改权限,可以使用 GRANT 语句为用户赋予一些权限,也可以通过 UPDATE 语句更新 user 表的方式来设置权限。

字段实例

mysql 登录时效 mysql用户登录日志_mysql 登录时效_03

1.3 安全列

安全列主要用来判断用户是否能够登录成功,user 表中的安全列如表所示:

user 表的安全列

字段名

字段类型

是否为空

默认值

说明

ssl_type

enum(’’,‘ANY’,‘X509’,‘SPECIFIED’)

NO

支持ssl标准加密安全字段

ssl_cipher

blob

NO

支持ssl标准加密安全字段

x509_issuer

blob

NO

支持x509标准字段

x509_subject

blob

NO

支持x509标准字段

plugin

char(64)

NO

mysql_native_password

引入plugins以进行用户连接时的密码验证,plugin创建外部/代理用户

password_expired

enum(‘N’,‘Y’)

NO

N

密码是否过期 (N 未过期,y 已过期)

password_last_changed

timestamp

YES

记录密码最近修改的时间

password_lifetime

smallint(5) unsigned

YES

设置密码的有效时间,单位为天数

account_locked

enum(‘N’,‘Y’)

NO

N

用户是否被锁定(Y 锁定,N 未锁定)

注意:即使 password_expired 为“Y”,用户也可以使用密码登录 MySQL,但是不允许做任何操作。

通常标准的发行版不支持 ssl,可以使用 SHOW VARIABLES LIKE “have_openssl” 语句来查看是否具有 ssl 功能。如果 have_openssl 的值为 YES,那么则支持 ssl 加密功能。

mysql 登录时效 mysql用户登录日志_mysql 登录时效_04

1.4 资源控制列

资源控制列的字段用来限制用户使用的资源,user 表中的资源控制列如表所示。
user 表的资源控制列

字段名

字段类型

是否为空

默认值

说明

max_questions

int(11) unsigned

NO

0

规定每小时允许执行查询的操作次数

max_updates

int(11) unsigned

NO

0

规定每小时允许执行更新的操作次数

max_connections

int(11) unsigned

NO

0

规定每小时允许执行的连接操作次数

max_user_connections

int(11) unsigned

NO

0

规定允许同时建立的连接次数

以上字段的默认值为 0,表示没有限制。一个小时内用户查询或者连接数量超过资源控制限制,用户将被锁定,直到下一个小时才可以在此执行对应的操作。可以使用 GRANT 语句更新这些字段的值。

2、其他权限表(db、tables_priv、columns_priv、procs_priv)

在 MySQL 数据库中,权限表除了 user 表外,还有 db 表、tables_priv 表、columns_priv 表和 procs_priv 表。

mysql 登录时效 mysql用户登录日志_linux_05

2.1 db表

db 表比较常用,是 MySQL 数据库中非常重要的权限表,表中存储了用户对某个数据库的操作权限。表中的字段大致可以分为两类,分别是用户列和权限列。
用户列
db 表用户列有 3 个字段,分别是 Host、User、Db,标识从某个主机连接某个用户对某个数据库的操作权限,这 3 个字段的组合构成了 db 表的主键。

db 表的用户列如下表所示:

字段名

字段类型

是否为空

默认值

说明

Host

char(60)

NO


主机名

Db

char(64)

NO


数据库名

User

char(32)

NO


用户名

权限列
db 表中的权限列和 user 表中的权限列大致相同,只是user 表中的权限是针对所有数据库的,而 db 表中的权限只针对指定的数据库。如果希望用户只对某个数据库有操作权限,可以先将 user 表中对应的权限设置为 N,然后在 db 表中设置对应数据库的操作权限。

2.2 tables_priv表和columns_priv表

tables_priv 表用来对单个表进行权限设置,columns_priv 表用来对单个数据列进行权限设置。

tables_priv 表结构

字段名

字段类型

是否为空

默认值

说明

Host

char(60)

NO


主机

Db

char(64)

NO


数据库名

User

char(32)

NO


用户名

Table_name

char(64)

NO


表名

Grantor

char(93)

NO


修改该记录的用户

Timestamp

timestamp

NO

CURRENT_TIMESTAMP

修改该记录的时间

Table_priv

set(‘Select’,‘Insert’,‘Update’,‘Delete’,‘Create’,‘Drop’,‘Grant’,‘References’,‘Index’,‘Alter’,‘Create View’,‘Show view’,‘Trigger’)

NO


表示对表的操作权限,包括 Select、Insert、Update、Delete、Create、Drop、Grant、References、Index 和 Alter 等

Column_priv

set(‘Select’,‘Insert’,‘Update’,‘References’)

NO


表示对表中的列的操作权限,包括 Select、Insert、Update 和 References

columns_priv 表结构

字段名

字段类型

是否为空

默认值

说明

Host

char(60)

NO


主机

Db

char(64)

NO


数据库名

User

char(32)

NO


用户名

Table_name

char(64)

NO


表名

Column_name

char(64)

NO


数据列名称,用来指定对哪些数据列具有操作权限

Timestamp

timestamp

NO

CURRENT_TIMESTAMP

修改该记录的时间

Column_priv

set(‘Select’,‘Insert’,‘Update’,‘References’)

NO


表示对表中的列的操作权限,包括 Select、Insert、Update 和 References

2.3 procs_priv表

procs_priv 表可以对存储过程和存储函数进行权限设置,procs_priv 的表结构如表所示:

字段名

字段类型

是否为空

默认值

说明

Host

char(60)

NO


主机名

Db

char(64)

NO


数据库名

User

char(32)

NO


用户名

Routine_name

char(64)

NO


表示存储过程或函数的名称

Routine_type

enum(‘FUNCTION’,‘PROCEDURE’)

NO


表示存储过程或函数的类型,Routine_type

Grantor

char(93)

NO


插入或修改该记录的用户

Proc_priv

set(‘Execute’,‘Alter Routine’,‘Grant’)

NO


表示拥有的权限,包括 Execute、Alter Routine、Grant 3种

Timestamp

timestamp

NO

CURRENT_TIMESTAMP

表示记录更新时间

3、创建用户的方式

MySQL 在安装时,会默认创建一个名为 root 的用户,该用户拥有超级权限,可以控制整个 MySQL 服务器。

在对 MySQL 的日常管理和操作中,为了避免有人恶意使用 root 用户控制数据库,我们通常创建一些具有适当权限的用户,尽可能地不用或少用 root 用户登录系统,以此来确保数据的安全访问。

MySQL 提供了以下 方法创建用户。

  • 使用 CREATE USER 语句创建用户
  • 在 mysql.user 表中添加用户

虽然 CREATE USER 和 INSERT INTO 语句都可以创建普通用户,但是这两种方式不便授予用户权限。于是 MySQL 提供了 GRANT 语句。故我们最后使用 GRANT 语句赋予用户权限

注意grant不允许用来创建用户

mysql 登录时效 mysql用户登录日志_mysql_06

3.1 使用create user创建

可以使用 CREATE USER 语句来创建 MySQL 用户,并设置相应的密码。其语法格式如下:

CREATE USER <用户> [ IDENTIFIED BY [ PASSWORD ] 'password' ] [ ,用户 [ IDENTIFIED BY [ PASSWORD ] 'password' ]]

参数说明如下:

  1. 用户
    指定创建用户账号,格式为 user_name’@'host_name。这里的user_name是用户名,host_name为主机名,即用户连接 MySQL 时所用主机的名字。如果在创建的过程中,只给出了用户名,而没指定主机名,那么主机名默认为“%”,表示一组主机,即对所有主机开放权限。
  2. IDENTIFIED BY子句
    用于指定用户密码。新用户可以没有初始密码,若该用户不设密码,可省略此子句。
  3. PASSWORD ‘password’
    PASSWORD 表示使用哈希值设置密码,该参数可选。如果密码是一个普通的字符串,则不需要使用 PASSWORD 关键字。‘password’ 表示用户登录时使用的密码,需要用单引号括起来。

使用 CREATE USER 语句时应注意以下几点:

  • CREATE USER 语句可以不指定初始密码。但是从安全的角度来说,不推荐这种做法。
  • 使用 CREATE USER 语句必须拥有 mysql 数据库的 INSERT 权限或全局 CREATE USER 权限。
  • 使用 CREATE USER 语句创建一个用户后,MySQL 会在 mysql 数据库的 user 表中添加一条新记录。
  • CREATE USER 语句可以同时创建多个用户,多个用户用逗号隔开。

新创建的用户拥有的权限很少,它们只能执行不需要权限的操作。如登录 MySQL、使用 SHOW 语句查询所有存储引擎和字符集的列表等。如果两个用户的用户名相同,但主机名不同,MySQL 会将它们视为两个用户,并允许为这两个用户分配不同的权限集合。

下面学习创建用户test1,密码test1

mysql 登录时效 mysql用户登录日志_数据库_07


在实际应用中,我们应避免明文指定密码,可以通过 PASSWORD 关键字使用密码的哈希值设置密码。

mysql8.0 版本再用password函数就会报错:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

故需要加密解密函数:MySQL 8.0 加密解密函数

使用md5加密test1密码如下:

mysql 登录时效 mysql用户登录日志_mysql 登录时效_08

3.2 在mysql.user表中添加用户

可以使用 INSERT 语句将用户的信息添加到 mysql.user 表中,但必须拥有对 mysql.user 表的 INSERT 权限。通常 INSERT 语句只添加 Host、User 和 authentication_string 这 3 个字段的值。
MySQL 5.7 的 user 表中的密码字段从 Password 变成了 authentication_string,如果你使用的是 MySQL 5.7 之前的版本,将 authentication_string 字段替换成 Password 即可。

使用 INSERT 语句创建用户的代码如下:

INSERT INTO mysql.user(Host, User,  authentication_string, ssl_cipher, x509_issuer, x509_subject) VALUES ('hostname', 'username', PASSWORD('password'), '', '', '');

//插入后需要刷新mysql的权限
flush privileges

由于 mysql 数据库的 user 表中,ssl_cipher、x509_issuer 和 x509_subject 这 3 个字段没有默认值,所以向 user 表插入新记录时,一定要设置这 3 个字段的值,否则 INSERT 语句将不能执行。

注意:user 表中的 User 和 Host 字段区分大小写,创建用户时要指定正确的用户名称或主机名。

4、修改用户名

在 MySQL 中,我们可以使用 RENAME USER 语句修改一个或多个已经存在的用户账号。

语法格式如下:

RENAME USER <旧用户> TO <新用户>

其中:

  • <旧用户>:系统中已经存在的 MySQL 用户账号。
  • <新用户>:新的 MySQL 用户账号。

使用 RENAME USER 语句时应注意以下几点:

  • RENAME USER 语句用于对原有的 MySQL 用户进行重命名。
  • 若系统中旧账户不存在或者新账户已存在,该语句执行时会出现错误。
  • 使用 RENAME USER 语句,必须拥有 mysql 数据库的 UPDATE 权限或全局 CREATE USER 权限。

实例

mysql> RENAME USER 'test1'@'localhost'
    -> TO 'testUser1'@'localhost';
Query OK, 0 rows affected (0.03 sec)

5、删除用户

1、使用drop user语句

使用 DROP USER 语句删除普通用户
使用 DROP USER 语句删除用户的语法格式如下:

DROP USER <用户1> [ , <用户2> ]…

其中,用户用来指定需要删除的用户账号。

使用 DROP USER 语句应注意以下几点:

  • DROP USER 语句可用于删除一个或多个用户,并撤销其权限。
  • 使用 DROP USER 语句必须拥有 mysql 数据库的 DELETE 权限或全局 CREATE USER 权限。
  • 在 DROP USER 语句的使用中,若没有明确地给出账户的主机名,则该主机名默认为“%”

2、使用delete语句

使用DELETE语句删除普通用户
可以使用 DELETE 语句直接删除 mysql.user 表中相应的用户信息,但必须拥有 mysql.user 表的 DELETE 权限。其基本语法格式如下:

DELETE FROM mysql.user WHERE Host='hostname' AND User='username';

Host 和 User 这两个字段都是 mysql.user 表的主键。因此,需要两个字段的值才能确定一条记录。

3、实例

mysql 登录时效 mysql用户登录日志_mysql 登录时效_09

6、查看用户的权限和修改、删除用户权限

6.1 查看用户权限

在 MySQL 中,可以通过查看 mysql.user 表中的数据记录来查看相应的用户权限,也可以使用 SHOW GRANTS 语句查询用户的权限。

mysql 数据库下的 user 表中存储着用户的基本权限,可以使用 SELECT 语句来查看。SELECT 语句的代码如下:

SELECT * FROM mysql.user;

要执行该语句,必须拥有对 user 表的查询权限。

注意:新创建的用户只有登录 MySQL 服务器的权限,没有任何其它权限,不能查询 user 表。

除了使用 SELECT 语句之外,还可以使用 SHOW GRANTS FOR 语句查看权限。其语法格式如下:

SHOW GRANTS FOR 'username'@'hostname';

其中,username 表示用户名,hostname 表示主机名或主机 IP。

实例

mysql 登录时效 mysql用户登录日志_数据库_10

6.2 修改用户权限

授权就是为某个用户赋予某些权限。例如,可以为新建的用户赋予查询所有数据库和表的权限。MySQL 提供了 GRANT 语句来为用户设置权限。

在 MySQL 中,拥有 GRANT 权限的用户才可以执行 GRANT 语句,其基本语法格式如下:

GRANT priv_type [(column_list)] ON database.table
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user[IDENTIFIED BY [PASSWORD] 'password']] ...
[WITH with_option [with_option]...]

其中:

  • priv_type 参数表示权限类型;
  • columns_list 参数表示权限作用于哪些列上,省略该参数时,表示作用于整个表;
  • database.table 用于指定权限的级别;
  • user 参数表示用户账户,由用户名和主机名构成,格式是“‘username’@‘hostname’”;
  • IDENTIFIED BY 参数用来为用户设置密码;
  • password 参数是用户的新密码。

WITH 关键字后面带有一个或多个 with_option 参数。这个参数有 5 个选项,详细介绍如下:

  • GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;
  • MAX_QUERIES_PER_HOUR count:设置每个小时可以允许执行 count 次查询;
  • MAX_UPDATES_PER_HOUR count:设置每个小时可以允许执行 count 次更新;
  • MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立 count 个连接;
  • MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的 count 个连接。

MySQL 中可以授予的权限有如下几组:

  • 列权限,和表中的一个具体列相关。例如,可以使用 UPDATE 语句更新表 students 中 name 列的值的权限。
  • 表权限,和一个具体表中的所有数据相关。例如,可以使用 SELECT 语句查询表 students 的所有数据的权限。
  • 数据库权限,和一个具体的数据库中的所有表相关。例如,可以在已有的数据库 mytest 中创建新表的权限。
  • 用户权限,和 MySQL 中所有的数据库相关。例如,可以删除已有的数据库或者创建一个新的数据库的权限。

对应地,在 GRANT 语句中可用于指定权限级别的值有以下几类格式:

mysql 登录时效 mysql用户登录日志_数据库_11


1)授予数据库权限时,<权限类型>可以指定为以下值:

mysql 登录时效 mysql用户登录日志_linux_12


2)授予表权限时,<权限类型>可以指定为以下值:

mysql 登录时效 mysql用户登录日志_java_13


3) 授予列权限时,<权限类型>的值只能指定为 SELECT、INSERT 和 UPDATE,同时权限的后面需要加上列名列表 column-list。

4) 最有效率的权限是用户权限。

授予用户权限时,<权限类型>除了可以指定为授予数据库权限时的所有值之外,还可以是下面这些值:

  • CREATE USER:表示授予用户可以创建和删除新用户的权限。
  • SHOW DATABASES:表示授予用户可以使用 SHOW DATABASES 语句查看所有已有的数据库的定义的权限。

6.3 删除用户权限

在 MySQL 中,可以使用 REVOKE 语句删除某个用户的某些权限(此用户不会被删除),在一定程度上可以保证系统的安全性。例如,如果数据库管理员觉得某个用户不应该拥有 DELETE 权限,那么就可以删除 DELETE 权限。

使用 REVOKE 语句删除权限的语法格式有两种形式,如下所示:
1)第一种
删除用户某些特定的权限,语法格式如下:

REVOKE priv_type [(column_list)]...
ON database.table
FROM user [, user]...

REVOKE 语句中的参数与 GRANT 语句的参数意思相同。其中:

  • priv_type 参数表示权限的类型;
  • column_list 参数表示权限作用于哪些列上,没有该参数时作用于整个表上;
  • user 参数由用户名和主机名构成,格式为“username’@‘hostname’”。

2)第二种
删除特定用户的所有权限,语法格式如下:

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

删除用户权限需要注意以下几点:

  • REVOKE 语法和 GRANT 语句的语法格式相似,但具有相反的效果。
  • 要使用 REVOKE 语句,必须拥有 MySQL 数据库的全局 CREATE USER 权限或 UPDATE 权限。

实战例子:

mysql> REVOKE INSERT ON *.*
    -> FROM 'testUser'@'localhost';
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW GRANTS FOR 'testUser'@'localhost';
+-----------------------------------------------------------------+
| Grants for testUser@localhost                                   |
+-----------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'testUser'@'localhost' WITH GRANT OPTION |
+-----------------------------------------------------------------+
1 row in set (0.00 sec)

删除 testUser 用户的 INSERT 权限成功。

7、登陆和退出服务器

7.1 登陆服务器

启动 MySQL 服务后,可以使用以下命令来登录。

mysql -h hostname|hostlP -p port -u username -p DatabaseName -e "SQL语句"

对上述参数说明如下:
-h:指定连接 MySQL 服务器的地址。可以用两种方式表示,hostname 为主机名,hostIP 为主机 IP 地址。
-p:指定连接 MySQL 服务器的端口号,port 为连接的端口号。MySQL 的默认端口号是 3306,因此如果不指定该参数,默认使用 3306 连接 MySQL 服务器。
-u:指定连接 MySQL 服务器的用户名,username 为用户名。
-p:提示输入密码,即提示 Enter password。
DatabaseName:指定连接到 MySQL 服务器后,登录到哪一个数据库中。如果没有指定,默认为 mysql 数据库。
-e:指定需要执行的 SQL 语句,登录 MySQL 服务器后执行这个 SQL 语句,然后退出 MySQL 服务器。

mysql 登录时效 mysql用户登录日志_linux_14


也可以在-p后面写上密码,注意没有空格。

7.2 退出服务器

exit;
或者
quit;
或者
\q;

8、修改用户密码

8.1 root修改普通用户密码

1、使用SET语句修改普通用户的密码

在 MySQL 中,只有 root 用户可以通过更新 MySQL 数据库来更改密码。使用 root 用户登录到 MySQL 服务器后,可以使用 SET 语句来修改普通用户密码。语法格式如下:

SET PASSWORD FOR 'username'@'hostname' = PASSWORD ('newpwd');

其中,username 参数是普通用户的用户名,hostname 参数是普通用户的主机名,newpwd 是要更改的新密码。

注意:新密码必须使用 PASSWORD() 函数来加密,如果不使用 PASSWORD() 加密,也会执行成功,但是用户会无法登录。MySQL8.0版本移除password()函数,可以用其他加密方法。

如果是普通用户修改密码,可省略 FOR 子句来更改自己的密码。语法格式如下:

SET PASSWORD = PASSWORD('newpwd');

2、使用UPDATE语句修改普通用户的密码

使用 root 用户登录 MySQL 服务器后,可以使用 UPDATE 语句修改 MySQL 数据库的 user 表的 authentication_string 字段,从而修改普通用户的密码。UPDATA 语句的语法如下:

UPDATE MySQL.user SET authentication_string = PASSWORD("newpwd") WHERE User = "username" AND Host = "hostname";

其中,username 参数是普通用户的用户名,hostname 参数是普通用户的主机名,newpwd 是要更改的新密码。

注意,执行 UPDATE 语句后,需要执行 FLUSH PRIVILEGES 语句重新加载用户权限。

3、使用 GRANT 语句修改普通用户密码

除了前面介绍的方法,还可以在全局级别使用 GRANT USAGE 语句指定某个账户的密码而不影响账户当前的权限。需要注意的是,使用 GRANT 语句修改密码,必须拥有 GRANT 权限。一般情况下最好使用该方法来指定或修改密码。语法格式如下:

GRANT USAGE ON *.* TO 'user'@’hostname’ IDENTIFIED BY 'newpwd';

其中,username 参数是普通用户的用户名,hostname 参数是普通用户的主机名,newpwd 是要更改的新密码。

8.2 修改root密码

1、使用mysqladmin命令在命令行指定新密码

root 用户可以使用 mysqladmin 命令来修改密码,mysqladmin 的语法格式如下:

mysqladmin -u username -h hostname -p password "newpwd"

语法参数说明如下:

  • usermame 指需要修改密码的用户名称,在这里指定为 root 用户;
  • hostname 指需要修改密码的用户主机名,该参数可以不写,默认是 localhost;
  • password 为关键字,而不是指旧密码;
  • newpwd 为新设置的密码,必须用双引号括起来。如果使用单引号会引发错误,可能会造成修改后的密码不是你想要的。

执行完上面的语句,root 用户的密码将被修改为“newpwd”。

2、修改MySQL数据库user表的authentication_string列
因为所有账户信息都保存在 user 表中,因此可以直接通过修改 user 表来改变 root 用户的密码。

root 用户登录到 MySQL 服务器后,可以使用 UPDATE 语句修改 MySQL 数据库的 user 表的 authentication_string 字段,从而修改用户的密码。

使用 UPDATA 语句修改 root 用户密码的语法格式如下:
UPDATE mysql.user set authentication_string = PASSWORD ("rootpwd) WHERE User = “root” and Host=“localhost”;

新密码必须使用 PASSWORD() 函数来加密。执行UPDATE语句后,需要执行FLUSH PRIVILEGES语句重新加载用户权限。

3、使用SET语句修改root用户的密码
SET PASSWORD 语句可以用来重新设置其他用户的登录密码或者自己使用的账户的密码。使用 SET 语句修改密码的语法结构如下:

SET PASSWORD = PASSWORD ("rootpwd");

9 MySQL忘记密码解决方案

方法:在忘记 MySQL 密码的情况下,可以通过 --skip-grant-tables 关闭服务器的认证,然后重置 root 的密码
第一步:窗口A中关闭权限表验证,然后新开一个窗口B,输入mysql登陆
窗口A:

net stop mysql;
mysqld --console --skip-grant-tables --shared-memory

窗口B:

mysql;

第二步:窗口B中修改user表里面的密码,然后刷新权限,退出服务器

update mysql.user set authentication_string=password('root') where user='root' and Host ='localhost';
flush privileges;
exit;

第三步:关闭窗口A,在窗口B中重启mysql服务,然后按照正常输入密码登陆

图解过程

mysql 登录时效 mysql用户登录日志_java_15