「MySQL」- 用户账户管理

该笔记将记录:常用的数据库用户管理(创建、删除、修改密码等等)语句;

创建用户

MySQL 8.0

MySQL :: MySQL 8.4 Reference Manual :: 15.7.1.3 CREATE USER Statement

CREATE USER 'confluence'@'%' IDENTIFIED BY 'j0V2SvVpCOC';

如果需要同个用户访问多个网段,则需要创建多个用户并使用不同的地址,然后授予相同的密码。

删除用户

MySQL 5.6 Reference Manual/DROP USER Syntax

-- 使用 DROP USER 语句删除一个或多个 MySQL 帐户及其权限。
-- 它从所有的授权表中,删除该帐户的权限行。所以,不需要回收权限。
-- 如果删簇不存在的帐户,将发生错误。
DROP USER 'jeffrey'@'localhost', 'tony'@'localhost';;

DROP USER Syntax

内容:MySQL 中删除用户的语法。

Doc: https://dev.mysql.com/doc/refman/5.7/en/drop-user.html

DROP USER [IF EXISTS] user [, user] …

DROP USER 语句用于删除一个或多个 MySQL 帐户及其对应的权限。它从所有授权表(grant table)中删除该帐户的权限行。

要使用 DROP USER,您必须拥有全局 CREATE USER 权限或 mysql 库的 DELETE 权限。当启用了 read_only 系统变量时,DROP USER 还需要 SUPER 权限。

如果删除不存在的帐户,会产生错误。从 MySQL 5.7.8 开始,可以使用 IF EXISTS 子句,会不存在的帐户产生警告,而不是错误。

示例:

DROP USER 'jeffrey'@'localhost';

-- 帐户名称的 hostname 部分,如果省略,则默认为“%”。

注意:

DROP USER 不会自动关闭任何打开的用户会话。如果登录的用户被删除,直到该用户退出以后该语句才会生效。一旦会话关闭,用户将被删除,用户下一次登录将失败。
DROP USER 不会自动删除或失效旧用户创建的数据库或对象。如果存储过程或视图的 DEFINER 属性为被删除的用户。如果在 DEFINER 的安全上下文中执行,则尝试访问此类对象可能会产生错误。

修改用户

针对用户进行重命名

修改 Host 信息(database administration – Changing host permissions for MySQL users):

RENAME USER 'username'@'127.0.0.1' TO 'username'@'%';

修改密码 | MySQL 8.0

MySQL :: MySQL 8.4 Reference Manual :: 15.7.1.10 SET PASSWORD Statement

SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';

查看用户

WIP

密码管理及配置

在 MySQL 5.7.5 前

MySQL Change a User Password

SET PASSWORD FOR 'user-name-here'@'hostname' = PASSWORD('new-password');

在 MySQL 5.7.5 后

MySQL Change a User Password

ALTER USER 'user'@'hostname' IDENTIFIED BY 'newPass';

忘记 ROOT 密码

MySQL 5.7 Reference Manual/B.4.3.2 How to Reset the Root Password
Reset MySQL 5.7 root password
MySQL :: MySQL 8.4 Reference Manual :: B.3.3.2 How to Reset the Root Password

在忘记密码、交接工作不完善等等场景下,都需要重置 ROOT 密码。

第一步、修改启动参数

  • 在启动数据库时,使用 –skip-grant-tables 选项。建议配合 skip_networking 变量,以防止远程客户端的连接。
  • 或者,在配置文件 my.cnf 中的[mysqld]部分使用 skip_grant_tables 参数,然后重启数据库。

第二步、连接数据库

  • 当第一步完成后,可以无密码访问数据库:mysql -uroot -p -h127.0.0.1 # 直接回车即可,无需输入密码

第三步、重置密码

-- 告诉 MySQL 重新加载授权表,否则无法执行账户管理语句
FLUSH PRIVILEGES;

-- 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';

补充 | 如果上述操作失败,可以修改 MySQL 的用户表:

UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPass') WHERE User = 'root' AND Host = 'localhost';

FLUSH PRIVILEGES;

如果以上方法全部失败,请检查 mysql.user 表是否被破坏。

调整密码策略等级

How to Change MySQL Password Policy Level
MySQL 5.7 Reference Manual/The Password Validation Plugin
Your password does not satisfy the current policy requirements

在修改数据库密码时,产生如下错误提示:

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

问题原因

第一种,在执行 GRANT ALTER ON `itop`.* TO "itop"@"127.0.0.1"; 也会产生该错误。经过我们简单的测试,可能是因为用户不存在而导致该问题的出现。本文不讨论这种情况,而且该问题也较容易解决。

第二种,由于对用户设置的密码没有满足 MySQL 密码策略的要求。这是我们要讨论并解决的问题。

解决方法

解决办法有两种:(1)使用符合密码策略的密码;(2)修改配置以降低密码策略。

自然应该采用(1)方法,但是在某些情况下,我们不得不采用(2)方法以解决问题。我们这里介绍的也是(2)方法。

查看当前密码策略

mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+

修改密码策略

密码策略的修改实际就是配置参数的修改,编辑 my.cnf 的 [mysqld] 部分:

[mysqld]
validate_password_policy=LOW

或者调整全局变量:

SET GLOBAL validate_password_length = 6;
SET GLOBAL validate_password_number_count = 0;