1.创建用户
1)概述
- 由于MySQL中所有用户的信息都保存在mysql.user表中。
- 创建用户可以直接利用root用户登录MySQL服务器后,向mysql.user表中插入记录,但是在开发中为保证数据的安全,并不推荐使用此方式创建用户。
- 采用MySQL提供的CREATE USER语句创建用户。
- 采用MySQL提供的GRANT语句创建用户,在讲解权限时讲解。
- 使用CREATE USER语句每创建一个新用户,都会在mysql.user表中添加一条记录,同时服务器会自动修改相应的授权表。
- 该语句创建的新用户默认情况下没有任何权限,需要使用GRANT进行授权。
语法:
CREATE USER [IF NOT EXISTS]
账户名 [用户身份验证选项][, 账户名 [用户身份验证选项]]…
[WITH 资源控制选项][密码管理选项 | 账户锁定选项]
- CREATE USER可以一次创建多个用户,多个用户之间使用逗号分隔。
- 账户名是由“用户名@主机地址”组成。
- 其余选项在创建用户时,若未设置则使用默认值。
- 用户名的设置不能超过32个字符,且区分大小写,但是主机地址不区分大小写。
CREATE USER语句选项的默认值:
用户身份验证选项:由default_authentication_plugin系统变量定义的插件进行身份验证
加密连接协议选项:NONE
资源控制选项:N(表示无限制)
密码管理选项:PASSWORD EXPIRE DEFAULT
用户锁定选项:ACCOUNT UNLOCK
用户身份验证选项的设置仅适用于其前面的用户名,可将其理解为某个用户的私有属性。
其余的选项对声明中的所有用户都有效,可以将其理解为全局属性。
2)创建最简单的用户
CREATE USER 'test1';
查看用户是否已创建
SELECT host, user FROM mysql.user;
在创建用户时,若不指定主机地址、密码以及相关的用户选项,则表示此用户在访问MySQL服务器时,不限定客户端、不需要密码并且没有任何限制。
host的值为“%”表示任何主机,其值为localhost时,表本地主机,其值为空字符串(‘’)时,表示所有客户端。
用户名和主机名在设置时,若不包含空格、“-”等特殊字符,则可以省略引号。
当创建的用户名称为空字符串('')时,表示创建的是一个匿名用户,即登录MySQL服务器时不需要输入用户名和密码,这种操作会给MySQL服务器带来极大的安全隐患,因此不推荐用户创建并使用匿名用户操作MySQL服务器。
3)创建含有密码的用户
CREATE USER 'test2'@'localhost' IDENTIFIED BY '123456';
查看用户的密码
SELECT plugin, authentication_string FROM mysql.user WHERE user='test2';
在设置用户密码时还可以指定对密码加密的插件,只需将“IDENTIFIED BY ‘明文密码’”修改为指定的选项即可。
IDENTIFIED WITH 验证插件名:使用指定的身份验证插件对空凭证(未设置用户密码)进行加密
IDENTIFIED WITH 验证插件名 BY '明文密码':利用指定的身份验证插件对明文密码进行加密
IDENTIFIED WITH验证插件名AS '哈希字符串':指定身份验证的插件,并存储哈希加密字符串
IDENTIFIED BY PASSWORD '哈希字符串':身份验证插件为默认,并存储哈希加密字符串
CREATE USER 'test3_1'@'localhost'IDENTIFIED WITH 'mysql_native_password' BY '123456';
CREATE USER 'test3_2'@'localhost'IDENTIFIED WITH 'sha256_password' BY '123456';
WITH关键字指明验证密码的插件名。
关键字BY后跟明文的密码。
查看用户的密码
SELECT plugin, authentication_string FROM mysql.user WHERE user='test3_1' OR user='test3_2';
4)同时创建多个用户
CREATE USER
'test4'@'localhost' IDENTIFIED BY '333333',
'test5'@'localhost' IDENTIFIED BY '444444';
多个用户之间使用逗号分隔。
在创建每个用户时可以单独为其设置密码,省略用户身份验证选项时,表明此用户在登录服务器时可以免密登录,但为了保证数据安全,不推荐用户这样做。
5)设置用户可操作资源范围
在创建用户时,可以添加WITH直接为用户指定可操作的资源范围,如登录的用户在一小时内可以查询数据的次数等。
- MAX_QUERIES_PER_HOUR:在任何一个小时内,允许此用户执行多少次查询
- MAX_UPDATES_PER_HOUR:在任何一个小时内,允许此用户执行多少次更新
- MAX_CONNECTIONS_PER_HOUR:在任何一个小时内,允许此用户执行多少次服务器连接
- MAX_USER_CONNECTIONS:限制用户同时连接服务器的最大数量
MAX_USER_CONNECTIONS选项的值为0时,服务器将根据max_user_connections系统变量的值确定用户的同时连接数,若此变量值也为0,表示对该用户没有限制。
MAX_QUERIES_PER_HOUR选项不会计算从缓存中查询数据的次数。
限制其每小时最多可以更新10次
CREATE USER
'test6'@'localhost' IDENTIFIED BY '555555'
WITH MAX_UPDATES_PER_HOUR 10;
查看use表的max_updates字段
SELECT max_updates FROM mysql.user WHERE user='test6';
6)设置有密码期限的用户
在创建用户时,不仅可以为用户设置密码,还可以为密码设置有效时间。
PASSWORD EXPIRE:将密码标记为过期
PASSWORD EXPIRE DEFAULT:根据default_password_lifetime系统变量的指定设置密码的有效性
PASSWORD EXPIRE NEVER:密码永不过期
PASSWORD EXPIRE INTERVAL n DAY:将帐户密码生存期设置为 n天
PASSWORD EXPIRE选项表示在创建用户时含有此选项的用户在登录后,执行任何SQL语句操作前,都需要重置用户的密码,否则会给出一个“在执行此语句之前,必须使用ALTER USER语句重置密码”的错误提示信息。
在重置用户密码时,操作的用户必须要有全局的CREATE USER权限或mysql数据库的UPDATE权限。
设置用户密码每180天更改一次
CREATE USER 'test7'@'localhost' IDENTIFIED BY '666666'
PASSWORD EXPIRE INTERVAL 180 DAY;
通常为了确保MySQL客户端用户本身的安全,通常情况下推荐每3~6个月变更一次数据库用户密码。
查看use表的password_lifetime字段
SELECT password_lifetime FROM mysql.user WHERE user='test7';
7)设置用户是否锁定
利用ACCOUNT关键字可以为创建的用户设置是否被锁定。
它有两个可选值,分别为LOCK(锁定)和UNLOCK(解锁)。
被锁定的用户不能在客户端登录MySQL服务器。
创建一个锁定状态的用户
CREATE USER 'test8'@'localhost' IDENTIFIED BY '777777'
PASSWORD EXPIRE ACCOUNT LOCK;
查看user表的account_ locked字段
SELECT account_locked FROM mysql.user WHERE user='test8';
8)设置密码
在对MySQL中的用户进行管理时,除了创建用户的同时设置密码外,还可为没有密码的用户、密码过期的用户或为指定用户修改密码。
语法
# 第1种语法(推荐)
ALTER USER 账户名 IDENTIFIED BY '明文密码';
# 第2种语法
SET PASSWORD [FOR账户名] = '明文密码'
# 第3种语法
SET PASSWORD [FOR账户名] = PASSWORD('明文密码)
ALTER USER是更改密码的首选SQL语句,推荐使用。
第2种语法可能会被记录到服务器的日志或客户端的历史文件中,会有密码泄露的风险,因此建议用户尽量少的使用此方式设置密码。
第3种语法从MySQL 5.7.6开始已被弃用,并且将在未来的MySQL版本中被删除,因此本书中不推荐使用此语法。
为指定用户设置密码
ALTER USER 'test1'@'%' IDENTIFIED BY '123456';
为登录用户设置密码
ALTER USER USER() IDENTIFIED BY '000000';
若当前通过客户端连接MySQL服务器的用户是非匿名用户,则可以使用USER()函数更改自己的密码,而无需直接为自己的账户命名。
USER()函数获取的是客户端提供的用户和主机地址,它可能与当前通过MySQL服务器验证的用户与主机名不同,此时可利用MySQL提供CURRENT_USER()函数获取。
SELECT CURRENT_USER();
2.root密码丢失找回
在MySQL的配置文件my.ini(C:\ProgramData\MySQL\MySQL Server 5.7)中添加skip-grant-tables选项
重启MySQL服务
利用root用户登录,跳过密码的输入直接登录MySQL服务
刷新权限,这步一般可以省略,但是有时会设置密码失败,所以建议执行一下
FLUSH PRIVILEGES;
- 为root用户设置密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
删除my.ini(C:\ProgramData\MySQL\MySQL Server 5.7)中skip-grant-tables选项
重启MySQL服务
但是此种方式存在非常大的安全风险。因此,建议读者要慎重使用。
3.修改用户
用户创建完成后,管理员可以通过 MySQL提供的专门SQL语句修改用户的密码、身份验证的方式、资源限制、密码的属性、以及账户的锁定和解锁的状态。
语法
ALTER USER [IF EXISTS]
账户名 [用户身份验证选项][, 账户名 [用户身份验证选项]]…
[WITH 资源限制选项][密码管理选项 | 账户锁定选项]
ALTER USER可同时修改一个或多个用户,多个用户之间使用逗号(,)分隔。
语法中选项的可选值与创建用户时的选项完全相同。
每个修改的用户,都会更新其在mysql.user表中对应的字段值,而未修改的字段仍然保留它原来的值。
修改用户验证插件、密码以及密码过期时间
ALTER USER 'test1'@'%'
IDENTIFIED WITH sha256_password BY '111111'
PASSWORD EXPIRE;
查看修改后用户的密码
SELECT authentication_string FROM mysql.user
WHERE user='test1' AND plugin='sha256_password';
解锁用户
ALTER USER 'test8'@'localhost' ACCOUNT UNLOCK;
为用户重命名
在利用ALTER USER修改用户时只能修改指定账户的相关选项,如密码、验证插件、资源控制选项等,而不能够为用户重新命名,此时可以使用MySQL专门提供的RENAME USER语句实现。
语法
RENAME USER
旧用户名1 TO 新用户名1 [, 旧用户名2 TO 新用户名2] …
RENAME USER在为用户重命名时,旧用户名与新用户名之间使用TO关键字连接。
同时为多个用户重命名时使用逗号(,)进行分割。
RENAME USER 'test6'@'localhost' TO 'xiaoming'@'localhost';
需要注意的是,被重命名的旧用户不存在或新用户名已存在时,系统会报错。
4.删除用户
在MySQL中经常会创建多个普通用户管理数据库,但如果发现某些用户是没有必要的,就可以将其删除,通常删除用户的方式采用MySQL提供的专门SQL语句。
语法
DROP USER [IF EXISTS] 账户名 [, 账户名] …;
MySQL5.x版本之后DROP USER语句可以同时删除一个或多个MySQL中的指定用户,并会同时从授权表中删除账户对应的权限行。
在MySQL5.x之前的版本中,在删除用户前必须先回收用户的权限。其中,账户名与创建用户的格式相同,由“用户名@主机地址”组成。
DROP USER IF EXISTS test7;
在删除账户时,如果省略主机地址,则默认为‘%’。
DROP USER 'test7'@'localhost';
当DROP USER语句删除当前正在打开的用户时,则该用户的会话不会被自动关闭。只有在该用户会话关闭后,删除操作才会生效,再次登录将会失败。另外,利用已删除的用户登录服务器创建的数据库或对象不会因此删除操作而失效。