MySQL优化之——权限管理
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46763767
在mysql数据库中,有mysql_install_db脚本初始化权限表,存储权限的表有:
1、user表
2、db表
3、host表
4、table_priv表
5、columns_priv表
6、proc_priv表
MySQL存取控制包括2个阶段:
- 阶段1:server检查你是否同意连接。
- 阶段2:假定你能连接,server检查你发出的每一个请求。看你是否有足够的权限实施它。比如。假设你从数据库中一个表精选(select)行或从数据库抛弃一个表,server确定你对表有select权限或对数据库有drop权限。
server在存取控制的两个阶段使用在mysql
的数据库中的user
、db
和host
表,在这些授权表中字段例如以下:
表名称 | user |
db |
host |
范围字段 | Host |
Host |
Host |
User |
Db |
Db |
|
Password |
User |
||
权限字段 | Select_priv |
Select_priv |
Select_priv |
Insert_priv |
Insert_priv |
Insert_priv |
|
Update_priv |
Update_priv |
Update_priv |
|
Delete_priv |
Delete_priv |
Delete_priv |
|
Index_priv |
Index_priv |
Index_priv |
|
Alter_priv |
Alter_priv |
Alter_priv |
|
Create_priv |
Create_priv |
Create_priv |
|
Drop_priv |
Drop_priv |
Drop_priv |
|
Grant_priv |
Grant_priv |
Grant_priv |
|
Reload_priv |
|||
Shutdown_priv |
|||
Process_priv |
|||
File_priv |
对存取控制的第二阶段(请求证实)。假设请求涉及表,server能够另外參考tables_priv
和columns_priv
表。
这些表的字段例如以下:
表名称 | tables_priv |
columns_priv |
范围字段 | Host |
Host |
Db |
Db |
|
User |
User |
|
Table_name |
Table_name |
|
Column_name |
||
权限字段 | Table_priv |
Column_priv |
Column_priv |
||
其它字段 | Timestamp |
Timestamp |
Grantor |
每一个授权表包括范围字段和权限字段。
user表主要分为:用户列、权限列、安全列、资源控制列
host表主要分为:用户列、权限列
这里美中不足的是mysql.user 没有一个列是保存用户创建时间的
有时候排查用户问题的时候,比方某个客户在某个时间说连接不上数据库,我们在user表里仅仅能查到是否存在那个用户
可是不知道这个用户的创建时间,也就是说客户说的那个时间到底用户是否已经创建我们是不知道的
帐户管理
MYSQL提供很多语句用来管理用户帐号,这些语句能够用来包含登录和退出MYSQLserver、创建用户、删除用户、password管理、权限管理
MYSQL数据库的安全性,须要通过帐户管理来保证
登录和退出MYSQL
mysql命令的经常使用參数
-h:主机名或ip。默认是localhost。最好指定-h參数
-u:username
-p:password,注意:该參数后面的字符串和-p不能有空格
-P:port号,默觉得3306
数据库名:能够在命令最后指定数据库名
-e:运行SQL语句,假设指定该參数。将在登录后运行-e后面的命令或sql语句并退出
命令运行完之后返回book表的结构,查询返回之后会自己主动退出MYSQL
用户
CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']]
新建普通用户
CREATE USER 'jeffrey'@'localhost' identified BY 'mypass';
username部分为“jeffrey”,主机名默觉得“%”(即对全部主机开放权限)
假设指定用户登录不须要password,则能够省略identified BY部分
对于使用插件认证连接的用户,server调用指定名称的插件。client须要提供验证方法所须要的凭据。
假设创建用户时或者连接server时。server找不到相应的插件,将返回一个错误
identified with语法
CREATE user 'jeffrey'@'localhost' identified with my_auth_plugin;
identified with仅仅能在MYSQL5.5.7及以上版本号使用。
identified with和identified by是相互排斥的。所以对一个帐户来说仅仅能使用一个验证方法。
CREATE USER语句的操作会被记录到server日志文件或者操作历史文件里
比如 ~/.mysql_history。这意味着对这些文件有读取权限的人,都能够读取到新加入用户的明文password
一个办法就是新建用户的时候使用passwordkeyword
CREATE user 'tom'@'localhost' identified BY password'*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';
SELECT password('mypass');
SELECT * FROM `mysql`.`user` WHERE `User` ='tom';
先查出你的password的哈希值。然后在新建用户的时候输入哈希值
那么在日志里面就仅仅能看到哈希值
使用GRANT语句创建新用户
GRANT USER语句能够用来创建帐户。通过该语句能够在user表中加入一条新记录
比起CREATE USER语句创建的新用户。还须要使用GRANT语句赋予用户权限
使用GRANT语句创建新用户时必须有GRANT权限。
语法
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
[REQUIRE
NONE |
[{SSL| X509}]
[CIPHER 'cipher' [AND]]
[ISSUER 'issuer' [AND]]
[SUBJECT 'subject']]
[WITH with_option [with_option] ...]
使用GRANT语句创建一个新用户testUser。password为testpwd,并授予用户对全部数据表的SELECT和UPDATE权限
GRANT SELECT ,UPDATE ON *.* TO 'testUser'@'localhost' identified BY 'testpwd'
SELECT `Host` ,`User` ,`Select_priv` ,`Update_priv` FROM mysql.user WHERE `User` ='testUser';
运行结果显示运行成功。使用SELECT语句查询用户testUser的权限
查询结果显示SELECT和UPDATE权限字段均为Y
注意:User表中的user和host字段区分大写和小写,在查询的时候要指定正确的username或主机名
直接操作MYSQL用户表
无论是CREATE USER还是GRANT USER。在创建用户时,实际上都是在user表中加入一条新记录。
使用INSERT语句向mysql.user表INSERT一条记录来创建一个新用户
插入的时候必需要有INSERT权限
INSERT INTO mysql.user(host,user,password,[privilegelist])
VALUES ('host','username',password('password'),privilegevaluelist)
使用INSERT创建一个新用户。其username称为customer1。主机名为localhost。password为customer1
INSERT INTO mysql.user(host,user,password)
VALUES ('localhost','customer1',password('customer1'))
语句运行失败。查看警告信息例如以下:
show WARNINGS ;
由于ssl_cipher这个字段在user表中未定义默认值,所以在这里提示错误信息。
影响insert语句的运行,使用SELECT语句查看user表中的记录
能够看到,插入失败
删除普通用户
使用DROP USER语句删除用户。也能够直接通过DELETE从mysql.user表中删除相应的记录来删除用户
DROP USER语句用于删除一个或多个MYSQL帐户。要使用DROP USER。必须拥有MYSQL数据库的全局
CREATE USER 权限或DELETE权限。
删除testUser这个用户
DROP user 'testUser'@'localhost';
能够发现testUser这个用户已经删除了
使用delete语句删除用户
DELETE FROM mysql.user WHERE `Host`='localhost' and `User`='testUser'
root用户改动自己的password
改动rootpassword的方式有多种
1、使用mysqladmin命令在命令行指定新password
mysqladmin -u root -p password"rootpwd"
2、改动mysql数据库的user表
UPDATE mysql.user SET `Password` =password('rootpwd') WHERE `User`='root' and `Host`='localhost'
password('')函数用来加密用户密码。
运行update之后须要运行flush privileges语句又一次载入用户权限
3、使用SET语句改动root用户的password
SET PASSWORD语句能够用来又一次设置其它用户的登录password或者自己使用的帐户password
语法
SET PASSWORD=PASSWORD("ROOTPWD")
新password必须用PASSWORD函数加密
使用root用户登录到mysql之后运行以下语句
SET password=password('123456')
运行之后须要使用运行flush privileges语句或者重新启动MYSQL又一次载入用户权限
root用户改动普通用户password
1、使用SET语句改动普通用户的password
SET PASSWORD FOR 'USER'@'HOST' =PASSWORD("ROOTPWD")
2、使用update语句改动普通用户的password
UPDATE mysql.user SET `Password` =password('rootpwd') WHERE `User`='root' and `Host`='localhost'
运行完成之后须要使用flush privileges语句或者重新启动MYSQL又一次载入用户权限
3、使用GRANT语句改动普通用户password
GRANT USAGE ON *.* TO 'someuser'@'%' IDENTIFIED BY 'somepwd'
使用以下语句把testUser用户的password改为123456
grant USAGE ON *testUser*TO 'localhost' identified BY '123456';
注意:使用GRANT语句和MYSQLADMIN设置password。他们均会加密password,这样的情况下,不须要使用PASSWORD()函数
普通用户改动password
使用SET语句改动自己的password
SET password=password('newpassword');
比方改动testUser这个用户的password。须要使用testUser这个用户登录到mysql。然后运行
SET password=password('123456');
root用户password丢失的解决的方法
使用--skip-grant-tables选项启动MYSQL服务
使用--skip-grant-tables选项启动MYSQL时,server将不载入权限推断,不论什么用户都能訪问数据库
LINUX下
使用mysqld_safe来启动MYSQL服务,也能够使用/etc/init.d/mysql命令来启动mysql
mysqld_safe --skip-grant-tables user=mysql
或者
/etc/init.d/mysql start-mysqld --skip-grant-tables
启动MYSQL服务后,就能够使用root用户登录了
Windows下
具体能够看一下这篇文章
Windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes
权限管理
MYSQL中的各种权限
对于GRANT和REVOKE语句,priv_type能够被指定为下面不论什么一种:
权限 |
意义 |
ALL [PRIVILEGES] |
设置除GRANT OPTION之外的全部简单权限 |
ALTER |
同意使用ALTER TABLE |
ALTER ROUTINE |
更改或取消已存储的子程序 |
CREATE |
同意使用CREATE TABLE |
CREATE ROUTINE |
创建已存储的子程序 |
CREATE TEMPORARY TABLES |
同意使用CREATE TEMPORARY TABLE |
CREATE USER |
同意使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。 |
CREATE VIEW |
同意使用CREATE VIEW |
DELETE |
同意使用DELETE |
DROP |
同意使用DROP TABLE |
EXECUTE |
同意用户执行已存储的子程序 |
FILE |
同意使用SELECT...INTO OUTFILE和LOAD DATA INFILE |
INDEX |
同意使用CREATE INDEX和DROP INDEX |
INSERT |
同意使用INSERT |
LOCK TABLES |
同意对您拥有SELECT权限的表使用LOCK TABLES |
PROCESS |
同意使用SHOW FULL PROCESSLIST |
REFERENCES |
未被实施 |
RELOAD |
同意使用FLUSH |
REPLICATION CLIENT |
同意用户询问从属server或主server的地址 |
REPLICATION SLAVE |
用于复制型从属server(从主server中读取二进制日志事件) |
SELECT |
同意使用SELECT |
SHOW DATABASES |
SHOW DATABASES显示全部数据库 |
SHOW VIEW |
同意使用SHOW CREATE VIEW |
SHUTDOWN |
同意使用mysqladmin shutdown |
SUPER |
同意使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;同意您连接(一次),即使已达到max_connections。 |
UPDATE |
同意使用UPDATE |
USAGE |
“无权限”的同义词 |
GRANT OPTION |
同意授予权限 |
当从旧版本号的MySQL升级时,要使用EXECUTE, CREATE VIEW, SHOW VIEW, CREATE USER, CREATE ROUTINE和ALTER ROUTINE权限
授权
授权就是为某个用户授予权限
授予的权限能够分为多个层级:
· 全局层级
全局权限适用于一个给定server中的全部数据库。这些权限存储在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。当从旧版本号的MySQL升级时,要使用本子句。您必须升级您的授权表
使用GRANT语句创建一个新用户grantUser,password为“grantpwd”
用户对全部的数据有查询、插入权限,并授予GRANT权限
GRANT SELECT ,INSERT ON *.*TO 'grantUser'@'localhost' identified BY '123456' WITH GRANT OPTION ;
查询显示grantUser被创建成功,并赋予了SELECT、INSERT、GRANT权限。其对应字段值为Y
被授予GRANT权限的用户能够登录MYSQL并创建其它用户帐户,在这里是grantUser的用户
收回权限
收回权限就是取消已经赋予用户的某些权限。收回用户不必要的权限能够在一定程度上保证系统的安全性。
使用REVOKE收回权限之后,用户帐户的记录将从db、host、tables_priv、columns_priv表中删除,可是用户帐号记录依旧
在user表中保存。
语法
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
FROM user [, user] ... REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
使用REVOKE语句,必须拥有mysql数据库的全局CREATE权限或UPDATE权限
使用REVOKE语句取消用户grantUser的INSERT权限
REVOKE INSERT ON *.* FROM 'grantUser'@'localhost';
能够看到grantUser用户的INSERT权限已经被收回了
注意:当从旧版本号的MYSQL升级时,假设要使用EXECUTE、CREATE VIEW、SHOW VIEW、CREATE USER、CREATE ROUTINE、ALTER ROUTINE
权限,必须先升级授权表
查看权限
SHOW GRANT语句能够显示用户的权限信息
语法
show grants FOR 'user'@'host';
使用SHOW GRANT语句查询用户grantUser的权限信息
show grants FOR 'grantUser'@'localhost';
返回结果显示了user表中的帐户信息;接下来以为GRANT SELECT ONkeyword开头,表示用户被授予了SELECT权限。
*.*表示SELECT权限作用于全部数据库的全部数据表;
IDENTIFIED BY 后面的为用户加密后的password
在这里,仅仅是定义了个别的用户权限。GRANT能够显示更加具体的权限信息,包含全局级的和非全局级的权限
假设表层级或者列层级的权限被授予用户的话。他们也能在结果中显示出来。
查看MYSQL里面匿名用户
假设有匿名用户。那么client就能够不用password登录MYSQL数据库,这样就会存在安全隐患
检查匿名用户的方法
SELECT * FROM mysql.user WHERE `User`='';
假设查找到user字段值为空的那条记录。说明存在匿名用户,须要把这条记录删除
假设用匿名用户登录MYSQL就能够看到username是空的
删除语句
DELETE FROM mysql.user WHERE `User`='';
SELECT * FROM mysql.user WHERE `User`='';
总结
本文简单的阐述了MYSQL的用户管理和权限方面的内容。希望对大家有帮助
假设大家想更深入学习MYSQL訪问控制方面的知识
能够參考这篇文章:MySQL权限的架构体系
核心就是两个图
1、client连接请求认证阶段
2、client操作请求认证阶段
MySQL优化之——权限管理的更多相关文章
- MYSQL数据库管理之权限管理
经常遇到有网友在QQ群或者论坛上问关于mysql权限的问题,今天抽空总结一下关于这几年使用MYSQL的时候关于MYSQL数据库的权限管理的经验,也希望能对使用mysql的网友有所帮助! 一.MYSQL ...
- Mysql 用户,权限管理的几点理解。
前两天项目数据库要移植到mysql,为此临时抓了几天很久没用的mysql. 公司的数据库比较简单,从oracle迁移到mysql很简单,但是,中间的权限管理让我感觉既简单又复杂..简单是因为网上关于m ...
- mysql 用户及权限管理 小结
MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命 ...
- MySQL Study之--MySQL用户及权限管理
MySQL Study之--MySQL用户及权限管理 MySQLserver通过MySQL权限表来控制用户对数据库的訪问.MySQL权限表存放在mysql数据库里.由mysql_install ...
- mysql事务,视图,权限管理,索引,存储引擎(胖胖老师)
1: 视图什么是视图 视图是一个虚拟表, 它的内容来源于查询的实表, 本身没有真正的数据;视图的作用 对于复杂的查询时,每次查询时都需要编写一些重复的查询代码让编写sql的效率低下, 为了 ...
- MySQL用户与权限管理
执行mysql select 查询报错: SELECT command denied to user 'root'@'localhost' for table "xxx" 问题原因 ...
- mysql用户和权限管理
用户和权限管理 Information about account privileges is stored in the user, db, host, tables_priv, columns_p ...
- mysql学习之权限管理
数据库权限的意义: 为了保证数据库中的业务数据不被非授权的用户非法窃取,需要对数据库的访问者进行各种限制,而数据库安全性控制措施主要有这三种,第一种用户身份鉴别,手段可以是口令,磁卡,指纹等技术,只有 ...
- MariaDB/MySQL用户和权限管理
本文目录: 1.权限验证 1.1 权限表 1.2 图解认证和权限分配的两个阶段 1.3 权限生效时机 2.用户管理 2.1 创建用户 2.2 create user和alter user 2.3 记录 ...
随机推荐
- 使用注册表优化终端、编辑器的中英字体混合显示,如「Consolas + 雅黑」「Monaco + 雅黑」
在终端.cmd.编辑器中偶尔会有中文字符出现,Windows下默认的点阵字体「宋体」和等宽英文字符放在一起非常违和.一个解决方法是下载混合字体,比如「Consolas + YAHEI hybrid」, ...
- MC34063A development aid
http://www.nomad.ee/micros/mc34063a/index.shtml This is a simple-minded design tool that allows you ...
- debuginfo-install glibc-2.17-157.el7.x86_64
Running transaction Installing : glibc-debuginfo-common-.el7.x86_64 / Installing : glibc-debuginfo-. ...
- Codeforces Round #309 (Div. 2) C. Kyoya and Colored Balls
Kyoya Ootori has a bag with n colored balls that are colored with k different colors. The colors are ...
- 通过ExchangeService 发送邮件
ExchangeService service = new ExchangeService(); service.Url = new Uri("https://***(host)/ews/e ...
- MySQL:按前缀批量删除表格
想要实现mysql>drop table like "prefix_%" 没有直接可用的命令,不过可以通过mysql语法来组装, SELECT CONCAT( 'DROP T ...
- redhat/centos使用service控制启动与关闭
原文地址: http://guodong810.blog.51cto.com/4046313/1285353 有时,我们自己安装了某个软件时,想让对这个服务更加容易的控制,在redhat/centos ...
- Tomcat – java.lang.OutOfMemoryError: PermGen space Cause and Solution
Read more: http://javarevisited.blogspot.com/2012/01/tomcat-javalangoutofmemoryerror-permgen.html#ix ...
- NPOI读取Excel日期类型单元格返回一串数字问题
public string getCellStringNEW(int row, int column) { try { ICell cell = xlSheet.GetRow(row).Cells[c ...
- Tomcat 7 的七大新特性
英文原文:Top 7 Features in Tomcat 7: The New and the Improved Tomcat的7引入了许多新功能,并对现有功能进行了增强.很多文章列出了Tomcat ...