一 mysql库下的授权表
mysql数据库管理软件将权限信息都存放于mysql库下,该库下有一系列授权表,权限信息都存放于这一系列表中,其中几个尤为重要
mysql库下的授权表及其放行权限的范围
-
1、mysql.user
针对所有数据、所有库下所有表、以及表下的所有字段
*.*->mysql.user grant all on *.* to 'egon'@'%' identified by '123'; -
2、mysql.db
只针对某一数据库下的所有表,以及表下的所有字段
db.*->mysql.db grant all on db1.* to 'tom'@'%' identified by '123'; 撤销权限 revoke select on db1.* to 'tom'@'%'; -
3、mysql.tables_priv
只针对某一张表、以及该表下的所有字段
db1.bloh->mysql.tables_priv grant all on db1.blog to 'lili'@'%' identified by '123'; -
4、mysql.columns_priv
只针对某一个字段
db1.blog->mysql.columns_priv,update权限依赖select权限 grant select (id,sub_time),update (id) on db1.blog to 'xxx'@'%' identified by '123';
二 权限的相关操作
all可以代表除了grant之外的所有权限,可以用with带上grant,授权一个超级管理员
grant all on *.* to egon@'%' identified by '123' with grant option;
查看mysql.user表中可以查看到egon用户的grant权限也被设置成了Y
2.1 查看权限
1、查看当前用户权限
show grants;
2、查看其他mysql用户权限
show grant for root@'%';
2.2 撤销权限
1、revoke跟grant的语法差不多,只需要把关键字"to"换成"from"即可
grant all on *.* to dba@localhost;
revoke all on *.* from dba@localhost;
revoke select on db1.* from 'egon'@'%';
2.3 扩展授权(了解)
max_queries_per_hour:一个用户每小时可发出的查询数量
max_updates_per_hour:一个用户每小时可发出的更新数量
max_connections_per_hour:一个用户每小时可连接到服务器的次数
max_user_connections:允许同时连接数量
mysql> grant all on *.* to test@'%' identified by '123' with max_user_connections 1;
# 测试:
mysql -utest -p123 -h192.168.15.100
不要用-hlocalhost,它代表通过本地套接字链接
2.4 针对不同角色的权限分配
2.4.1 针对普通用户
grant普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利
grant select on testdb.* to common_user@'%'
grant insert on testdb.* to common_user@'%'
grant update on testdb.* to common_user@'%'
grant delete on testdb.* to common_user@'%'
或者用一条mysql命令来代替:
grant select, insert, update, delete on testdb.* to common_user@'%'
2.4.2 针对开发人员
grant数据库开发人员,创建表、索引、视图、存储过程、函数…等权限,具体如下
1、grant创建、修改、删除mysql数据表结构权限
grant create on testdb.* to developer@'192.168.0.%';
grant alter on testdb.* to developer@'192.168.0.%';
grant drop on testdb.* to developer@'192.168.0.%';
2、grant操作mysql外键权限
grant references on testdb.* to developer@'192.168.0.%';
3、grant操作mysql临时表权限
grant create temporary tables on testdb.* to developer@'192.168.0.%';
4、grant操作mysql索引权限
grant index on testdb.* to developer@'192.168.0.%';
5、grant操作mysql视图、查看视图源代码权限
grant create view on testdb.* to developer@'192.168.0.%';
grant show view on testdb.* to developer@'192.168.0.%';
6、grant操作mysql存储过程、函数权限
grant create routine on testdb.* to developer@'192.168.0.%'; -- now, can show procedure status
grant alter routine on testdb.* to developer@'192.168.0.%'; -- now, you can drop a procedure
grant execute routine on testdb.* to developer@'192.168.0.%';
也有一个省事的方法,直接给all就完了
grant all on testdb.* to developer@'192.168.0.%';
2.4.3 针对普通DBA
grant普通DBA管理某个MySQL数据库的权限
grant all on testdb.* to dba@'localhost'
2.4.4 针对高级DBA
grant高级DBA管理mysql中所有数据库的权限
grant all on *.* to dba@'localhost'
2.5 在企业中权限的设定
#开发人员说:请给我开一个用户
#1.首先进行沟通
1.你需要对哪些库、表进行操作
2.你从哪里连接过来
3.用户名有没有要求
4.密码要求
5.你要使用多长时间
6.发邮件
#2.一般给开发创建用户权限,建议不给delete权限
grant select,update,delete,insert on *.* to egon@'10.0.0.%'' identified by '123';
#3.注意:
开发图方便想要root用户,这玩意,谁给谁背锅,自己斟酌,可以考虑让部门老大来给
三 破解密码
linux平台
方法一:启动时,跳过授权库
[root@egon ~]# vim /etc/my.cnf #mysql主配置文件
[mysqld]
skip-grant-table
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql
MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost";
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> q
[root@egon ~]# #打开/etc/my.cnf去掉skip-grant-table,然后重启
[root@egon ~]# systemctl restart mariadb
[root@egon ~]# mysql -u root -p123 # 以新密码登录
方法二
# 1、先关闭数据库服务
方式一
systemctl stop mysql
方式二
mysqladmin -uroot -p123 -S /tmp/mysql.sock shutdown
# 2、跳过授权表启动mysql
mysqld_safe --skip-grant-tables --skip-networking &
ps:还需要跳过网络,否则在操作过程中很不安全
# 3、登录并修改密码
[root@egon ~]# mysql
MariaDB [(none)]> update mysql.user set password=password("123") where user="root" and host="localhost";
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> q
# 4、重启服务
systemctl start mysql
# 5、用修改后的密码登录即可