MySQL用户权限验证与管理方法详解

本文实例讲述了MySQL用户权限验证与管理方法。分享给大家供大家参考,具体如下:

一、Mysql权限分两阶段验证

1. 服务器检查是否允许连接:用户名、密码,主机地址。

2. 检查每一个请求是否有权限实施。

二、Mysql权限列表

权限 权限级别 权限说明
create 数据库、表或索引 创建数据库、表或索引权限
drop 数据库或表 删除数据库或表权限
grant option 数据库、表或保存的程序 赋予权限选项
references 数据库或表 外键权限
alter 更改表,比如添加字段、索引、修改字段等
delete 删除数据权限
index 索引权限
insert 插入权限
select 查询权限
update 更新权限
create view 视图 创建视图权限
show view 视图 查看视图权限
alter routine 存储过程 更改存储过程权限
create routine 存储过程 创建存储过程权限
execute 存储过程 执行存储过程权限
file 服务器主机上的文件访问 文件访问权限
create temporary tables 服务器管理 创建临时表权限
lock tables 服务器管理 锁表权限
create user 服务器管理 创建用户权限
proccess 服务器管理 查看进程权限
reload 服务器管理 执行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的权限
replication client 服务器管理 复制权限
replication slave 服务器管理 复制权限
show databases 服务器管理 查看数据库权限
shutdown 服务器管理 关闭数据库权限
super 服务器管理 执行kill线程权限

三、Mysql用户权限管理操作

1. 权限查询:

(1)查看mysql的所有用户及其权限:

select * from mysql.user\G;

(格式化显示)

(2)查看当前mysql用户权限:

show grants;

(3)查看某个用户的权限:

show grants for 用户名@主机;

示例:

show grants for root@localhost;

2. Mysql用户创建:

方法一:使用create user命令创建。

create user '用户名'@'主机' identified by '密码';

示例:

create user 'wjt'@'localhost' identified by 'wujuntian';

方法二:直接向数据表mysql.user中插入一条用户记录。

示例:

代码如下:

insert into mysql.user set user='wujuntian',host='localhost',password=password('123123');

注意:

使用方法二一定要记得要执行flush privileges刷新权限。其次,mysql5.7以后,mysql.user表的password字段已被authentication_string代替,所以应将“password”改为“authentication_string”,密码一定要使用password函数加密。

3. Mysql用户删除:

drop user '用户名'@'主机';

4. Mysql用户权限授予:

刚创建的用户默认是没有权限的,需要使用grant指令进行权限的授予。

grant指令完整格式:

grant 权限列表 on 数据库名.数据表名 to '用户名'@'主机' identified by '密码' with grant option;

示例:

grant all privileges on *.* to 'wjt'@'localhost' identified by "wujuntian" with grant option;

可使用“*”表示所有数据库或所有数据表,“%”表示任何主机地址。

可以使用grant重复给用户添加权限,进行权限叠加。

with grant option:这个选项表示该用户可以将自己拥有的权限授权给别人。

记得授权后一定要刷新权限:

flush privileges;

5. Mysql用户权限回收:

revoke指令格式:

revoke 权限列表 on 数据库名.数据表名 from 用户名@主机;

示例:

revoke select on test.user from wjt@localhost;

注意:

其实GRANT语句在执行的时候,如果权限表中不存在目标账号,则创建账号;如果已经存在,则执行权限的新增。

usage权限不能被回收,也就是说,REVOKE用户权限并不能删除用户。

6. 对账户重命名:

rename user '旧用户名'@'旧主机' to '新用户名'@'新主机';

示例:

rename user 'wujuntian'@'localhost' to 'ajun'@'localhost';

7. Mysql用户密码修改:

方法一:使用set password命令。

set password for '用户名'@'主机' = password('新密码');

示例:

set password for 'root'@'localhost' = password('123456');

方法二:修改mysql.user表中的password(或authentication_string)字段。

示例:

代码如下:

update mysql.user set password=password('123123') where user='root' and host='localhost';

注意:

此方法一定要执行“flush privileges;”指令刷新权限,否则密码修改无法生效。Mysql5.7以后应将“password”改为“authentication_string”。

方法三:使用grant指令在授权时修改密码:

grant select on 数据库名.数据表名 to 用户名@主机 identified by '新密码' with grant option;

示例:

代码如下:

grant select on test.user to ajun@localhost identified by '111111' with grant option;

方法四:运行mysqladmin脚本文件。

该文件一般在mysql安装目录下的bin目录中。进入该目录,根据一下两种具体情况输入命令(只有root用户有这个权限)。

