04MySQL权限管理

MySQL 权限

在实际应用中,为了防止因操作不当,导致数据被误删。所以,一般不会直接在 root 用户下直接进行数据库的操作,我们通常会登录 root 账户后,创建一些新用户并赋予这些用户一些操作数据库的权限。

MySQL 的用户权限可分为三大级别

  • 全局性的管理权限:作用于整个 MySQL 实例级别。
  • 数据库级别的权限:作用于某个指定的或者所有的数据库上。
  • 数据库对象级别的权限:作用于指定单个数据库对象,如表、视图等,或者所有的数据库对象上。

账户权限信息被存储在 MySQL 数据库中的 userdbhosttables_privcolumns_privprocs_priv 这几个系统表中。

  • user 表:记录允许连接到服务器的账户信息。
  • db 表:记录用户对某个数据库操作的权限信息。
  • host 表:记录主机上的用户对数据库拥有的权限信息。
  • tables 表:记录用户对某个表的操作权限信息。
  • columns_priv表:记录用户对表里的某一列的操作权限信息。
  • procs_priv 表:记录用户对存储过程和存储函数的操作权限信息。

首先介绍一下账户操作的基本命令:

  • -h 为主机名,默认是 localhost
  • -u 为用户名。
  • -p 为登录密码。

所以,我们进入 MySQL 会使用命令 mysql -u root -p

查看用户

使用以下语句来查看一下,在 MySQL 数据库的 user 表中已经拥有哪些用户:

SELECT user,host FROM mysql.user;

这里的查询结果会显示 user 表中的 userhost 这两个字段的信息。提醒一下,user用户名host指定登录的主机号,也就是 ip地址

查看用户权限

查看这些用户各自拥有哪些权限,查询语句如下所示:

# 查看 user 表中所有信息
SELECT * FROM mysql.user\G;

后面加一个 \G 是让这些信息能够更清晰的显示,你们可以试一试不加 \G 来查询。
在这个语句的基础上加一个 WHERE 条件语句可用来查看单一用户权限:

SELECT * FROM mysql.user WHERE user='<用户名>'\G;

例如,我们查看一下 root 用户的权限信息。

SELECT * FROM mysql.user WHERE user='root'\G;

这里有一篇文章详细介绍了授权信息,用户管理权限

MySQL 用户账户的管理

添加用户

在 MySQL 中常用的添加用户的语句,有以下两种方式:

CREATE USER '<新用户的账户>' IDENTIFIED BY '<用户密码>';

# *.* 表示对所有数据库生效
# 这里的主机号就是 ip 地址
GRANT <权限> on *.* TO <用户名>@'<主机号>'IDENTIFIED BY '<密码>';

使用 CREATE USER 来创建用户,相当于在 user 表中添加一条新的记录,用户是没有任何权限的,我们需要其他操作来授予权限给用户,而使用 GRANT 语句在创建用户的同时给用户授权

例如,我们添加一个用户名为 Lotus 的新用户账号,其密码为 123。

# 创建新用户
CREATE USER 'Lotus' IDENTIFIED BY '123';
# 查看用户信息
SELECT user,host FROM mysql.user;

我们使用第二种创建方式,添加一个名为 Cici 的用户,设置密码为 123,允许所有 ip 连接,并获得所有权限。

# ALL PRIVILEGES 表示获得所有权限
GRANT ALL PRIVILEGES ON *.*
TO Cici@'%'IDENTIFIED BY '123';

修改用户

对于已经存在的用户,我们也可以进行修改,语句格式如下所示:

RENAME USER '<旧用户名>'@'<旧主机号>' TO '<新用户名>'@'<新主机号>';

例如,我们修改 Lotus 用户的用户名和 ip 地址。

RENAME USER 'Lotus'@'%' TO 'Li'@'localhost';

删除用户

如果不想要该用户了,我们可以使用以下两种删除语句:

DROP USER '<用户名>'@'<主机名>'

DELETE FROM mysql.user WHERE Host='<主机名>' AND User='<用户名>'

限制账户资源

MySQL 中常见的资源列有以下几种:

  • max_questions:用户每小时允许执行的查询操作次数。
  • max_updates:用户每小时允许执行更新操作次数。
  • max_connections:用户每小时允许执行的连接操作次数。
  • max_user_connections:用户允许同时建立的连接次数。

限制客户端使用 MySQL 服务器资源的一种方法是将全局 MAX_USER_CONNECTIONS 系统变量设置为非零值,这会限定账号建立同时连接的数量

例如,我们重新建立一个名为 Lotus 的用户,并对该用户进行资源限制。

# 在创建账户之后进行资源限制
GRANT SELECT ON Lotus.*
TO 'Lotus'@'%'
WITH MAX_QUERIES_PER_HOUR 3
MAX_USER_CONNECTIONS 5;

我们也可以使用 ALTER USER 语句来修改现有的资源。例如,我们把用户 Lotus 的资源限制信息进行修改,把用户在一个小时内的执行查询的次数从 3 次修改为 50 次。

ALTER USER 'Lotus'@'%' WITH MAX_QUERIES_PER_HOUR 50;

我们也可以在创建账户时,进行资源限制。例如,我们再创建一个名为 Ann 的用户。

CREATE USER 'Ann'@'%' IDENTIFIED BY '123'

# 设置用户在一小时内可以执行 20 次查询
WITH MAX_QUERIES_PER_HOUR 20

# 设置用户在一小时内可以修改 20 次
MAX_UPDATES_PER_HOUR 20

# 设置用户在一小时内可以连接 MySQL 5 次
MAX_CONNECTIONS_PER_HOUR 5

# 设置所有用户在同一时间连接 MySQL 的最大连接数为 5
MAX_USER_CONNECTIONS 5;

我们还可以使用下面的方式来查看自己设定的用户权限。

SELECT user,host,u.max_questions,u.max_updates,u.max_connections,u.max_user_connections FROM mysql.user u WHERE u.user='Ann'\G;

设置账户密码

修改用户密码常用的有以下两种方式:

SET PASSWORD FOR '<用户名>'@' <主机号>'=PASSWORD('<新密码>');

GRANT USAGE ON *.* TO '<用户名>'@'<主机号>'IDENTIFIED BY '<新密码>';

若已经完成了对数据库的操作,我们可以使用 quit 来退出 MySQL。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

great-wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值