用户:
mysql的用户本身只是mysql的用户与操作系统用户本身无关,一般而言所有用户的用户名都是公开的,密码只有某个授权用户才能管理,mysql的密码采用mysql独有的加密机制进行加密的。
在mysql上面用户由:用户名@主机组成,这就意味着我们的mysql仅仅允许通对应的主机才能访问mysql。mysql的用户仅仅是用来验证身份的。
mysql的用户账号: 由用户名@主机 组成,用户名在16个字符以内,
主机可以使用:主机名:例如 www.mysql.com
ip地址:172.16.10.177
网络地址:可以使用网段,例如172.16.0.0/255.255.0.0
mysql在验证用户主机来源是否合法时候,mysql需要反解用户主机名,
或者解析用户主机名。为了加速mysql服务器性能。而且我们访问时候也不需要使用主机名的话,可以在启动mysql服务时候,使用 --skip-name-resol 就不用去解析主机名了,这会大大提高用户连接速度。
权限:用户是否有创建表,删除表,修改表等权限。是需要授权的。
在mysql上面,用户的账号和密码等信息保存在安装完mysql以后。并启动数据库之后的一个叫做mysql的数据库里面的许多表里面的,这些表包括:
user:存放用户的账号,密码,全局权限,与及其他的非全局权限
db:存放了数据库级别的权限定义
host:已经废弃,基本不用
tables_priv: 表级别权限
columns_priv: 列级别权限
procs_priv:存储过程和存储函数相关权限
proxies_priv: 代理用户权限
对我们而言,最重要的就是user,db,tables_priv, column_priv, procs_priv 这几张表
mysql服务器进程在启动的时候。也就是mysqld会读取这几张表,并在内存中生成授权表,因此这几个表是直接被加载进内存的
以后用户的登陆和权限都通过检查这6张表进行。和检查的过程不是访问磁盘上面的表,而是通过内存里面的结构信息完成。任何一个sql语言的查询都会涉及到授权表,因此放在内存当中,可以加速sql语言执行
权限的级别:
全局级别
库级别
表级别:delete,alter,select,insert,update,trigger(触发器)
列级别:select,insert,update
而每一类级别都定义在一张表当中,楚辞之外还有两个权限级别比较独特:存储过程,存储函数
创建用户:3种方法
create user user_name @ host identified by ‘password‘;
通过这种方式创建的用户只有登录权限。和简单的show databases;
创建完成后,由于mysql的用户以及权限的表都已经读到内存当中,mysql会自动刷新内存授权表。
grant 命令创建用户,grant命令本身就是授权的,也可以创建用户,当用户不存在时候会创建。
直接 insert into 用户信息到mysql.user 表中。这种方式mysql不会自动刷新内存中的授权表,需要使用flush privilege; 刷新
查看某个用户授权信息:
show grants for [email protected];
给用户授权命令:
grant +权限1,权限2,权限3,....... on 对象类别,权限级别 to username;
对象类别:table 表, function 函数, procedure 存储过程
权限级别:
* :所有库
*.* :所有库的所有表
db_name.* :某个库下面所有表
db_name.tb_name:某个库下面的某个表
tb_name:某个表
例如:grant all privileges on db.* to [email protected]‘%‘;
权限 对象类别 用户
这里表示授权给某个用户,某个数据库下面的表,或者是存储过程,存储函数所有权限。
grant execute on function db.abc to [email protected]‘%‘;
这就表示给我们某个用户授权 数据库下面的存储函数abc 执行权限
授权某个用户创建一个叫做MyDB的数据库权限。
grant create on MyDB.* to [email protected]‘host‘;
这样授权之后,指定用户就只能创建我们指定名称的数据库了
这样的权限能创建指定名称数据库以及在数据库下面创建表,但是却不能对表插入数据 更新等操作。
给某个用户插入某个数据库下面表的权限。
grant insert into on MyDB.* to [email protected]‘host‘;
给某个用户查询某个数据库下面的表权限
grant select on MyDB.* to [email protected]‘host‘;
授权用户alter 命令权限
grant alter on MyDB.* to [email protected]‘host‘;
授权用户update 权限,但是只能update 某个字段的权限。
grant update (字段名) on MyDB.* to [email protected]‘host‘;
授权某个用户super 权限
grant super on *.* to [email protected]‘host‘;
删除用户:
drop user [email protected]‘host‘;
给用户重命名
rename user [email protected]‘host‘; to [email protected]‘host‘;
取消用户授权revoke 命令
revoke +权限(字段) on 对象 from [email protected]‘host‘
比如:
revoke insert on MyDB.* from [email protected]‘host‘;
这里表示从mydb这个数据库收回 某个用户的insert权限。