一、背景说明
MySQL作为数据库管理系统,里面保存企业的重要业务数据,因此保证数据库的安全性非常重要,如何保证数据库的安全性呢?用户和用户权限管理是一个很重要的方面。
MySQL数据库具有非常高的安全性,为我们提供了GRANT语句进行授权管理,并且它可以去自定义设置用户权限。
而MySQL数据库中的权限又会分为不同的几个功能,每个用户的权限可能都是不一样的。
二、如何查看权限
MySQL数据库查看一个用户的权限很简单,只需要知道这个用户的名称就可以了。在命令行之中输入mysql并进入相关的交互环境,执行以下命令查看用户权限,示例如下:
show grants for root
执行完成之后就会输出这个用户所具有的权限是哪些,有多少条权限就会输出多少条数据。
而root是管理员账号,它拥有全局操作和用户管理的两个权限。
三、设置权限(建立数据库权限分配)
MySQL数据库设置权限的关键词是grant,这关键词也可以用来去修改用户的信息以及创建新的用户,设置用户权限的命令如下所示:
GRANT ALL PRIVILEGES ON . TO ‘root’@‘localhost’ WITH GRANT OPTION
上面这一行命令的意思为为root这个用户在本地的数据连接之中添加一个可以对任意数据库去执行任意操作的权限,只要将ALL PRIVILEGES改为其他的权限属性值就可以更改设置的权限了。
重新赋予权限就可以了。
mysql > grant all privileges on 数据库.* to 用户名;
mysql > flush privileges;//刷新权限表
四、最佳的落地与实践
4.1 遇到报错:Command denied to user
CREATE command denied to user 问题解决方案
当前用户没有权限操作
遇到该问题,不要慌张,既然数据库的账号名是命名为read
就很自然而然可以想到,这个权限很有可能就只有只读权限了。
经过确认,这个goread的用户名,有且仅有read 权限,
拥有read权限,也就意味着只能读,而不能写。
4.2 如何做生产环境的数据修复?
因为运维与开发,在大的公司基本上是分离的,那么开发在数据修复时,可以按照参照以下步骤来完成,
当然,也会有很多公司会有自己的SQL审计工单系统来保障数据库的安全。
Step1、新建一个SQL查询语句
具体入口如下所示
Step2、编写修复的SQL脚本
编写类似于如下SQL脚本来实现业务数据的修复
/****************************************************************************************
【操作原因】填写具体的操作原因(如因修复异常的手机号等)
需求提单人:填写XXX姓名
脚本提供人:填写YYY姓名
脚本审核人:填写ZZZ姓名
运维执行人:填写AAA姓名
时间:填写编写脚本的时间
****************************************************************************************/
use 填写库名称;
create table 填写操作的表名称(user_info)_当前日期_bak as select * from 填写操作的表(user_info) WHERE id
IN('XXXXXXXX(填写ID唯一值)');
-- 具体要修改的业务内容
-- 用户1 张三
select * from user_info where real_name = '张三' ;
-- 更新张三的手机号信息
UPDATE user_info
SET phone = '修改后的手机号'
WHERE id = 'XXXXXXXX';
Step3、留意以下注意事项
(1)初始化SQL的用途,以及相应的签名,维护发起人,审核人,执行人,编写日期等内容
(2)必须标明你需要操作的sheme(库)是哪个?使用use 语句来实现。
(3)必须进行数据的备份,备份时,以防止SQL出错造成业务异常,采用增量备份
(4)select语句,这类用于辅助update、insert的语句,在发给运维之前,需要注释掉。
(5)部分数据,可能存在主键依赖,值唯一,因此需要先删除后插入之类。
(6)多运用注释,每句SQL脚本最好都以分号结尾
(7)将每次数据修复的数据内容,都在Navicat中进行SQL备份,以及进行本地SQL脚本备份(略)
(8)最好,把数据拷贝到沙箱环境,之后,基于沙箱环境的数据库进行数据库测试执行。
4.2 如何做生产环境时版本发布时?
4.2.1 初始化表结构与数据
留意以下注意事项
(1)将所有你要执行的SQL语句合并到一个SQL文件中进行导入操作,参考若依等框架的做法
(2)运维说可以使用数据库迁移工具flyway来实现快速迁移
因目前还没有做深入了解,目前还不做深入讲解,后面的文章会逐渐说明。
4.2.2 数据表结构变更
比如给订单表、SKU表加字段内容,直接编写以下Alter语句发给运维即可
ALTER TABLE `order_item`
ADD COLUMN `migu_order_no` varchar(255) DEFAULT NULL COMMENT '咪咕订单号';
ALTER TABLE `order_item`
ADD COLUMN `prize_code` varchar(255) DEFAULT NULL COMMENT '咪咕奖励编码';
ALTER TABLE `goods_sku`
ADD COLUMN `prize_code` varchar(255) DEFAULT NULL COMMENT '咪咕奖励编码';
ALTER TABLE `goods_sku`
ADD COLUMN `prize_remark` varchar(255) DEFAULT NULL COMMENT '奖励备注';