mysql8.0---Create user的那些属性
01MySQL8.0.27版本简介
MySQL目前最新版本是8.0.27,今天下载了一个,尝尝鲜。这个版本,更像是一个bug 修复版本,修复了200多个bug。
看到这个结果,如果你线上版本要选择8.0系列,建议避开8.0.26和8.0.27,这其中的原因是:
第一,8.0.26版本bug太多,不建议作为线上;
第二,8.0.27修复了这些bug,所以代码变动比较多,不建议用这样的版本作为线上版本。
我主要对这个Create User这个语法感兴趣,这里谈两点改变:
第一,create user和alter user语法,支持定义多种认证方法;
第二,用户程序可以使用--password1,--password2,--password3三个密码来登录MySQL
但是这个内容后面会专门用文章去讲解,今天主要来看create user里面那些冗长复杂的属性
02create user语法
我简单写了个create user语法,还是有很多的收获的。
mysql> create user yeyz@'10.%'; ERROR 4031 (HY000): The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior. No connection. Trying to reconnect... Connection id: 1606616 Current database: *** NONE *** Query OK, 0 rows affected (0.01 sec) mysql> mysql> show create user yeyz@'10.%'; +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER for yeyz@10.% | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | CREATE USER `yeyz`@`10.%` IDENTIFIED WITH 'mysql_native_password' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
1、红色提示部分,直接给我们提示由于连接不活跃,MySQL Server断开连接,需要考虑是否是wait_timeout和interactive_timeout参数,这一点更加人性化了。
2、在MySQL8.0.27中,一个账号具有很多属性,例如:
IDENTIFIED WITH 'mysql_native_password':认证方法可以选择下面3种,
mysql_native_password
sha256_password
caching_sha2_password
其中默认值是caching_sha2_password,从安全性角度说,它比另外的方法更安全,但是为了和低版本5.7兼容,更倾向于选择mysql_native_password,因为mysql_native_password是MySQL5.7的默认加密方法
REQUIRE NONE:是否加密客户端连接如果你的MySQL需要对当前的客户连接加密,需要通过ssl模式连接,这个时候,在客户端就需要配置 --ssl-mode=REQUIRED,从而支持加密连接。如果Require选项是None,代表当前连接不加密。
PASSWORD EXPIRE DEFAULT:密码过期策略这里采用默认的密码过期策略,默认的策略下,密码过期取决于参数default_password_lifetime,而这个参数的取值可以是0,代表不过期,也可以是一个数字N,代表N天过后,必须修改密码。
mysql> show variables like '%default_password_lifetime%'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | default_password_lifetime | 0 | +---------------------------+-------+ 1 row in set (0.00 sec)
除此之外,还可以取其他的值,例如
password expire never:密码永远不过期;
password expire INTERVAL N DAY:密码在N天后过期
password expire:密码立即过期(也不知道这功能想干啥)
Account Unlock:账号是否被锁定通常情况下,创建一个账号的时候,可以去指定这个账号的锁定状态,在线上环境中,一个账号一般是不被锁定的,如果一个账号被锁定了,再去尝试连接这个账号,就会出现如下报错:
Access denied for user 'user_name'@'host_name'. Account is locked.
在一些特殊场景下,我们可以通过暂时锁定某些账号,来将部分业务请求拦截在数据库外面。
PASSWORD HISTORY default :密码使用次数策略这个属性代表当前数据库是否支持密码重复使用,后面可以跟两个值,分别是default和整数N。
如果是整数N,说明密码可以和之前的第N次密码相同;例如我们第一次设置密码aaa,第二次密码bbb,第三次密码ccc,如果N=3,那么我们在ccc密码过期之后,第四次密码就可以再设置为aaa;
如果N>3,代表第四次密码还不能设置为aaa,因为aaa是历史上最近的
如果是使用default,代表密码使用历史策略取决于password_history系统变量,如下:
mysql> show variables like '%password_history%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | password_history | 0 | +------------------+-------+ 1 row in set (0.00 sec)
这里的0代表不设限,其他数字,跟上述描述一致。
注意:设定了具体的N之后,系统变量将会被忽略。
PASSWORD REUSE INTERVAL:密码使用时间策略这个属性,跟上述属性类似,只不过是时间维度的,后面可以跟具体的天数N或者默认值default。
如果是具体的天数N:代表这个账号可以在N天内被使用,超过之后,必须换密码
CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 360 DAY;
上述案例代表密码可以被使用360天。
如果是default,那么具体的天数,取决于系统变量password_reuse_interval,如下:
mysql> show variables like '%password_reuse_interval%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | password_reuse_interval | 0 | +-------------------------+-------+ 1 row in set (0.01 sec)
注意:设定了具体的N之后,系统设置将会被忽略。
PASSWORD REQUIRE CURRENT:是否需要原密码认证这个属性控制的是修改密码的时候,是否需要原来的密码认证,默认是不需要,它的取值可以是:空、optional或者default
如果后面什么都不跟,也就是空,则代表需要指定原来的密码才能够修改其他用户密码
如果选择的是optional,则不需要指定原来的密码,就能够修改其他用户的密码
如果选择的是default,则具体的行为,取决于password_require_current参数,如果是off,代表不需要原来的密码,如果是on,则代表需要原来的密码;
mysql> show variables like '%password_require_current%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | password_require_current | OFF | +--------------------------+-------+ 1 row in set (0.00 sec)
注意,如果定义了optional或者空,则系统变量password_require_current会被忽略。
另外,如果一个账号有create user权限或者有mysql.user表的update权限,则可以直接修改其他账号的密码,而不需要原来的密码。
简单总结一下:
利用Create user语法创建账号的时候,针对账号的密码本身,可以定义下面7个属性:
1、密码加密方式
2、是否加密客户端连接
3、账号密码是否有过期策略
4、账号是否被锁定
5、密码历史次数策略
6、密码使用天数策略
7、修改密码是否需要原密码策略
这些属性当然可以设置为默认,通常也是这么做的,但是MySQL8.0中引入的这些特性,可以在某些具体场景下,提高密码安全性和可用性。