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 恢复文件路径
- Oracle中session和processes的设置
- ssh相关原理学习与常见错误总结
- PyQt5 GUI应用程序工具包入门(1)
- grpc部署初体验
- Java中的ReentrantLock和synchronized两种锁机制的对比
- 用Python从零开始创建区块链
- 基于 Python 的僵尸网络将 Linux 机器变成挖矿机器人
- Oracle导入导出常用命令
- Spring Cloud实战小贴士:Zuul处理Cookie和重定向
- 设计模式之代理模式(二)CGLIB动态代理实现
- ios手势复习值之换图片-转场动画(纯代码)
- 顺序广播和无序广播
- Netflix Zuul与Nginx的性能对比
- 最有价值的50道java面试题(一)
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Centos7安装ElasticSearch 6.4.1入门教程详解
- Windows 和 Linux 上Redis的安装守护进程配置方法
- 在Linux系统上安装Spring boot应用的教程详解
- 使用openssl 生成免费证书的方法步骤
- linux cd的含义以及用法
- leetcode栈之比较含退格的字符串
- CentOS使用本地yum源搭建LAMP环境图文教程
- 清除CentOS 6或CentOS 7上的磁盘空间的方法
- leetcode栈之二叉树的前序遍历
- 解决Linux下Mysql5.7忘记密码问题
- CentOS8.0 安装配置ftp服务器的实现方法
- Linux实现自动登录的实例讲解
- Linux中date命令转换日期提示date: illegal time format问题解决
- leetcode队列之最近的请求次数
- 安防视频云服务EasyCVR集成海康SDK时语音对出现杂音问题,如何解决?