该笔记将记录:常用的数据库用户管理(创建、删除、修改密码等等)语句;
创建用户
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 前
SET PASSWORD FOR 'user-name-here'@'hostname' = PASSWORD('new-password');
在 MySQL 5.7.5 后
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;