在mysql数据库中,有mysql_install_db脚本初始化权限表,存储权限的表有:
MySQL存取控制包括2个阶段:
阶段1:服务器检查你是不是允许连接。
阶段2:假定你能连接,服务器检查你发出的每一个要求。看你是不是有足够的权限实行它。例如,如果你从数据库中1个表精选(select)行或从数据库抛弃1个表,服务器肯定你对表有select权限或对数据库有drop权限。
服务器在存取控制的两个阶段使用在mysql的数据库中的user、db和host表表示,
表名称 user db host
范围字段 Host Host Host
User Db Db
Password User
表名称 | user | db | host |
---|---|---|---|
范围字段 | host,use,password | host,db,user | host,db |
权限的键以 _priv 结尾:
使用GRANT语句创建新用户
GRANT USER语句可以用来创建帐户,通过该语句可以在user表中添加1条新记录
比起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语句创建1个新用户testUser,密码为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 ‘Host’,’User’,’Select_priv’,’Update_priv’ from mysql user where ‘User’ = ‘testUser’;
root用户密码丢失的解决办法
使用–skip-grant-tables选项启动MYSQL服务
使用–skip-grant-tables选项启动MYSQL时,服务器将不加载权限判断,任何用户都能访问数据库
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用户登录了
权限管理
MYSQL中的各种权限
对GRANT和REVOKE语句,priv_type可以被指定为以下任何1种:
权限 | 意义 |
---|---|
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 | 允许用户询问从属服务器或主服务器的地址 |
REPLICATION SLAVE | 用于复制型从属服务器(从主服务器中读取2进制日志事件) |
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命令;允许您连接(1次),即便已到达max_connections。 |
UPDATE | 允许使用UPDATE |
USAGE | “无权限”的同义词 |
GRANT OPTION | 允许授与权限 |
当从旧版本的MySQL升级时,要使用EXECUTE, CREATE VIEW, SHOW VIEW, CREATE USER, CREATE ROUTINE和ALTER ROUTINE权限
授权
授权就是为某个用户授与权限
授与的权限可以分为多个层级:
全局层级
全局权限适用于1个给定服务器中的所有数据库。这些权限存储在mysql.user表中。GRANT ALL ON .和REVOKE ALL ON .只授与和撤消全局权限。
数据库层级
数据库权限适用于1个给定数据库中的所有目标。这些权限存储在mysql.db和mysql.host表中。GRANT ALL ONdb_name.和REVOKE ALL ON db_name.只授与和撤消数据库权限。
表层级
表权限适用于1个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授与和撤消表权限。
列层级
列权限适用于1个给定表中的单1列。这些权限存储在mysql.columns_priv表中。当使用REVOKE时,您必须指定与被授权列相同的列。
子程序层级
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT权限适用于已存储的子程序。这些权限可以被授与为全局层级和数据库层级。而且,除CREATE ROUTINE外,这些权限可以被授与为子程序层级,并存储在mysql.procs_priv表中。
当后续目标是1个表、1个已存储的函数或1个已存储的进程时,object_type子句应被指定为TABLE、FUNCTION或PROCEDURE。当从旧版本的MySQL升级时,要使用本子句,您必须升级您的授权表
收回权限
收回权限就是取消已赋予用户的某些权限。收回用户没必要要的权限可以在1定程度上保证系统的安全性。
使用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';
注意:当从旧版本的MYSQL升级时,如果要使用EXECUTE、CREATE VIEW、SHOW VIEW、CREATE USER、CREATE ROUTINE、ALTER ROUTINE权限,必须先升级授权表
查看权限
SHOW GRANT语句可以显示用户的权限信息
show grants FOR 'user'@'host';