(1)用户尚无密码:

mysqladmin -u 用户名 password 新密码;

(2)用户已有密码:

mysqladmin -u 用户名 -p password 新密码;

(回车后会提示输入旧密码,输入之后即可修改成功。)

注意:

更改密码时候一定要使用PASSWORD函数(mysqladmin 和GRANT 两种方式不用写,会自动加上)。

8. 忘记密码登录mysql:

方法一:

先停止正在运行的Mysql服务,在命令行窗口进入mysql安装目录下的bin目录,在-skip-grant-tables参数下运行mysqld文件(Linux系统运行mysqld_safe文件更安全):

mysqld --skip-grant-tables

这样可以跳过Mysql的访问控制,在控制台以管理员的身份进入mysql数据库。另外再开启一个命令行窗口,进入mysql安装目录下的bin目录,直接输入:mysql,回车,即可登录mysql,然后就可以重新设置密码了(注意:此时“Mysql用户密码修改”中的四种方法只有第二种方法能使用!)。设置成功后退出,重启Mysql服务。

方法二:修改mysql配置文件my.ini。

其实原理和方法一一样,都是利用Mysql提供的--skip-grant-tables参数来跳过Mysql的访问控制。打开mysql配置文件my.ini,在'[mysqld]'下加入“skip-grant-tables”,保存,重启Mysql服务,然后就可以不需密码登录mysql进行密码修改了。

Mysql中的“mysql”数据库存储着所有Mysql用户的权限信息数据表。当Mysql启动时,所有的权限表内容都被读进内存中,进行权限判断时直接使用内存中的内容进行判断。用grant、revoke或set password对权限表进行的修改会立即被服务器注意到,GRANT操作的本质就是修改权限表后进行权限的刷新。但是如果手工修改权限表,例如使用insert、update、delete等操作权限表的话,应该执行一个flush privileges命令,该命令会使服务器重新读取权限表内容到内存,从而使修改生效。如果不执行该命令,必须重启mysql服务才能生效。所以,最好使用grant、revoke或set password对权限表进操作,可以省去执行flush privileges命令的麻烦,而且如果忘了执行这个命令的话你会很抓狂。。。

不仅如此,删除用户、重命名用户最好也分别使用drop user、rename user命令进行操作,而不要使用delete、update命令进行操作。前者不但会对mysql.user数据表进行操作,同时也会更新其他权限表的记录,而后者只会对mysql.user表的数据进行操作,这样会出现很多问题,因为用户的权限信息不仅仅存在于mysql.user表中。比如你使用delete删除了mysql.user表中的一个用户,但是没有操作其他权限数据表的话,那么其他权限数据表例如tables_priv中关于该用户的权限记录还存在着,下次如果想使用create user命令创建相同名称的用户会失败,只能使用insert into指令向mysql.user表中插入记录,或者先把其他权限数据表中与该用户名相关的记录删除。使用update命令重命名用户也会出现很大问题,重命名后用户失去了很多的权限,而其他权限表中关于原用户名的记录则成了没用的记录,除非你对每一个权限表都进行相同的更新操作,但这很麻烦。所以,使用drop user、rename user吧,一个命令就可以让系统自动帮你完成所有事情,何乐而不为呢!

Mysql权限检查:

mysql 先检查对大范围是否有权限,如果没有再到小范围里去检查。比如:先检查对这个数据库是否有select权限,如果有,就允许执行。如果没有,再检查对表是否有select权限,一直到最细粒度,也没有权限,就拒绝执行。因此,粒度控制越细,权限校验的步骤越多,性能越差。

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》

希望本文所述对大家MySQL数据库计有所帮助。

(0)

