本文介绍如何在阿里云日志服务SLS中查询、分析DMS的操作日志。
背景信息
操作日志指用户在DMS发起所有操作的流水账式日志,日志包含用户的相关信息、使用的功能模块名称、执行操作的时间、执行的操作类型及SQL语句等信息。更多信息,请参见功能说明。
前提条件
已开通日志服务。更多信息,请参见开通日志服务。
已创建日志服务项目(Project)和日志库(Logstore)。具体操作,请参见创建Project和创建Logstore。
目标SLS的Logstore必须为空,且必须开启全文索引。开启全文索引的具体操作,请参见手动创建字段索引。
费用说明
导出DMS操作日志到SLS功能不计费,但SLS会收取一定的存储费用。SLS的计费详情,请参见计费项。
操作步骤
步骤一:录入Project至DMS
以管理员角色,登录数据管理DMS 5.0。
在控制台首页的数据库实例区域,单击。
说明若您使用的是极简模式的控制台,请单击控制台左侧的数据库实例,在数据库实例区域,单击。
在新增实例页面,录入SLS信息。
类别
配置项
说明
数据来源
-
选择阿里云。
基本信息
数据库类型
选择SLS。
实例地区
选择SLS所在地域。
录入方式
默认选择连接串地址。
连接串地址
在选择实例地区后,会自动生成一个连接串地址。
项目名
输入在SLS创建的Project名称。
AccessKey ID
输入您的阿里云账号AccessKey ID。该AccessKey ID用于Project录入至DMS时进行身份验证。
说明获取AccessKey ID的方法,请参见创建AccessKey。
AccessKey Secret
输入与AccessKey ID对应的AccessKey Secret。
说明获取AccessKey Secret的方法,请参见创建AccessKey。
增值功能包
该数据来源暂不支持添加功能包,默认具有自由操作模式能力。
高级信息
环境类型
选择环境类型。环境类型包含开发、测试、生产、预发、SIT、UAT、压测和STAG环境。更多信息,请参见实例环境类型。
实例名称
自定义SLS在DMS显示的名称。
说明您可以通过编辑实例来维护实例名称。具体操作,请参见编辑实例。
实例DBA
选择一个实例DBA,该DBA可用于后续权限申请等流程。
查询超时时间(s)
设定的安全策略,控制执行查询语句的时间,以保护数据库安全。
导出超时时间(s)
设定的安全策略,控制执行导出语句的时间,以保护数据库安全。
说明基本信息配置完成后,单击页面下方的测试连接,等待测试通过。
若出现“getProject命令的执行结果为空”的错误提示,请确认录入的Project是否由当前登录DMS的阿里云账号创建。
单击提交。
步骤二:在DMS创建操作日志导出任务
- 登录数据管理DMS 5.0。
在顶部菜单栏中,选择安全与规范 > 操作审计。
说明若您使用的是极简模式的控制台,请单击控制台左上角的图标,选择全部功能 > 安全与规范 > 操作审计。
选择导出日志页签,单击右上角新建任务。
在新建导出任务对话框中,配置如下信息。
配置项
是否必填
说明
任务名称
是
导出任务名称,便于后续查找。
目标SLS
是
日志服务的资源管理单元Project。
SLS Logstore
是
该Logstore将会保存导出的DMS操作日志。您可单击该参数的输入框,并选择目标Logstore。
说明若下拉框中未出现目标Logstore,请单击同步字典,再单击确认,DMS可自动采集Logstore中的元数据信息。
功能模块
是
选择需要导出DMS哪些功能模块的日志(与操作日志中的模块对应),包含实例管理、用户管理、权限、在SQL窗口进行数据查询等功能。默认选择导出全部功能的日志。
调度方式
是
选择本次任务的调度方式。
单次:指成功创建导出任务后,仅导出一次。
周期:可选择按日、周或月循环多次导出日志至Logstore。周期调度任务第一次会导出从日志开始时间到第一次调度开始时间范围内,您在DMS生成的所有操作日志,后续仅导出增量的日志。具体配置,请参见周期调度。
日志时间范围
否
说明调度方式选择单次时会出现此配置项。
导出某时间范围内的日志。不填写该配置项则默认导出三年内的日志。
日志开始时间
否
说明调度方式选择周期时会出现此配置项。
周期任务没有截止时间。
DMS日志记录的开始时间,不填写则默认为创建导出任务时间对应三年前的时间。
单击确认,会创建一个导出日志任务,同时,系统还会在您的Logstore中创建一些用于后续查询分析数据的索引字段,例如dbId、dbName、dbUser等。
对于单次任务,仅导出一次日志,当任务的状态为运行成功时,表示日志导出成功。
说明因Logstore索引延迟生效,所以单次调度任务会在创建成功后的90秒左右开始执行。
对于周期任务,会多次导出日志,且导出前和导出后的任务状态均为待调度。您可通过查看任务日志,判断某次任务是否执行成功。
您还可以在目标任务行操作列下进行如下操作。
查询:单击查询,系统自动跳转至SQL Console页面,单击查询,在页面下方的执行结果区域可查看导出至Logstore的日志。
任务日志:单击任务日志,查看任务开始、结束时间、投递日志数量、任务状态等信息。
暂停:单击暂停,在弹出的提示对话框中,单击确认,周期任务会被暂停执行。
重启:单击重启,在弹出的提示对话框中,单击确认,可重新启动已被暂停执行的周期任务。
说明单次任务不支持重启操作,其他操作均支持。
周期任务支持查询、暂停等全部操作。
创建导出任务的更多信息,请参见导出DMS操作日志到阿里云日志服务。
步骤三:在SLS控制台查询、分析导出的DMS操作日志
登录日志服务控制台。
在Project列表区域,单击目标Project。
在控制台左侧,单击日志存储,在日志库列表中单击目标Logstore。
在输入框中输入查询、分析语句。
查询和分析语句由查询语句和分析语句构成,格式为
查询语句|分析语句
。查询分析语句语法请参见查询语法、SQL分析语法。当前仅支持在SLS查询、分析如下信息:
说明以查询dmstest Logstore举例。
登录数据库失败次数最多的用户。
__topic__ : DMS_LOG_DELIVERY AND subModule : LOGIN | SELECT concat(cast(operUserId as varchar), '(', operUserName, ')') user, COUNT(*) cnt FROM dmstest WHERE state = '0' GROUP BY operUserId, operUserName ORDER BY cnt DESC LIMIT 10;
实例来源IP异常的用户。以127.0.0.1举例。
说明实例来源IP指录入实例至DMS时您的本地IP地址,该地址用于标识实例的来源。
__topic__ : DMS_LOG_DELIVERY | SELECT concat(cast(operUserId as varchar), '(', operUserName, ')') user, COUNT(*) cnt FROM dmstest WHERE state = '0' and requestIp in ('127.0.0.1') GROUP BY operUserId, operUserName ORDER BY cnt DESC LIMIT 10;
访问DMS次数最多的用户。
__topic__ : DMS_LOG_DELIVERY| SELECT concat(cast(operUserId as varchar), '(', operUserName, ')') user, COUNT(*) cnt FROM dmstest GROUP BY operUserId, operUserName ORDER BY cnt DESC LIMIT 10;
同一天访问、操作多个数据库的用户。
__topic__: DMS_LOG_DELIVERY | SELECT concat(cast(operUserId as varchar), '(', operUserName, ')') user, date_trunc('day', gmtCreate) time, dbId, COUNT(*) qpd from dmstest GROUP BY time, operUserId, operUserName, dbId ORDER BY time, qpd DESC;
在DMS执行数据库操作失败的用户。
__topic__ : DMS_LOG_DELIVERY AND moudleName : SQL_CONSOLE | SELECT concat(cast(operUserId as varchar), '(', operUserName, ')') user, actionDesc as sqlStatement, subModule as sqlType, remark as failReason FROM dmstest WHERE state = '-1' order by id;
下载敏感数据次数最多的用户。
__topic__ : DMS_LOG_DELIVERY AND moudleName : DATA_EXPORT | SELECT concat(cast(operUserId as varchar), '(', operUserName, ')') user, COUNT(*) cnt FROM dmstest WHERE hasSensitiveData = 'true' GROUP BY operUserId, operUserName ORDER BY cnt DESC LIMIT 10;
对敏感数据执行批量删除、更新等SQL语句。
__topic__ : DMS_LOG_DELIVERY | SELECT subModule, COUNT(*) cnt, COUNT(affectRows) affectRow FROM dmstest WHERE subModule != '' GROUP BY subModule ORDER BY cnt DESC;
导出数据时,是否开启数据水印功能。
__topic__ : DMS_LOG_DELIVERY AND moudleName : DATA_EXPORT | SELECT targetId as orderId, concat(cast(operUserId as varchar), '(', operUserName, ')') user, COUNT(*) cnt FROM dmstest where actionDesc like '%开启数据水印: false' GROUP BY targetId, operUserId, operUserName ORDER BY cnt DESC LIMIT 10;
说明查询开启数据水印的语句为:
'%开启数据水印: true'
。查询未开启数据水印的语句为:
'%开启数据水印: false'
。
在SQL Console页面的执行结果区域下载SQL结果集的用户。
__topic__ : DMS_LOG_DELIVERY AND moudleName : SQL_CONSOLE_EXPORT | SELECT concat(cast(operUserId as varchar), '(', operUserName, ')') user, COUNT(*) cnt FROM dmstest GROUP BY operUserId, operUserName ORDER BY cnt DESC LIMIT 10;
查询和分析的更多信息,请参见步骤一:输入查询和分析语句。
SLS原始日志字段说明
以下表格为DMS操作日志导入至SLS后,部分重要字段所代表的含义。
字段名 | 说明 |
id | 日志唯一ID。 |
gmt_create | 日志创建时间。 |
gmt_modified | 日志修改时间。 |
oper_user_id | 操作者的用户ID。 |
oper_user_name | 操作者名称。 |
moudle_name | 导出的功能模块:
|
sub_module | 子功能模块。 例如在SQL_CONSOLE下,子模块指用户执行SQL语句的类型。 |
db_id | 操作的数据库ID(在DMS标识的ID)。 |
db_name | 操作的数据库名称。 |
is_logic_db | 是否为逻辑库。 |
instance_id | 操作的实例ID(在DMS标识的ID)。 |
instance_name | 操作的实例名称。 |
action_desc | 操作描述。 |
remark | 备注信息。 |
has_sensitive_data | 是否包含敏感信息。 |