这些天一直都浑浑噩噩的,折腾MySQLInnoDB数据引擎的热备份,折腾了很久,结果也没有折腾出来,心里有很多的挫败感。继而在主从(master replication to slave)配置上学习了下,学习的过程中踩到了不少的坑,最后还成功的完成了主从的配置。学习完主从之后,继续折腾热备份的东西,自己的电脑也不争气,虚拟机经常掉线。可能这一段时间并不适合学习热备份,于是乎转向MySQL账户管理,这一块的内容,在以前的工作学习生涯中经常用到,也去问过DBA大叔帮我配置权限。还记得那个DBA大叔,其实年龄并不是很大,一看就是脾气很好的那种。工作区摆放了三个显示器,显示器上全是不断变化的管理信息,顿时觉得很厉害也很佩服。那个时候我引以为傲的是在工作中,使用存储过程取数据,然后使用程序去调用,使用很长的SQL命令将复杂的业务需求封装解决。当时平台的访问量太小,效率再差的SQL不会被发现。再说没有人关注过代码的执行效率,没有人关心过sql得执行效率。只要上了线,运行ok我们就放心了。那个时候我还是初级程序员,以为所有的复杂逻辑,都可以通过if else 去解决,没有遇到过大并发,没有遇到过大数据。进入目前的这家公司后,开始有意的学习这方面的内容,也逐渐了明白了解决大数据和高并发的解决方案。因为近一周没有写过博客,话题跑的有点远,接下来我们来看下MySQL的账户管理该怎么操作。
一、MySQL账户体系
根据账户所具有的权限的不同,MySQL的账户可以分为以下几种:
服务实例级账号
如果某用户如root,拥有服务实例级分配的权限,那么该账号就可以删除所有的数据库、连同这些库中的表。
数据库级别账号
该账号可以在具有权限的数据库中执行增删改查的所有操作(如果分配了这些权限)。
数据表级别账号
该账号可以在具有权限的表上执行增删改查等所有操作(如果分配了这些权限)。
字段级别的权限
该账号可以对某些表中具有权限的字段进行操作(取决于所分配的权限)。
存储程序级别的账号
该账号可以对存储程序进行增删改查的操作(取决于所分配的权限)
二、配置权限
grant 命令语法格式
grant 权限名称[字段列表] on [数据库资源类型]数据库资源 to MySQL账户1,[MySQL账户2] [with grant option]
*.*
表示所有数据库,所有数据表
'account_4'@'%'
表示account_4 账号可以在任意的主机上进行登录。
创建服务实例级账号
grant all privileges on *.* to 'account_4'@'%' identified by '123456' with grant option;
将创建一个名字为account_4的账号,拥有所有的数据库权限,并且具有grant 权限,可以创建其他拥有服务实例权限的其他用户。
创建数据库实例账号
grant all privileges on liangzi.* to 'account_5'@'%' identified by '123456' with grant option;
将创建一个名字为account_5的账号。拥有liangzi 数据库的所有权限,可以随该库中的表进行所有操作。
创建数据表级别的账号
grant all privileges on table liangzi.test_1 to 'account_6'@'%' identified by '123456';
将创建一个名字为account_6 的用户,对langzi数据库中test_1拥有所有的权限。
由于字段级别的权限并不经常使用,所以不必列举。字段设置国语冗余复杂,则每次MySQL在进行SQL执行的时候回进行同样复杂的权限判断,造成效率降低性能下降,同事也会存在安全隐患。因此简单、易管理的、高可用的权限才是可取的。
权限的增删改查
1.增权限
比如原本的权限为:
grant select,insert on liangzi.* to 'account_5'@'%' identified by '123456' with grant option;
想要增加update, delete,alter 权限可以如下操作:
grant update,delete,alter on liangzi.* to 'account_5'@'%' identified by '123456' with grant option;
然后使用
show privileges for account_5;
mysql> show grants for account_5;
+-------------------------------------------------------------------------------------------------+
| Grants for account_5@% |
+-------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'account_5'@'%' |
| GRANT SELECT, INSERT, UPDATE, DELETE, ALTER ON `liangzi`.* TO 'account_5'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------------------------------------------+
2、移除权限
比如原本的权限为:
grant select,insert on liangzi.* to 'account_6'@'%' identified by '123456' with grant option;
想要移除insert 权限:
mysql> revoke insert on liangzi.* from 'account_6'@'%';
mysql> show grants for account_6;
+------------------------------------------------------------------+
| Grants for account_6@% |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'account_6'@'%' |
| GRANT SELECT ON `liangzi`.* TO 'account_6'@'%' WITH GRANT OPTION |
+------------------------------------------------------------------+
三、用户管理
用户管理也无非是增加用户、删除用户之类的。 还记得在装mysql第一次使用的时候,使用了默认密码,进了系统之后无论进行什么操作都需要我设置密码。但是如何设置,提示信息上并没有写。 后来才知道了可以使用:
set password=password('123456');
其实这个命令不仅能够设置当前用户的密码,也可以设置其他用户的密码,这个命令的完整格式是:
set password [for USER] = passowrd('新密码');
比如公司里一个同事离职了,我需要删除他的mysql权限,可以使用如下的命令:
drop user USER_NAME;
drop user roverliang;
增加用户可以使用:
create user 'roverliang'@'%' identified by '123456';
添加的格式为:
create user 'USER_NAME'@'HOST' identified by 'PASSOWRD';
其实这个命令相当复杂,由这个命令创建出来的用户不具有任何权限,仅仅能够登录系统。因此创建用户的时候,可以使用grant 命令,加用户加权限一步到位。