1. MySQL用户管理
一、MySQL用户的特点和注意事项
MySQL是多用户的数据库管理系统,可以通过授予或撤销权限来控制允许或不允许用户执行的操作
用户从职权上可分为超级用户和普通用户
root用户不同于操作系统的root用户,默认对所有数据库和表具有完全访问权限
普通用户在创建数据库时具有连接数据库的权限,仅对information_schema数据库中的表的部分行具有读取权限(select)
对于实际的生产库,应尽量避免应用程序使用root用户直接操纵数据库
应根据业务需求建立普通用户并授权使其能够完成权限内的任务,防止未经授权用户访问超出其特权的数据
2. MySQL用户验证的三个基本要素
MySQL 使用“用户名”、“客户端主机”和“密码” 三个基本要素来验证用户
MySQL数据库使用“用户名”和“客户端主机”来区分不同的用户,例如:root@192.168.2.3和root@localhost为不同的用户
MySQL的用户以行的形式存放在mysql数据库的user表中
查看MySQL用户
mysql> select user,host,authentication_string from mysql.user;
mysql> select * from mysql.user\G
*_priv 字段中的值 Y 表示已具有相应权限。root 帐户具有完全访问权限,该帐户的所有权限列的值均为 Y ,新建的普通用户liu均为N
客户端主机(host)的含义
MySQL早期应用于超市,每个pos机具有不同的IP,客户希望能够区分来自于不同pos机的刷卡记录,不希望收银员在超市以外的地方访问MySQL数据库,因此MySQL使用host列来限制客户机连接数据库以提高安全性,只有host列中指定的IP或主机名才能使用用户名和密码连接数据库。例如:用户知道root@localhost的密码,但是用户想从远程主机(IP:192.168.2.1)来连接数据库是不会成功的。
允许的客户端主机名(host)格式示例:
主机名:localhost
合格的主机名:mis.offcn.com
IP 地址:192.168.2.1
IP 网络地址加掩码:10.1.100.0/255.255.255.0
模式或通配符:% (任意字符) 或 _ (任意1个字符)
%.offcn.com
192.168.%
192.168.2.1_
%
使用包含 % 通配符字符的host允许用户从整个域或子网中的任何主机连接数据库,存在潜在安全隐患
3. MySQL创建用户
语法:
create user ‘username’@ ‘host‘ identified by ‘password’;
username最长16个字符,如果包含特殊字符如:下划线 _ 必须使用单引号,如果没有单引号可选,password必须用单引号括起来,否则报错
示例:
create user zhang@localhost identified by ‘zhang’;
create user ma identified by ‘ma’;
create user ‘tom’@’192.168.2.1’identified by ‘tom’;
测试连接
本地
#>mysql -uzhang –p --可以本地连接
#>mysql -uma –p --可以本地连接
#>mysql -utom -p --不可以本地连接,因为只能ip为192.168.2.1的主机连接
4. MySQL设置用户密码
修改自己的密码
mysql> set password=password(‘newpass’);
password为口令函数,把口令加密存放在mysql数据库的user表的authentication_string列中
修改其他用户密码(要有相应权限)
mysql> set password for ‘username’@‘host’= (‘newpass’);
示例:
mysql>set password for tom@192.168.2.1=password(‘newpass’);
mysql>set password=password(‘root’);
5. MySQL重命名用户
使用rename user命令可以给用户名和客户端主机改名
示例:把tom@192.168.2.1 改名为 tim@localhost
mysql> rename user tom@192.168.2.1 to tim@localhost;
6. MySQL删除用户
使用drop user语句可以删除用户
示例删除用户tim@localhost
mysql> drop user tim@localhost;
7. MySQL权限
8. MySQL GRANT授权语句
grant语句可以用来创建用户也可以修改用户的权限
grant语法:
grant 权限(colname) on <dbname>.<tabname> to username@host identified by ‘password’;
示例,创建用户wang,可以select test库的stu表的sno列:
grant select(sno) on test.stu to wang@localhost identified by ‘wang’;
测试 (wang)
mysql -uwang –p
mysql> show databases;
mysql>use test;
mysql>show tables;
mysql> select * from stu; --报错,只能看sno这列的内容
mysql> select sno from stu;
测试 (root)
mysql> select * from mysql.tables_priv where user=‘wang’;
mysql> select * from mysql.columns_priv where user=‘wang’;
9. MySQL显示用户权限
使用show grants语句查看用户拥有的权限
测试(root)
mysql> show grants; --查看自己所拥有的权限
mysql> show grants for wang@localhost; --查看用户wang的权限
10. MySQL REVOKE撤销授权语句
revoke语句可以用来创建用户也可以修改用户的权限
grant语法:
revoke 权限(colname) on <dbname>.<tabname> from username@host;
示例(root),收回用户wang的select test库的stu表的sno列权限:
mysql> revoke select(sno) on test.stu from wang@localhost;
mysql> show grants for wang@localhost;
11. MySQL授权表
MySQL服务器启动以后会将下列授权表读取到内存中,作为权限控制的依据
对于全局级别权限的变更和用户密码的变更,需要用户退出会话连接重新登录后才能生效
12. MySQL用户验证流程
13. MySQL 查看进程状态
MySQL数据库用show processlist查看服务器进程个用户连接线程的状态
SHOW PROCESSLIST 将生成以下列:
Id: 用户连接标识符
User: 发出语句的 MySQL 用户
Host: 发出语句的客户机的主机名
db: 用户选择的数据库,未选为 NULL
Command: 线程正在执行的命令类型
Time: 线程处于当前状态的时间(秒)
State: 指示线程正在执行的内容的操作、事件或状态
Info: 线程正在执行的语句;否则为 NULL
查看当前用户连接标识符(id)
mysql> select connection_id();
可以用kill命令杀掉用户连接
mysql> kill 3; --当前连接被杀掉会自动重连
mysql> show processlist;
授予普通用户wang查看当前所有连接用户线程的状态(普通用户仅能看到自己的连接线程状态)
mysql> grant process on . to li@localhost;
mysql> show grants for li@localhost;
mysql> revoke process on . from li@localhost;