MySQL 权限与安全

1、权限系统的工作原理
对于身份的认证,MySQL 是通过IP 地址和用户名联合进行确认的,例如MySQL 安装后默认创建的用户root@localhost 表示用户root 只能从本地(localhost)进行连接才可以通过认证,此用户从其他任何主机对数据库进行的连接都将被拒绝。也就是说,同样的一个用户名,如果来自不同的IP 地址,则MySQL 将其视为不同的用户。
对所有数据库都具有相同权限的用户记录并不需要记入db 表,而仅仅需要将user 表中的select_priv 改为“Y”即可。换句话说,user 表中的每个权限都代表了对所有数据库都有的权限。
当用户通过权限认证, 进行权限分配时, 将按照user?db?tables_priv?columns_priv 的顺序进行权限分配,即先检查全局权限表user,如果user 中对应权限为“Y”,则此用户对所有数据库的权限都为“Y”,将不再检查db、tables_priv和columns_priv;如果为“N”,则到db 表中检查此用户对应的具体数据库,并得到db 中为“Y”的权限;如果db 中相应权限为“N”,则检查tables_priv 中此数据库对应的具体表,取得表中为“Y”的权限;如果tables_priv 中相应权限为“N”,则检查columns_priv 中此表对应的具体列,取得列中为“Y”的权限。

2、账号管理
##创建账号
例1:创建用户z1,权限为可以在所有数据库上执行所有权限,只能从本地进行连接。
mysql> grant all privileges on *.* to z1@localhost;

例2:在例1 基础上,增加对z1 的grant 权限。
mysql> grant all privileges on *.* to z1@localhost with grant option;

例3:在例2 基础上,设置密码为“123”。
mysql> grant all privileges on *.* to z1@localhost identified by '123' with grant option;

例4:创建新用户z2,可以从任何IP 进行连接,权限为对test1 数据库里的所有表进行SELECT、UPDATE、INSERT 和DELETE 操作,初始密码为“123”。
mysql> grant select,insert,update,delete on test1.* to 'z2'@'%' identified by '123';

例5:授予SUPER、PROCESS、FILE 权限给用户z3@%。
mysql> grant super,process,file on *.* to 'z3'@'%';
因为这几个权限都属于管理权限,因此不能够指定某个数据库,on 后面必须跟“*.*”。
FILE 权限主要以下作用:
? 将数据库的信息通过SELECT …INTO OUTFILE…写到服务器上有写权限的目录下,作为文本格式存放。
? 可以将有读权限的文本文件通过LOAD DATA INFILE…命令写入数据库表。
PROCESS 权限能被用来执行“show processlist”命令,查看当前所有用户执行的查询的明文文本,包括设定或改变密码的查询。
SUPER 权限能执行kill 命令,终止其他用户进程。

kill用户的例子:
mysql> show processlist;
+----+------+-----------------+-------+---------+------+-------+------------------+
| Id | User | Host            | db    | Command | Time | State | Info             |
+----+------+-----------------+-------+---------+------+-------+------------------+
|  1 | root | localhost:45137 | mysql | Query   |    0 | init  | show processlist |
| 30 | z2   | localhost:45166 | test1 | Sleep   |    7 |       | NULL             |
+----+------+-----------------+-------+---------+------+-------+------------------+
2 rows in set (0.00 sec)

mysql> kill 30;
Query OK, 0 rows affected (0.00 sec)
mysql> show full processlist;   ##显示完整SQL语句
+----+------+-----------------+------+---------+------+-------+-----------------------+
| Id | User | Host            | db   | Command | Time | State | Info                  |
+----+------+-----------------+------+---------+------+-------+-----------------------+
|  1 | root | localhost:60082 | NULL | Query   |    0 | init  | show full processlist |
+----+------+-----------------+------+---------+------+-------+-----------------------+
1 row in set (0.01 sec)

例6:只授予登录权限给z4@localhost。
mysql> grant usage on *.* to 'z4'@'localhost';
usage 权限只能用于数据库登录,不能执行任何操作。

##查看权限
账号创建好后,可以通过如下命令进行查看权限:show grants for user@host;
mysql> show grants for z1@localhost;
host 可以不写,默认是“%”。

对于MySQL 5.0 以后的版本,也可以利用新增的information_schema 数据库进行权限的查看:
mysql> select * from information_schema.SCHEMA_PRIVILEGES where grantee="'z1'@'localhost'";

##回收权限
收回z2@localhost 上的INSERT 和SELECT 权限:
mysql> revoke select,insert on *.* from z2@localhost;
usage 权限不能被回收,也就是说,REVOKE 用户并不能删除用户。

##修改密码
方法1:可以用mysqladmin 命令在命令行指定密码。
shell> mysqladmin -u user_name -h host_name password "newpwd"

方法2:执行SET PASSWORD 语句。下例中将账号'jeffrey'@'%'的密码改为'biscuit'。
mysql> SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');
如果是更改自己的密码,可以省略for 语句:mysql> SET PASSWORD = PASSWORD('biscuit');

方法3:还可以在全局级别使用GRANT USAGE 语句(在*.*)来指定某个账户的密码而不影响账户当前的权限。
mysql> GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';

方法4:直接更改数据库的user 表。
UPDATE mysql.user SET Password = PASSWORD('bagel') WHERE Host = '%' AND User = 'francis';
注意:更改密码时候一定要使用PASSWORD 函数(mysqladmin 和GRANT 两种方式不用写,会自动加上)。

##删除账号
mysql> drop user z2@localhost;

3、MySQL修改root密码的多种方法
方法1: 用SET PASSWORD命令 
首先登录MySQL。 
格式:mysql> set password for '用户名'@'localhost' = password('新密码'); 
例子:
mysql> set password for 'root'@'localhost' = password('123'); 
mysql> set password for 'root'@'127.0.0.1' = password('123'); 
mysql> set password = password('123'); 

方法2:用mysqladmin 
格式:mysqladmin -u用户名 -p旧密码 password 新密码 
例子:
mysql> mysqladmin -uroot -proot password 'root' 
mysql> mysqladmin -uroot -proot -h 127.0.0.1 password '123456' -S /mydata/data/3306/mysql_3306.sock

方法3:用UPDATE直接编辑user表 
首先登录MySQL。 
mysql> use mysql; 
mysql> update user set password=password('root') where user='root' and host='localhost'; 
mysql> update user set password=password('root') where user='root';
mysql> flush privileges; 

方法4:在忘记root密码的时候,可以这样 
以windows为例: 
1. 关闭正在运行的MySQL服务。 
2. 打开DOS窗口,转到mysql\bin目录。 
3. 输入:mysqld_safe --skip-grant-tables --user=mysql & 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。 
   多实例:mysqld_safe  --defaults-file=/mydata/data/3306/my.cnf --skip-grant-tables &
4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。 
   空密码登录:mysql -uroot -p -h 127.0.0.1 -P3306
5. 输入mysql回车,如果成功,将出现MySQL提示符 >。 
6. 连接权限数据库: use mysql; 。 
6. 改密码:update mysql.user set password=password("123") where user="root";(别忘了最后加分号) 。 
7. 刷新权限(必须步骤):flush privileges;
8. 退出 quit。 
9. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值