mySQL用户和权限管理v1
第01章 MySQL用户和权限管理
mySQL权限控制通过两步控制,能不能连接(验证用户身份),能执行什么操作(验证用户权限)。
验证用户身份,需要验证,连接mySQL的计算机的IP地址或计算机名称,用户账户和密码。验证过程如下:
管理mySQL用户
查看mySQL用户账户
mySQL用户存储在mysql数据库的user表,该表在mySQL服务启动时自动加载到内存,控制用户的登录。
[root@WebServer ~]# mysql -u root
查看当前连接mySQL的用户。
mysql>select user();
mysql> use mysql;
mysql> select user,host from user;
图中下划线的记录,代表可以使用任何用户在本地登录mySQL,。能够查看mysql的系统变量,但权限很低。
mysql> quit;
使用随便一个用户名登录mysql,发现都能成功。
[root@WebServer ~]# mysql -u wang
查看登录的用户名,可以看到是wang@localhost。
可以执行一些查看命令。
mysql> select @@version;
mysql> show variables;
mysql>use mysql;
mysql> quit;
使用root账户登录。
[root@WebServer ~]# mysql -u root
mysql>use mysql;
mysql> delete from user where user='';
Query OK, 2 rows affected (0.00 sec)
mysql> quit
重启mySQL服务
[root@WebServer ~]# service mysqld restart
再次使用wang登录,失败。
[root@WebServer ~]# mysql -u wang
ERROR 1045 (28000): Access denied for user 'wang'@'localhost' (using password: NO)
创建mySQL用户账户
[root@WebServer ~]# mysql -u root
mysql> use mysql;
mySQL用户名区分大小写,如下所示两个用户时不同的账户。下面创建的用户账户,没有指定密码,登录时不需要输入密码。
mysql> create user zhang@'192.168.80.%';
mysql> create user Zhang@'192.168.80.%';
mysql> create user wang;
mysql> select user,host from user;
设置mySQL用户密码
设置zhang@'192.168.80.%的密码为'91xueit.com'
mysql> set password for zhang@'192.168.80.%'=password('91xueit.com');
设置root@'localhost'账户的密码为'91xueit.com'。
mysql> set password for root@'localhost'=password('91xueit.com');
Query OK, 0 rows affected (0.00 sec)
mysql> quit
使用zhang连接mySQL,使用-h参数指定要连接的mySQL服务器地址,使用-p指明要输入密码。
[root@WebServer ~]# mysql -u zhang -h 192.168.80.222 -p
Enter password:
创建用户时指定密码
mysql> create user zhao@'192.168.80.%' identified by '91xueit.com';
grant方式创建用户
以下命令创建用户和授权同时进行,授权用户chen@'192.168.80.%'能够查询schoolDB数据库的全部表,密码为'91xueit.com'。
mysql> grant select on schoolDB.* to chen@'192.168.80.%' identified by '91xueit.com';
向user表插入记录的方式创建用户
通过create或grant命令创建用户,mySQL会触发将user表重新加载到内存,新用户就可以登录,如果直接向user表插入记录,需要刷新权限,才能使mySQL加载user表,新用户才能登录。
mysql> insert into mysql.user (user,host,password)values ('luo','192.168.80.%',password('91xueit.com'));
登录失败
[root@WebServer ~]# mysql -u luo -h 192.168.80.222 -p
Enter password:
ERROR 1045 (28000): Access denied for user 'luo'@'192.168.80.222' (using password: YES)
刷新权限,将user表加载到内存。
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
再次登录,成功!
[root@WebServer ~]# mysql -u luo -h 192.168.80.222 -p
Enter password:
或输入以下命令,-u后面紧跟用户名,-p后面紧跟密码,注意:紧跟是指没有空格。
[root@WebServer ~]# mysql -uluo -p'91xueit.com'
用户名通配符
主机可以使用通配符,规则和标准的SQL语法中定义的完全相同.
% 对应任意长度的字符.
_ 对应一位长度的任意字符
在mySQL服务启动时,user表会调入内存,在内存中用户账户是排序的。比如有以几个用户的排序从上往下为:
zhang | 192.168.80.222
zhang | 192.168.80.%
zhang | 192.168.%
zhang | %
有通配符的在下面,越具体的在上面,用户登录时输入账户zhang,到底是哪一个账户就看客户端的IP地址,从上往下比较,只要匹配上就认为是该用户。
删除mySQL用户
直接删除mysql表中用户记录,这种方式不会触发mySQL重新加载user表到内存,该用户照样能够登录mySQL,但是执行了flush privileges命令,mySQL会重新加载user表。删除的用户不能登录。
mysql> use mysql;
mysql> delete from user where user='luo';
mysql> flush privileges;
mysql> quit
使用drop命令删除用户,会触发mySQL,将user表中的记录重新加载到内存。删除的用户就不能连接mySQL了。
mysql> drop user zhao@'192.168.80.%';
授权mySQL用户访问数据库
mySQL权限级别
授权就是为某个用户授予权限,mySQL权限控制粒度由大到小分为:
全局层级
全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤销全局权限。
数据库层级
数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.db和mysql.host表中。GRANT ALL ONdb_name.*和REVOKE ALL ON db_name.*只授予和撤销数据库权限。
表层级
表权限适用于一个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤销表权限。
列层级
列权限适用于一个给定表中的单一列。这些权限存储在mysql.columns_priv表中。当使用REVOKE时,您必须指定与被授权列相同的列。
子程序层级
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了CREATE ROUTINE外,这些权限可以被授予为子程序层级,并存储在mysql.procs_priv表中。
当后续目标是一个表、一个已存储的函数或一个已存储的过程时,object_type子句应被指定为TABLE、FUNCTION或PROCEDURE。当从旧版本的My全局权限存储在在mysql数据库user表中,数据库权限存储在mysql数据库的db表中,表权限存储在mysql数据库的tables_priv表中,列权限存储在columns_priv表中。
客户端验证权限的过程。
授予列权限
授予'zhang'@'192.168.80.%'能够查询和更改schoolDB.Tstudent表的studentid,sname列。
mysql> grant select(studentid,sname) on schoolDB.TStudent to 'zhang'@'192.168.80.%';
mysql> grant update(studentid,sname) on schoolDB.TStudent to 'zhang'@'192.168.80.%';
查询列的权限表,可以看到授予的权限。
select * from mysql.columns_priv
验授予的列权限
使用图形界面管理工具,使用zhang用户连接mySQL。
选择schoolDB数据库,选择客户端字符集,点击“Finish”。
查询studentid、sname两列成功。
select studentid,sname from Tstudent
查询所有列失败。
select * from Tstudent
SELECT command denied to user 'zhang'@'192.168.80.2' for table 'TStudent'
更新姓名成功
update TStudent set sname='韩立刚' where studentid='00001'
更新email列失败。
update TStudent set email='onesthan@hotmail.com' where studentid='00001'
UPDATE command denied to user 'zhang'@'192.168.80.2' for column 'email' in table 'TStudent'
删除授予访问列的权限
删除前面授予的'zhang'@'192.168.80.%'访问Tstudent表列的权限。
mysql> revoke select(studentid,sname) on schoolDB.TStudent from 'zhang'@'192.168.80.%';
mysql> revoke update(studentid,sname) on schoolDB.TStudent from 'zhang'@'192.168.80.%';
使用一条SQL语句,也可授权用户对表的指定列进行查询和更改。
mysql> grant select(studentid,sname),update(studentid,email) on schoolDB.TStudent to 'zhang'@'192.168.80.%';
查询列的权限表,可以看到授予的权限。
select * from mysql.columns_priv
删除授权的权限。
mysql> revoke select(studentid,sname),update(studentid,email) on schoolDB.TStudent from 'zhang'@'192.168.80.%';
授予表权限
授予用户'zhang'@'192.168.80.%'对schoolDB.Tstudent表能够增删改查。
mysql> grant select on schoolDB.TStudent to 'zhang'@'192.168.80.%';
mysql> grant update,delete,insert on schoolDB.TStudent to 'zhang'@'192.168.80.%';
查询列的权限表,可以看该表没有记录。
select * from mysql.columns_priv
查询表的权限表,可以看到授予的权限。
select * from tables_priv;
取消表级权限
mysql> revoke update on schoolDB.TStudent from 'zhang'@'192.168.80.%';
mysql> revoke delete,insert,select on schoolDB.TStudent from 'zhang'@'192.168.80.%';
授予数据级权限
授予用户对数据库中所有表进行select、delete、update和insert权限,schoolDB.*的“*”代表schoolDB的所有表。
mysql> grant select on schoolDB.* to 'zhang'@'192.168.80.%';
mysql> grant insert,delete,update on schoolDB.* to 'zhang'@'192.168.80.%';
以下命令授予用户在数据库中创建表的权限。
mysql> grant create on schoolDB.* to 'zhang'@'192.168.80.%';
以下命令授予用户能够创建视图的权限。
mysql> grant create view on schoolDB.* to 'zhang'@'192.168.80.%';
查看数据库级别的权限表。Y代表有该列对应的权限,N代表没有该列对应的权限。
select * from db;
授予用户对数据库全部的权限,
mysql> grant all privileges on schoolDB.* to 'zhang'@'192.168.80.%';
或
mysql> grant all on schoolDB.* to 'zhang'@'192.168.80.%';
取消授予的用户全部数据库级别的权限,这个命令并不删除表级和列级的授予的权限。
mysql> revoke all privileges on schoolDB.* from 'zhang'@'192.168.80.%';
使用with grant option参数,'zhang'@'192.168.80.%'可以授权其他用户有相应的权限,你不能授予其他用户你自己不具备的权限;
mysql> grant all on schoolDB.* to 'zhang'@'192.168.80.%' with grant option;
取消授予的权限。
mysql> revoke all on schoolDB.* from 'zhang'@'192.168.80.%';
取消用户授权其他用户权限的权限。
mysql> revoke grant option on schoolDB.* from 'zhang'@'192.168.80.%';
授予全局权限
授予'zhang'@'192.168.80.%'全局select权限。
mysql> grant select on *.* to 'zhang'@'192.168.80.%';
查看mysql数据库的user表,可以看到授予的全局权限,
select * from user;
授予'zhang'@'192.168.80.%'全局全部权限。
mysql> grant all on *.* to 'zhang'@'192.168.80.%';
再次查看mysql数据库的user表,可以看'zhang'@'192.168.80.%'用户拥有了全部的全局权限。
select * from user;
查看授予的权限
查看当前用户的权限.
mysql>show grants;
使用以下命令查看授予'zhang'@'192.168.80.%'的访问权限。
mysql> show grants for 'zhang'@'192.168.80.%';
撤销用户在某一级别授予的权限
撤销授予用户的权限时,也要考虑拟撤销的是哪一级权限。
输入以下命令会撤销用户全部全局权限,该命令不会撤销授予用户的数据级的权限和表级、列级的权限。
mysql> revoke all on *.* from 'zhang'@'192.168.80.%';
输入以下命令会撤销用户全部的schoolDB数据库级别权限。该命令不会撤销授予用户表级和列级的权限。
mysql> revoke all on schoolDB.* from 'zhang'@'192.168.80.%';
输入以下命令会撤销用户全部的对Tstudent表的访问权限。该命令不会撤销授予用户列级的权限。
mysql> revoke all on schoolDB.TStudent from 'zhang'@'192.168.80.%';
输入以下命令会撤销用户对Tstudent表的studentid、sname列的查询权限。
mysql> revoke select(studentid,sname) on schoolDB.TStudent from 'zhang'@'192.168.80.%';
使用图形界面查看设置的权限
使用mySQL Manager连接,点击 ,出现管理mySQL用户的界面,可以看到现有的全部用户,可以创建新用户,删除用户,编辑用户,可以看到用户的全局权限。
点击下图中 ,可以授予用户全局权限,数据库权限,表权限,列权限。
能够授权访问的对象
grant数据库开发人员(yangql402),创建表、索引、视图、存储过程、函数等权限。
grant创建、修改、删除 MySQL 数据表结构权限。
grant create on schoolDB.* to ‘zhang’@’192.168.80.%’;
grant alteron schoolDB.* to‘zhang’@’192.168.80.%’;
grant dropon schoolDB.* to‘zhang’@’192.168.80.%’;
grant 操作 MySQL 临时表权限。
grant create temporary tables on schoolDB.* to‘zhang’@’192.168.80.%’;
grant 操作 MySQL 索引权限。
grant index onschoolDB.*to‘zhang’@’192.168.80.%’;
grant 操作 MySQL 视图、查看视图源代码权限。
grant create view on schoolDB.* to‘zhang’@’192.168.80.%’;
grant showview on schoolDB.* to‘zhang’@’192.168.80.%’;
grant 操作 MySQL 存储过程、函数权限。
grant create routine on schoolDB.* to‘zhang’@’192.168.80.%’;
grant alter routine on schoolDB.* to‘zhang’@’192.168.80.%’;
grant executeon schoolDB.* to‘zhang’@’192.168.80.%’;
授予执行指定存储过程或使用函数的权限.
mysql> grant execute on procedure schoolDB.gets to 'zhang'@'192.168.80.%';
mysql> grant execute on function schoolDB.create_name to 'zhang'@'192.168.80.%';
该权限存储在mysql数据库的procs_priv表中,执行以下命令能够查看授予的权限。
select * from procs_priv;
以下SQL语句取消执行gets存储过程的权限。
mysql> revoke execute on procedure schoolDB.gets from 'zhang'@'192.168.80.%';
以下SQL语句取消使用create_name函数的权限。
mysql> revoke execute on function schoolDB.create_name from 'zhang'@'192.168.80.%';
以下SQL语句在数据库级别授权用户能够执行该数据库全部存储过程和使用全部函数。
mysql> grant execute on schoolDB.* to 'zhang'@'192.168.80.%';
恢复mySQL管理员账户密码
忘记了root密码,可以更改配置文件,在[mysqld]段中加入一行“skip-grant-tables”,重启mySQL服务,可以使用root账号空密码登录mySQL。
重设mySQL管理员密码的步骤:
1. 更改配置mySQL服务配置文件
[root@WebServer ~]# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
skip-name-resolve
max_connections=200
skip-grant-tables
2. 保存配置文件
3. 重启mySQL服务
[root@WebServer ~]# service mysqld restart
4. 使用root账户空密码连接mySQL
[root@WebServer ~]# mysql -u root
mysql> use mysql;
5. 通过以下方式更改root用户密码,失败。因为mySQL使用skip-grant-tables选项启动,就不能使用这个命令更改密码。
mysql> set password for root@'localhost'=password('123');
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
6. 通过直接更改表的方式设置root’账户密码,以下命令设置全部登录账户是root的密码。
mysql> update user set password=password('123') where user='root';
7. 退出mySQL
mysql> quit
8. 编辑mySQL配置文件,注释掉#skip-grant-tables
[root@WebServer ~]# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
skip-name-resolve
max_connections=200
#skip-grant-tables
9. 保存退出
10. 重启mySQL服务
11. 重启mySQL服务
[root@WebServer ~]# service mysqld restart
12. 使用新密码登录。
[root@WebServer ~]# mysql -u root -p
Enter password:
本文转自 onesthan 51CTO博客,原文链接:http://blog.51cto.com/91xueit/1733895,如需转载请自行联系原作者
mySQL用户和权限管理v1相关推荐
- MySQL用户及权限管理
MySQL用户及权限管理 查看用户及权限 查看用户及作用域(使用范围) 查看用户权限 创建用户及授权 字段参数 用户管理 使用命令提示符登录MySQL mysql -h localhost -u ro ...
- mysql root 登录权限管理_MySQL基础教程(7)MySQL用户与权限管理
在生产环境中通常不建议直接用数据库的root账号来管理每个数据库,这也是为什么安装好MySQL后root用户只能本地登录的原因.正确的做法是为每个业务建立独立的数据库,并且为这些数据库创建一个拥有合适 ...
- MySQL用户与权限管理
执行mysql select 查询报错: SELECT command denied to user 'root'@'localhost' for table "xxx" 问题原因 ...
- mysql root用户可以同时几个人连接_重学MySQL系列(四):10分钟快速掌握MySQL用户与权限管理
在这篇文章中,我们来聊聊怎么管理MySQL的用户及如何为不同用户分配不同的管理权限,其实,在日常使用MySQL的过程中,这部分的工作是由DBA(数据管理员)来完成的. 而我们作为一般的开发人员,只要拿 ...
- mysql用户及权限管理_MySQL 用户及权限管理
1.mysql用户的定义 在mysql中,用户由用户名和主机域组成的. 1.1 用户名的写法 mysql> create user test1@'localhost'; 注意:用户名不要以数字. ...
- Linux命令:MySQL系列之十--MySQL用户和权限管理,mysql管理员密码重置
MySQL用户账号包括:用户名@主机名 用户名:16个字符以内 主机:主机有以下几种表现方式 主机名: mysql IP地址: 172.16.90.111 网络地址:172.16.0.0/255.25 ...
- mysql 列级权限授予用户_mysql 用户及权限管理 小结
MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命 ...
- mysql-front权限管理_mysql 用户及权限管理 小结
MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命 ...
- mysql用户的权限分配
2019独角兽企业重金招聘Python工程师标准>>> 因今天在分配数据库权限的时候,同事反映账户不能使用函数,遂搜集资料总结了一番关于mysql用户的权限分配. MySQL 赋予用 ...
最新文章
- 《领域驱动设计:软件核心复杂性应对之道(修订版)》—第2章 2.1节模式:Ubiquitous Language...
- 机器学习也能套模版:在线选择模型和参数,一键生成demo
- Android使用AudioRecord录制pcm音频原始数据以及使用AudioTrack播放
- LINQ系列:LINQ to SQL Join连接
- Redis 命令--Redis哈希(hash)
- 巧用linux服务器下的/dev/shm/,避开磁盘IO不给力!
- linux中shell变量$#,$@,$0,$1,$2的含义解释:
- PhpStudy 升级 MySQL 版本到5.7
- linux 多线程安全定时器
- 比特币白皮书 Bitcoin: A Peer-to-Peer Electronic Cash System
- 5G的基站覆盖范围300米,今后边远地区的手机通话怎样保证?
- OLAP-impala-大数据Week13-DAY6-impala
- golang的配置文件操作:viper
- 地籍图宗记注记标注实现
- Java游戏框架编写
- 如何批量打印Excel文件
- Python生成验证码图片及验证用户提交的验证码是否正确
- php模拟安卓端捉取数据,ios - PHP如何模拟安卓设备,请求API接口的数据
- 微信支付商家收款费率怎么降低,商户开通0.2%~0.38%手续费教程
- 编译报错unable to initialize decompress status for section .debug_info
热门文章
- Ubuntu 16.04扩展swap分区(内存)
- Ubuntu系统日志分析
- 使用doc下的copy命令复制文件时,注意文件分割符
- mysql xa测试方案_mysql xa导致的事务一直running问题
- 分母为0一定会抛异常吗?
- “System.OutOfMemoryException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理
- 散列函数之双重散列算法解决冲突问题
- linux 下mysql忘记密码或者安装好linux后不知道mysql初始密码解决方案
- AngularJS app.run()文档?
- 删除StringBuilder的最后一个字符?