时间:2021-07-01 10:21:17 帮助过:16人阅读
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,密码为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字段区分大小写,在查询的时候要指定正确的用户名或主机名
直接操作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创建一个新用户,其用户名称为customer1,主机名为localhost,密码为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用户修改自己的密码
修改root密码的方式有多种
1、使用mysqladmin命令在命令行指定新密码
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用户的密码
SET PASSWORD语句可以用来重新设置其他用户的登录密码或者自己使用的帐户密码
语法
SET PASSWORD=PASSWORD("ROOTPWD")
新密码必须用PASSWORD函数加密
使用root用户登录到mysql之后执行下面语句
SET password=password(‘123456‘)
执行之后需要使用执行flush privileges语句或者重启MYSQL重新加载用户权限
root用户修改普通用户密码
1、使用SET语句修改普通用户的密码
SET PASSWORD FOR ‘USER‘@‘HOST‘ =PASSWORD("ROOTPWD")
2、使用update语句修改普通用户的密码
UPDATE mysql.user SET `Password` =password(‘rootpwd‘) WHERE `User`=‘root‘ and `Host`=‘localhost‘
执行完毕之后需要使用flush privileges语句或者重启MYSQL重新加载用户权限
3、使用GRANT语句修改普通用户密码
GRANT USAGE ON *.* TO ‘someuser‘@‘%‘ IDENTIFIED BY ‘somepwd‘
使用下面语句把testUser用户的密码改为123456
grant USAGE ON *testUser*TO ‘localhost‘ identified BY ‘123456‘;
注意:使用GRANT语句和MYSQLADMIN设置密码,他们均会加密密码,这种情况下,不需要使用PASSWORD()函数
普通用户修改密码
使用SET语句修改自己的密码
SET password=password(‘newpassword‘);
比如修改testUser这个用户的密码,需要使用testUser这个用户登录到mysql,然后执行
SET password=password(‘123456‘);
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用户登录了
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 |
允许用户询问从属服务器或主服务器的地址 |
REPLICATION SLAVE |
用于复制型从属服务器(从主服务器中读取二进制日志事件) |
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权限
授权
授权就是为某个用户授予权限
授予的权限可以分为多个层级:
· 全局层级
全局权限适用于一个给定服务器中的所有数据库。这些权限存储在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,密码为“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 ON关键字开头,表示用户被授予了SELECT权限;
*.*表示SELECT权限作用于所有数据库的所有数据表;
IDENTIFIED BY 后面的为用户加密后的密码
在这里,只是定义了个别的用户权限,GRANT可以显示更加详细的权限信息,包括全局级的和非全局级的权限
如果表层级或者列层级的权限被授予用户的话,他们也能在结果中显示出来。
查看MYSQL里面匿名用户
如果有匿名用户,那么客户端就可以不用密码登录MYSQL数据库,这样就会存在安全隐患
检查匿名用户的方法
SELECT * FROM mysql.user WHERE `User`=‘‘;
如果查找到user字段值为空的那条记录,说明存在匿名用户,需要把这条记录删除
如果用匿名用户登录MYSQL就可以看到用户名是空的
删除语句
DELETE FROM mysql.user WHERE `User`=‘‘; SELECT * FROM mysql.user WHERE `User`=‘‘;
总结
本文简单的阐述了MYSQL的用户管理和权限方面的内容,希望对大家有帮助
如果大家想更深入学习MYSQL访问控制方面的知识
可以参考这篇文章:MySQL权限的架构体系
核心就是两个图
1、客户端连接请求认证阶段
2、客户端操作请求认证阶段
我的MYSQL学习心得(十三) 权限管理
标签:指定 local 日志 val amp let 插件 解决 column