


专栏:MySQL数据库成长记
个人主页:手握风云
目录
[2.1. 查看用户](#2.1. 查看用户)
[2.2. 创建用户](#2.2. 创建用户)
[2.3. 修改密码](#2.3. 修改密码)
[2.4. 删除用户](#2.4. 删除用户)
[3.1. 内置权限列表](#3.1. 内置权限列表)
[3.2. 给用户授权](#3.2. 给用户授权)
[3.3. 回收权限](#3.3. 回收权限)
一、应用场景
数据库服务安装成功后默认有⼀个root用户,可以新建和操纵数据库服务中管理的所有数据库。在真实的使用过程中,通常每个应用对应着⼀个数据库,我们只希望某个用户只能操纵和管理当前应用对应的那个数据库,而不能操纵和管理其他应⽤的数据库,这时就可以添加⼀个用户并指定用户的权限。

在MySQL中如果要对数据进行某些操作,必须添加一个用户,并对用户赋予相应的权限。安装完MySQL之后,操作系统已经赋予了我们root用户的权限。
二、用户
2.1. 查看用户
MySQL中的用户信息保存在mysql系统数据库的user表中,可以通过select语句查看。
sql
show tables;
desc user;
select host, user, authentication_string from user;

authentication_string代表加密过的密码。我们也可以点击user表查看存储的用户信息。

Host是用户用来登录的主机名或者IP,User是用户名,剩余的是用户所有的权限,"Y"表示拥有权限,"N"表示没有权限。"localhost, user"就是我们使用的用户。
2.2. 创建用户
- 语法
sql
CREATE USER [IF NOT EXISTS] 'user_name'@'host_name' IDENTIFIED BY 'auth_string'
'user_name'@'host_name'统一称为用户,user_name是用来登录MySQL的用户名,host_name是用来登录的主机名或IP,起到一个"白名单"的作用,只有指定的机器上才可以访问MySQL。不指定host_name默认'user_name'@'%',存在安全风险。user_name和host_name需用单引号包裹,避免格式错误。host_name可通过子网掩码/CIDR设置范围(如198.51.100.0/24)。

比如我们想添加一个'gao'@'192.168.0.124'用户,就可以通过我主机的TPV4地址进行访问。这样的用户只能通过一台主机登录到MySQL,如果我们想让局域网内所有的机器都可以登录,就需要把IP地址设置成一个范围。这个范围设置为129.168.100开头的都可以。
- 示例
sql
-- 添加一个名为gao1的新用户,允许从本机登录
create user 'gao1'@'localhost' identified by '123456';
-- 添加一个名为gao2的新用户,允许从192.168.1.1/24网段登录
create user 'gao2'@'192.168.1.1/24' identified by '123456';

如果我们用刚创建的两个用户去登录我主机的MySQL,第一个可以登录,但是第二个主机不允许登录。


第一个用户虽然登录成功,但是还没添加权限,所以不能进行任何数据库的操作。

2.3. 修改密码
- 语法
sql
-- 为指定用户设置密码(推荐)
ALTER USER 'user_name'@'host_name' IDENTIFIED BY 'auth_string';
-- (不推荐)
SET PASSWORD FOR 'user_name'@'host_name' = 'auth_string;
-- 为当前用户设置密码
SET PASSWORD = 'auth_string';
- 示例
sql
alter user 'gao1'@'localhost' identified by '123457';
2.4. 删除用户
- 语法
sql
-- 可以一次删除多个
DROP USER [IF EXISTS] 'user_name'@'host_name'[, ...]
- 示例
sql
drop user 'gao2'@'192.168.1.1/24';
三、权限与授权
3.1. 内置权限列表

3.2. 给用户授权
sql
-- 查看用户权限
show grants for 'gao1'@'localhost';

- 语法
sql
grant priv_type[, ...] on priv_level to 'user_name'@'host_name' [WITH GRANT OPTION]
priv_level:* | . | db_name.* | db_name.tbl_name等(如*.*表示所有库表)。
- 示例
sql
-- 为指定用户赋予查询权限
grant select on test3_26_1.* to 'gao1'@'localhost';
sql
-- 授权所有权限
grant ALL on test3_26_1.* to 'gao1'@'localhost';
注意:授权后需刷新权限(flush privileges)或重新登录使其生效。
3.3. 回收权限
- 语法
sql
REVOKE [IF EXISTS] priv_type[, ...] ON priv_level FROM 'user_name'@'host_name'[, ...]