mysql是如何处理权限的
1.流程图
2.流程图解释:
客户端发送操作数据库的请求
分析这个操作命令需要的权限
判断用户在mysql库的user表中记录的权限(比如user表记录允许连接到服务器的账号信息以及全局的权限控制)
判断用户在mysql库的db表中记录的权限(记录用户对哪些库的操作权限,是数据库范围)
判断用户在mysql库的host表中记录的权限(判断来源于哪些主机的用户对数据库的操作权限,主机范围,配合db表可以做更加细致的控制)
tables_prive用来设置用户对数据库的表的权限
columns_priv用来设置用户对数据库的表中的列的权限(需要借助视图来实现)
...................
客户端数据库操作请求结束
mysql库中的user表数据
user表结构
db表的结构
账户管理(grant和revoke)
我们完全可以通过sql语句操作以上的表来达到账户管理的目的,比如让来源于哪个主机的哪些用户操作哪些库中的哪些表中的哪些列,但是这样一来,无疑给我们增加了难度,因此我们可以通过下面的简单命令来达到目的。
1.创建用户(不常用)
create user 'username' @ 'host' [identified by 'password'];
这个新用户创建后,一点权限都没有。只是一个空白用户,如果想让这个用户能干些事情,就需要授权语句了。
这个命令不常用。
2.创建用户(推荐)
(1)..grant语句
grant语句有两个作用,当用户已存在的时候,就对用户授权
当用户不存在的时候,则先创建用户,再授权。
因此grant 既可以创建用户又可以授权。
例如:
grant all on db.* to 'zhangpeng'@'192.168..1.80' identified by '123';
(2).刷新授权表
flush privileges;//以后使用grant
语句进行授权的时候,要及时的跟上flush语句。让授予的权限立即生效。
(3) 删除用户 (用户一定是与主机地址一起来标识一个用户)
drop user username'@host;
(4) 查看权限
show grants for username@host;
(5) 收回权限
revoke all on db.* from zhangpeng@192.168.1.80;
3.修改密码
(1).set password = password('123');//password函数起到加密的作用。 设置自己的密码
(2).set password for zhangpeng@192.168.1.80 = password('123'); //可为其他人修改密码
(3).update mysql.user set password = password('123') where user = 'zhangpeng' and host = 'host';
(4).mysqladmin -u username -p旧password password "123";
忘记root密码怎么办
关闭数据库
使用mysqld_safe --skip-grant-tables & 启动数据库 (忽略授权表的方式启动,也就是说mysql启动的时候,不加载授权表信息)
使用空密码进入数据库 直接输入mysql ,回车即可
使用update语句修改root密码 use mysql -->update user set pssword = password('123') where user = 'root';
关闭数据库并重新以正常的方式启动数据库 kill 杀掉mysql进程 再重启
补充: 查看进程 ps -ef | grep mysql