1. 概述

数据库可以单独创建用户,而不使用登陆主机系统的账号,同时,可以对所创建的用户进行权限管理,实现了系统安全

权限管理中,属于DCL:Data Control Language 数据控制语言,关键字:GRANT:授权 和 REVOKE:取消权限

2 用户管理

用户账号

.用户账号:'user'@'host'

user:用户名

host:允许用户通过哪些主机远程连接mysqld服务

IP、网络地址、主机名、通配符(%和_)

mysql可以限定从哪个主机发起连接

主机名如果写出主机名,而不是ip,那么网络中就要有dns能将主机名解析为ip,否则连接会失败

如授权是192.168.1.%的ip段,连接时host是www.magedu.com,如果被解析为192.168.1.100,那么就可以连接该数据库,事实上192.168.1.100这个ip的主机名不用是固定,只需要能被解析为192.168.1.100就可以

2.1 创建用户

CREATE USER'username'@'host' [IDENTIFIED BY 'password'];

用户名是有用户名+主机名(或者ip)组合成一个用户名

这样的效果是组合验证,有限制的作用,某个用户只能在指定的用户名或者是指定的ip才能访问数据库

create usersunny@'172.18.50.%' identified by 'Pass123456';

在其他机器上连接,命令如下

mysql -usunny -pPass1234-h172.18.50.73;

创建完账号后,要给账号赋予权限,才能访问对应的表

在服务器上,授权用户sunny对数据库服务器里的sunny这个库具有所有的权限

grant all on sunny.* tosunny@'172.18.50.%';

授权sunny具有管理所有库的权限

grant all on *.* tosunny@'172.18.50.%';

多了identify这个关键字,在授权的时候同时创建账号

grant select,update on sunny.* tojack@'192.168.32.%' identified by "Pass123456";

.查看当前用户:

SELECT user();

.查看用户:这个命令需要在mysql库里查看,因为user这张表是建在mysql库里,use mysql;

SELECT User,Host,PasswordFROM user;

2.2 删除用户

DROP USER  'username'@'host';

示例:删除默认的空用户

DROP USER ''@'localhost';

例子

drop user jack@"192.168.32.%";

2.3 更改口令

1)SET PASSWORD FOR'user'@'host' = PASSWORD(‘password');

PASSWORD(‘password')改口令,=

PASSWORD(‘password')这个函数主要是用来给密码进行加密;建议用这个方法执行更改密码的操作。

例子,注意密码也要用引号引起来,马上生效,客户端只要推出重新登陆就要用新密码登陆

set password for"sunny"@"192.168.32.%" = password("Pass123456");

2) UPDATE user SETpassword=PASSWORD('magedu') WHERE User='root' ;

注意:上面修改表的命令不会马上生效,客户端退出重新登陆也还是要用旧密码,需要在服务器端执行:FLUSH PRIVILEGES生效

这个命令不一定都要执行,有些时候会马上生效,如果授权后,而且刷新权限后还不生效,就退出重新登录就会生效

3)/usr/local/mysql/bin/mysqladmin-u root–poldpasswordpassword 'newpassword‘

另外,linux下破解密码最暴力的是清掉mysql这个目录,但是也会把mysql目录下的表都删掉,不建议这么破解账号

windows下忘记root密码的时候,破解密码

1.关闭正在运行的MySQL服务。

2.打开DOS窗口,转到mysql\bin目录。

3.输入mysqld

--skip-grant-tables回车。--skip-grant-tables的意思是启动MySQL服务的时候跳过权限表认证。

4.再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。

5.输入mysql回车,如果成功,将出现MySQL提示符>。

6.连接权限数据库:use mysql;。

6.改密码:update

user set password=password("123") where user="root";(别忘了最后加分号)。

7.刷新权限(必须步骤):flush privileges;。

8.退出quit。

9.注销系统,再进入,使用用户名root和刚才设置的新密码123登录。

源文档<http://www.jb51.net/article/39454.htm>

3  权限管理

3.1  授权

.权限级别:管理权限、数据库、表、字段、存储例程

.Help GRANT

.GRANT priv_type,... ON [object_type]db_name.tb_nameTO 'user'@'host'[IDENTIFIED BY 'password'] [WITH GRANT OPTION];

[IDENTIFIED BY 'password']的命令不仅授权,而且如果账号不存在,会直接新生成不存在的账号

WITH GRANT OPTION该账号可以把自己的权限授权给别的账号,一般不这么操作

priv_type: ALL[PRIVILEGES]

db_name.tb_name:

*.*:所有库的所表

db_name.*:指定库的所有表

db_name.tb_name:指定库的指定表

db_name.routine_name:指定库的存储过程和函数

.示例:

GRANT SELECT,DELETE ontestdb.* TO 'testuser'@'%'IDENTIFIED BY 'testpass‘;

授权后如果新密码不生效,用命令:flush privileges;进行生效

以下命令授权sunny这个用户在任何机器上都可以登陆,而且对sunny这个数据的所有表具有select和update的权限

grant select,update onsunny.* to sunny@'%' identified by "Pass123456";

以下命令把数据库sunny的所有表格都授予root@192.168.25.%这个账号

grant all on sunny.* to root@“192.168.25.%”;

.查看指定用户获得的授权:

Help SHOW GRANTS

SHOW GRANTS FOR

'user'@'host';查看指定用户的授权

SHOW GRANTS FORCURRENT_USER[()];

查看当前用户的所有授权

show grants forcurrent_user();

3.2 回收授权

注意,需要先查看以下到底授权了哪些,这对授权进行回收,没有授权,回收不了,如原来授权了sunny.*,现在要回收sunny.f2只回收一张表的权限,就不允许的

REVOKE priv_type, ... ONdb_name.tb_nameFROM 'user'@'host

例子

revoke update on sunny.* fromjack@"%";

REVOKE DELETE ON testdb.*FROM 'testuser'@'%‘

.注意:MariaDB服务进程启动时会读取mysql库中所有授权表至内存

(1) GRANT或REVOKE等执行权限操作会保存于系统表中,MariaDB的服务进程通常会自动重读授权表,使之生效

(2)对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表:mysql> FLUSH PRIVILEGES;