MySQL的用户管理与权限管理
用户管理与权限管理
当对数据库进行用户或者权限管理完成后,需要刷新数据库权限:flush privileges;
用户管理
创建MySQL用户
-
注意:MySQL中不能单纯通过用户名来说明用户,必须要加上主机。如jack@10.1.1.1
-
用户的信息保持在MySQL数据库中的
mysql.user数据表
中 -
创建用户时,host字段可以分为本地主机和远程主机(即可以创建两个用户名相同的账号,但是host字段不一样)
基本语法:
命令格式:
创建MySQL用户:
# create user '用户名'@'被允许连接的主机名称或主机的IP地址(host)' identified by '用户密码';
hoost说明:
loaclhost:与127.0.0.1 一样代表只允许本机连接MySQL数据库
主机名称:如果在本机的 /etc/hosts 文件上写入了对应的IP和主机名,就可以指定主机名允许主机远程连接数据库
主机IP:允许被远程连接数据库的主机的IP
验证是否创建成功:
# select user,host from mysql.user;
字段说明:
user字段:存放账户
host字段:查看允许连接的主机
演示:
MySQL服务器操作:
查看user表原始数据:
# mysql > select user,host from mysql.user;
+---------------+-----------+
| user | host | => user默认存在三个账号,host字段说明只能在本机使用(禁止远程连接)
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
创建本地用户,不设密码:
# mysql > create user 'jack'@'localhost';
或 => 在本机MySQL数据库中创建一个jack用户
# mysql > create user 'jack'@'127.0.0.1';
创建本地用户并设置密码:
# mysql> create user 'tom'@'localhost' identified by '123';
或 => 在本机MySQL数据库中创建一个tom用户并设置其密码为456
# mysql> create user 'tom'@'127.0.0.1' identified by '123';
创建远程连接的用户,权限给某个主机:(需要指定远程主机IP,假设远程主机IP:10.1.1.21)
# mysql > create user 'harry'@'10.1.1.21' identified by '456'; => 10.1.1.31
创建远程连接的用户,权限给整个网络:(给10.1.1.0/24)
# mysql > create user 'pete'@'10.1.1.%' identified by '789'; => 10.1.1.%
创建远程连接的用户,权限给所有主机:(any)
# mysql > create user 'root'@'%' identified by '000'; => %
=> 需要注意的是,这个root的权限只是普通用户的权限
验证是否创建成功:
# mysql > select user,host from mysql.user;
+----------------+-----------+
| user | host |
+----------------+-----------+
| root | % | => 所有主机都可以访问
| pete | 10.1.1.% | => 给整个10.1.1.0/24 整个网络
| harry | 10.1.1.21 | => 允许10.1.1.21 主机远程访问
| jack | localhost | => 无密码
| mysql.session | localhost | => 只能本地访问
| mysql.sys | localhost |
| root | localhost |
| tom | localhost |
+----------------+-----------+
10.1.1.21主机远程连接服务器:MySQL服务器IP:10.1.1.31
测试harry账号:
# mysql -h 10.1.1.31 -P 3307 -uharry -p456
测试root账号:
# mysql -h 10.1.1.31 -P 3307 -uroot -p000
备注:如果测试不成功,在MySQL服务端刷新一下权限,可能是更新不成功
删除MySQL用户
- 如果在删除用户时没有指定主机的名称或主机的IP地址,则默认删除这个账号的所有信息。
- 注意:如果删除了本地root管理员账号,需要重新初始化数据库
基本语法:
命令格式:
第一种:drop
# drop user '用户名'@'主机名称或主机的IP地址';
第二种:delete
# delete from mysql.user where user='用户名' and host='主机名或主机IP'
MySQL演示:
# mysql> select user,host from mysql.user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| root | % |
| pete | 10.1.1.% |
| harry | 10.1.1.21 |
| jack | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
| tom | localhost |
+---------------+-----------+
第一种方式删除用户:drop (删除root、pete、tom用户)
# mysl > drop user 'root'@'%';
# mysql > drop user 'pete'@'10.1.1.%';
# mysql > drop user 'tom'@'localhost';
第二种方式删除:delete (删除harry、jack)
# mysql > delete from mysql.user where user='harry' and host='10.1.1.21';
# mysql > delete from mysql.user where user='jack' and host='localhost';
查看是否删除成功:
# mysql> select user,host from mysql.user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
修改MySQL用户
重命名MySQL用户:
- 重命名用户的名称(即修改user字段)
- 重命名被允许访问的主机名称或主机的IP地址(即修改host字段)
基本语法:
命令格式:
第一种方法:rename
# rename user 旧用户信息 to 新用户信息;
第二种方法:update
# update mysql.user set user='新用户名',host='新主机名/IP' where user='旧用户名';
演示:
创建测试用户:
创建一个hxd用户:
# mysql > create user 'tom'@'10.1.1.%' identified by '123';
查看user表:
# mysql> select user,host from mysql.user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| hxd | % |
+---------------+-----------+
修改用户:
# mysql > rename user 'tom'@'10.1.1.%' to 'hxd'@'%'; => 一起修改或者单独修改一个都可以
# mysql > update mysql.user set user='jack',host='localhost' where user='hxd'; => 一起修改或者单独修改一个都可以
用户权限管理
权限说明
所有权限说明https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html
权限 | 描述 |
---|---|
USAGE | 无权限,只有登录数据库,只可以使用test或test_*数据库 |
ALL | 所有权限 |
create、delete、update、select | 增删改查权限 |
with grant option
选项说明:
选项表示允许把自己的权限授予其它用户或者从其他用户收回自己的权限
默认情况下,分配权限时如果没有指定with grant option,代表这个用户不能下发权限给其他用户,但是这个权限分配不能超过自身权限。
权限保存位置:
数据表 | 描述 |
---|---|
mysql.user | 所有mysql用户的账号和密码,以及用户对全库全表权限(.) |
mysql.db | 非mysql库的授权都保存在此(db.*) |
mysql.table_priv | 某库某表的授权(db.table) |
mysql.columns_priv | 某库某表某列的授权(db.table.col1) |
mysql.procs_priv | 某库存储过程的授权 |
给用户授权:grant
权限表示方法:
*.* | 代表所有数据库的所有数据表 |
---|---|
db_name.* | 代表某数据库下的所有数据表 |
db_name.tb_name | 代表某数据库下的某个数据表 |
基本语法:
命令格式:
# grant 权限1[,权限2] on 库.表 to 用户@主机 [with grant option];
# grant 权限(列1,列2,...) on 库.表 to 用户@主机 [with grant option];
选项说明:
with grant option:代表此账号可以为其他用户下发权限,但是下发的权限不能超过自身权限。
演示:
针对数据库db_run分配权限:(查询权限)
# mysql > grant select on db_run.* to 'tom'@'10.1.1.%'; => 给tom用户分配数据库db_run 的查询权限
# mysql > flush privileges; => 权限分配后记得刷新一下
远程测试一下:
# mysql -h 10.1.1.31 -P 3307 -utom -p123
# mysql > show databases;
+--------------------+
| Database | => 只有查询权限,tom执行其他权限是不被允许的
+--------------------+
| information_schema |
| db_run |
+--------------------+
备注:"select" 可以通过逗号多给几个权限,如:"create、delete、update、select"
"db_run.*" 还可以修改为"db_run.tb_run1.*",代表是这个数据库的某个表的查询权限
针对某数据表中的某一列分配权限: update(name)
# mysql > grant update(name) on db_run.tb_run1 to 'jack'@'10.1.1.%'; => jack 只有修改name字段的权限,一般还要给查询权限
远程机演示:
MySQL [db_run]> select*from tb_run1;
ERROR 1142 (42000): SELECT command denied to user 'jack'@'10.1.1.21' for table 'tb_run1'
# mysql > grant select on db_run.tb_run1 to 'jack'@'10.1.1.%'; => 给查询权限
针对某账号分配所有权限:ALL
# mysql > grant all on *.* to 'jack'@'localhost';
# mysql > flush privileges;
查询用户权限
基本语法:
命令格式:
查询当前用户权限:
# show grants;
查询其他用户权限:
# show grants for '用户名称'@'授权的主机名或IP';
演示:
# mysql> show grants for 'tom'@'10.1.1.%';
+------------------------------------------------------------------+
| Grants for tom@10.1.1.% |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'tom'@'10.1.1.%' |
| GRANT SELECT ON `db_run`.* TO 'tom'@'10.1.1.%' WITH GRANT OPTION |
+------------------------------------------------------------------+
# mysql> show grants for 'jack'@'10.1.1.%';
+------------------------------------------------------------------------+
| Grants for jack@10.1.1.% |
+------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'jack'@'10.1.1.%' |
| GRANT SELECT, UPDATE (name) ON `db_run`.`tb_run1` TO 'jack'@'10.1.1.%' |
+------------------------------------------------------------------------+
# mysql> show grants for 'jack'@'localhost';
+---------------------------------------------------+
| Grants for jack@localhost |
+---------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'jack'@'localhost' |
+---------------------------------------------------+
使用grant 创建用户(集创建和授权一体)
- 注意:此方法,5.7以后不推荐,未来会被弃用!
基本语法:
# grant 权限 on 数据库.数据表 to '新用户名称'@'授权主机名称或IP地址' identified by '用户的密码' [with grant option];
演示:
创建一个admin用户,主机位%,密码123,授予所有权权限,并且拥有下发权限:
# mysql > grant all on *.* to 'admin'@'%' identified by '123' with grant option;
查看amdin用户权限:
# mysql> show grants for 'admin'@'%';
+--------------------------------------------------------------+
| Grants for admin@% |
+--------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION |
+--------------------------------------------------------------+
revoke 回收权限
- 假设给某账号分配权限过高,可以通过
revoke
命令回收该账号的权限 - 回收权限是,库.表要与授权的相同
基本语法:
命令格式:
# revoke 权限 on 库.表 from '用户'@'主机';
演示:
查看jack用户权限:
# mysql> show grants for 'jack'@'10.1.1.%';
+------------------------------------------------------------------------+
| Grants for jack@10.1.1.% |
+------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'jack'@'10.1.1.%' |
| GRANT SELECT ON `db_run`.`tb_run1` TO 'jack'@'10.1.1.%' |
| GRANT SELECT, UPDATE (name) ON `db_run`.`tb_run1` TO 'jack'@'10.1.1.%' |
+------------------------------------------------------------------------+
回收jack用户的update(name)权限:
# mysql> revoke update(name) on db_run.tb_run1 from 'jack'@'10.1.1.%';
查看回收情况:
# mysql> show grants for 'jack'@'10.1.1.%';
+---------------------------------------------------------+
| Grants for jack@10.1.1.% |
+---------------------------------------------------------+
| GRANT USAGE ON *.* TO 'jack'@'10.1.1.%' |
| GRANT SELECT ON `db_run`.`tb_run1` TO 'jack'@'10.1.1.%' |
+---------------------------------------------------------+
再回收jack用户的select权限:
# mysql> revoke select on db_run.tb_run1 from 'jack'@'10.1.1.%';
查看回收情况:
# mysql> show grants for 'jack'@'10.1.1.%';
+-----------------------------------------+
| Grants for jack@10.1.1.% |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'jack'@'10.1.1.%' | => 就只剩下登录权限了
+-----------------------------------------+