MySQL 权限操作

时间:2022-07-26
本文章向大家介绍MySQL 权限操作,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.1 概述

1.1.1 工作原理

  MySQL 权限系统保证所有的用户只执行允许做的事情。当连接 MySQL 服务器时,用户的身份由用户从那儿连接的主机和用户指定的用户名来决定。连接后发出请求后,系统根据用户的身份和用户想做什么来授予权限。MySQL 中采用用户名 + 主机名来识别用户的身份。例如,从 abc.com 连接的用户 root 不一定和从 bcd.com 连接的 root 是同一个人。MySQL 通过允许你区分在不同的主机上碰巧有同样名字的用户来处理它,可以对 root 从 abc.com 进行的连接授与一个权限集,而为 root 从 bcd.com 的连接授予一个不同的权限集。MySQL存取控制包含2个阶段:  ♞ 阶段1:服务器检查是否允许你连接。  ♞ 阶段2:假定能连接,服务器检查你发出的每个请求。看你是否有足够的权限实施它。

1.1.2 权限更改何时生效

  当 MySQL 启动时,所有授权表的内容被读进内存并且从此时生效。当服务器注意到授权表被改变了时,对于现存的客户端连接有如下影响:  ♞ 表和列权限在客户端的下一次请求时生效。  ♞ 数据库权限改变在下一个 use db_name命 令生效。  ♞ 全局权限的改变和密码改变在下一次客户端连接时生效。 如果用 GRANT、REVOKE 或 SET PASSWORD 对授权表进行修改,服务器会立即重新将授权表载入内存。如果手动地修改授权表(使用 INSERT、UPDATE 或 DELETE 等等),应该重启 MySQL 或者执行 flush privileges; 告诉服务器重新装载授权表,否则更改将不会生效。

1.2 用户管理

1.2.1 查看所有用户

# 位于 mysql 数据库 user 表中
mysql> select user as 用户名, host as 主机 from mysql.user;
+---------------+-----------+
| 用户名        | 主机      |
+---------------+-----------+
| root          | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.14 sec)

1.2.2 创建用户

语法

# 主机名和密码可以省略
create user username[@host] [identified by 'password'];

注意

  ① 主机名默认值为 %,表示这个用户可以从任何主机连接 mysql 服务器   ② 密码可以省略,表示无密码登录

示例

# 用户 test 可以从 47.103.4 网段登录 MySQL 服务
mysql> create user 'test'@'47.103.4.%' identified by '123456';
Query OK, 0 rows affected (21.86 sec)

mysql> select user as 用户名, host as 主机 from mysql.user;
+---------------+------------+
| 用户名        | 主机       |
+---------------+------------+
| root          | %          |
| test          | 47.103.4.% |
| mysql.session | localhost  |
| mysql.sys     | localhost  |
| root          | localhost  |
+---------------+------------+
5 rows in set (0.12 sec)

1.2.3 修改密码

语法

# 通过管理员修改密码
set password for username@host = password(password);

# 修改当前用户密码
set password = password(password);

# 修改用户表数据,此方式需要刷新才能生效,注意:新版本 authentication_string 字段表示密码
update mysql.user set password = password('password') where user = 'username' and host = 'host';
flush privileges;

示例

mysql> set password for 'test'@'47.103.4.%' = password('654321');
Query OK, 0 rows affected (1.41 sec)

1.2.4 删除用户

语法

# 直接删除用户
drop user username@host;

# 删除用户表数据从而删除用户
delete from mysql.user where user='username' and host='host';

示例

mysql> delete from mysql.user where user='test' and host='47.103.4.%';
Query OK, 1 row affected (0.08 sec)

1.3 权限管理

1.3.1 授予权限

语法

grant privileges on database.table to 'username'@'host' [with grant option]

注意

  ① priveleges (权限列表),可以是 all,表示所有权限,也可以是 select、update 等权限,多个权限之间用逗号分开。   ② on 用来指定权限针对哪些库和表,格式为 数据库.表名,点号前面用来指定数据库名,点号后面用来指定表名,*.* 表示所有数据库所有表。   ③ to 表示将权限赋予某个用户, 格式为 username@host,@前面为用户名,@后面接限制的主机。   ④ with grant option 这个选项表示该用户可以将自己拥有的权限授权给别人。   ⑤ 使用 grant 重复给用户添加权限,权限叠加,比如你先给用户添加一个 select 权限,然后又给用户添加一个 insert 权限,那么该用户就同时拥有了 select 和 insert 权限。

示例

# test 用户只能查询 mysql.user 表的 user, host 字段
mysql> grant select(user,host) on mysql.user to 'test'@'47.103.4.%';
Query OK, 0 rows affected (0.46 sec)

1.3.2 查看权限

语法

# 查看指定用户权限
show grants for 'username'@'host'

# 查看当前用户权限
show grants;

示例

mysql> show grants for 'test'@'47.103.4.%';
+--------------------------------------------------------------------+
| Grants for test@47.103.4.%                                         |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'47.103.4.%'                          |
| GRANT SELECT (host, user) ON `mysql`.`user` TO 'test'@'47.103.4.%' |
+--------------------------------------------------------------------+
2 rows in set (0.12 sec)

mysql> show grants;
+-------------------------------------------------------------+
| Grants for root@%                                           |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
1 row in set (0.10 sec)

1.3.3 撤销权限

语法

revoke privileges ON database.table FROM 'username'@'host';

语法

mysql> revoke select(user) on mysql.user from 'test'@'47.103.4.%';
Query OK, 0 rows affected (0.05 sec)

mysql> show grants for 'test'@'47.103.4.%';
+--------------------------------------------------------------+
| Grants for test@47.103.4.%                                   |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'47.103.4.%'                    |
| GRANT SELECT (host) ON `mysql`.`user` TO 'test'@'47.103.4.%' |
+--------------------------------------------------------------+
2 rows in set (0.10 sec)

1.3.4 授权原则

 ① 只授予能满足需要的最小权限,防止用户误操作,比如用户只是需要查询,那就只给 select 权限,不要给用户赋予 update、insert 或者 delete 权限。  ② 创建用户的时候限制用户的登录主机,一般是限制成指定 IP 或者内网 IP 段,为每个用户设置满足密码复杂度的密码,定期清理不需要的用户,回收权限或者删除用户。  ③ 初始化数据库的时候删除没有密码的用户,安装完数据库的时候会自动创建一些用户,这些用户默认没有密码。

1.4 其他操作

1.4.1 忘记密码(windows)

 ① 使用管理员权限进入命令行执行 net stop mysql 停止 MySQL 服务  ② 执行 mysql -skip-grant-tables 无验证启动 MySQL 服务  ③ 在另一个命令行中执行 mysql 无需用户名和密码直接登录  ④ 修改密码 update mysql.user set password = password('password') where user = 'username' and host = 'host';  ⑤ 此时还没有完成,需要去任务管理器手动结束 mysqld 进程  ⑥ 执行 net start mysql; 正常启动 MySQL 服务  ⑦ 密码已经修改完成可以使用新密码登录root账户了

1.4.2 备份与还原

语法

# 备份
mysqldump -u用户名 -p密码 数据库名称 > 保存的路径

# 还原,要进入需要还原的数据库
source 恢复文件路径