相关推荐

  • linux下mysql开启远程访问权限 防火墙开放3306端口

    开启mysql的远程访问权限 默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限. 主流的有两种方法,改表法和授权法. 相对而言,改表法比较容易一点,个人也是比较倾向于使用这种方法,因此,这里只贴出改表法 1.登陆mysql mysql -u root -p 2.修改mysql库的user表,将host项,从localhost改为%.%这里表示的是允许任意host访问,如果只允许某一个ip访问,则可改为相应的ip,比如可以将l

  • 详解利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置

    本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Dockerfile和shell脚本实现这一过程. 搭建步骤 1.首先创建Dckerfile: FROM mysql:5.7 #设置免密登录 ENV MYSQL_ALLOW_EMPTY_PASSWORD yes #将所需文件放到容器中 COPY setup.sh /mysql/setup.sh COPY sch

  • Mysql:The user specified as a definer ('xxx@'%') does not exist的解决方案

    今天项目优化过程中,mysql有个问题The user specified as a definer ('wx_root'@'%') does not exist 查了一下,意思是执行sql无权限.  看了下数据库用户是quoters 而sql没有所属权.那就找原因了.发现sql执行过程中,调用了一个存储过程 而这个存储过程的创建者是wx_root . 所以在执行的时候,quoters没有权限 解决方案和操作: 1.查看存储过程的所属对象:  右键存储过程函数-->选择对象属性-->查看函数创

  • MySQL存储过程的权限问题小结

    MySQL的存储过程,没错,看起来好生僻的使用场景.问题源于一个开发同学提交了权限申请的工单,需要开通一些权限. 本来是一个很正常的操作,但在我来看是比较着急且紧迫的,说来惭愧,忙着方向规划和开发的事情,这个基础的操作功能竟然给忽略了,所以看到目前的一些实现方式,还是希望能够做一些细小的事情把这些重复性的工作给解放了. 当然我决定把一些基础性的工作接过来,一方面是给同事减压,另一方面是在做一个完整的体验,因为很多需求和痛点通过实践是能够很容易捕捉到重点的,如果我觉得不合理,那么这个过程中势必会有

  • mysql创建本地用户及赋予数据库权限的方法示例

    前言 大家在安装 mysql 时通常会生成一个超级用户 root,很多人之后就一直沿用这一个用户,虽然这会很方便,但超级用户权限太大,在所有地方使用它通常是一个安全隐患. 这一点跟操作系统的用户管理也是类似的,多数人贪图方便都直接使用 administrator 或 root 用户,其实是一种不建议的做法. 那么,要如何在 mysql 中创建 root 之外的用户并赋予相应权限呢? 我们直接来看一个示例: CREATE USER 'golden'@'localhost' IDENTIFIED B

  • 详解mysql8.0创建用户授予权限报错解决方法

    问题一: 会报错的写法: GRANT ALL PRIVILEGES ON *.*  'root'@'%' identified by '123123' WITH GRANT OPTION; 以下是正确的写法: grant all privileges on *.* to 'root'@'%' ; 可见,在授权的语句中需要去掉 IDENTIFIED BY 'password'; 单独授予某种权限的写法: GRANT SELECT ON oilsystem.input TO 'u5'@'localh

  • mysql 开放外网访问权限的方法

    如下所示: 主要执行授权命令: 两种方式 1. 允许任意主机以用户bd和密码bdpw连接到local服务器 mysql> GRANT ALL PRIVILEGES ON *.* TO 'bd'@'%' IDENTIFIED Y 'bdpw' WITH GRANT OPTION; mysql> flush privileges; 2. 允许特定的IP地址以用户bd和密码bdpw连接到local服务器 mysql> GRANT ALL PRIVILEGES ON *.* TO 'bd'@'1

  • 修改mysql允许主机访问的权限方法

    开启mysql的远程访问权限 默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限. 主流的有两种方法,改表法和授权法. 相对而言,改表法比较容易一点,个人也是比较倾向于使用这种方法,因此,这里只贴出改表法 1.登陆mysql mysql -u root -p 2.修改mysql库的user表,将host项,从localhost改为%.%这里表示的是允许任意host访问,如果只允许某一个ip访问,则可改为相应的ip,比如可以将l

  • MySQL中配置文件my.cnf因权限问题导致无法启动的解决方法

    本文主要给大家介绍了关于MySQL中配置文件my.cnf因权限问题导致无法启动的相关解决过程,分享出来供大家参考学习,下面来一起看看详细的介绍: 问题描述 MySQL 无法启动,报如下错误: 问题分析 查看 MySQL 错误日志发现如下错误(提示 MySQL 库的 host 表无法打开): 查看 /etc/my.cnf 配置文件: 到 MySQL 数据库所在目录查看表是否存在: 发现 MySQL 库的 host 表是存在的,那为什么会提示不存在呢? 问题应该出在 /etc/my.cnf 文件上,

  • 关于mysql create routine 权限的一些说明

    1.如果用户有create routine 权限那么他就可以创建procedure | function . 2.如果用户创建了procedure | function 那么mysql 会自动赋予它对procedure | function 的alter routine和execute 权限. 3.例子: 用户root用户创建一个spuser@'localhost'用户并对它赋予create procedure 权限 grant create routine on tempdb.* to spu

随机推荐