RDS MySQL的SQL洞察功能已升级为SQL洞察和审计。SQL洞察和审计由数据库自治服务DAS提供,在全量请求和安全审计的基础上,融合了搜索、SQL洞察、安全审计以及流量回放和压测等功能,帮助您更好地获取SQL语句的具体信息、排查各种性能问题、识别高危风险来源、验证实例规格。
前提条件
- RDS MySQL实例为高可用版、三节点企业版或集群版。
- 如果是RAM用户,使用搜索功能时,需要为RAM用户授予AliyunRDSReadOnlyWithSQLLogArchiveAccess权限。如何为RAM用户授权,请参见通过RAM对RDS进行权限管理。说明 您也可以通过自定义权限策略授予RAM用户使用搜索(包含导出)功能的权限,详情请参见通过自定义权限策略授权RAM用户使用SQL洞察和审计的搜索(包含导出)功能。
重要 开启SQL洞察和审计功能可以记录所有DQL、DML和DDL操作信息,这些信息是通过数据库内核输出,对系统CPU消耗极低。
功能介绍
实例地域 | 支持的功能 | 计费 |
---|---|---|
华东1(杭州)、华东2(上海)、华北1(青岛)、华北2(北京)、华南1(深圳)、华北3(张家口)、华北5(呼和浩特)、西南1(成都)、华南3(广州)、华南2(河源)、华北6(乌兰察布)、中国(香港)、新加坡、马来西亚(吉隆坡)和印度尼西亚(雅加达) |
|
|
除上述地域之外的其他所有地域 |
| 由RDS侧收取。 |
说明 由RDS侧计费时,按小时扣费,不同地域的实例有不同的计费。
- 0.0122元/(GB*小时):中国(香港)和新加坡地域。
- 0.008元/(GB*小时):除中国(香港)和新加坡外的其它所有地域。
RDS推出存储包,支持抵扣由RDS侧计费的审计日志使用量,帮助您节省支出,具体请参见存储包。
SQL洞察与Binlog日志的区别
RDS MySQL版的增量数据可以通过SQL洞察或Binlog日志来查看,但是两者又有区别:
- SQL洞察:类似于MySQL的审计日志,会统计所有DQL、DML和DDL操作信息,这些信息是系统通过网络协议分析所得。SQL洞察不解析实际的参数值,在SQL查询量较大的时候会丢失少量记录。因此通过这种方式来统计增量数据可能会出现不准确的情况。
- Binlog日志:准确记录数据库所有的增、删、改操作信息以及恢复用户的增量数据。Binlog日志先暂存在实例中,系统定期将实例中已经写完数据的Binlog日志转移至OSS保存7天。无法保存正在写入数据的Binlog文件,所以单击一键上传Binlog后仍有部分Binlog日志没有被上传。这种方式可以准确记录数据库的增量数据,但是无法获取实时日志。
使用场景
- 对数据安全有严格要求的行业,如金融行业、安全行业、证券行业、政务行业、保险行业等。
- 需要详细排查数据库运行情况的场景,如极端场景的问题排查、SQL语句性能排查。
- 极端情况保护数据的场景,可以通过SQL洞察记录的SQL语句恢复数据。
注意事项
- 在线查询时间范围最多为24小时。这是因为SQL洞察记录所有数据库行为,会记录大量SQL语句,在线查询选择时间范围过大,会导致长时间没有返回查询结果,甚至查询超时。说明 如果需要查询更大时间范围的SQL记录,可以使用日志服务接入洞察日志。详情请参见采集RDS SQL审计日志。
- 在线查询支持组合查询。例如在关键字搜索栏输入test1 test2可以查询包含test1或test2的SQL日志。
- 在线查询不支持模糊查询。
- 在线查询的关键字至少包含4个字符。
- SQL语句最大长度受loose_rds_audit_max_sql_size或loose_rds_audit_log_event_buffer_size参数控制,SQL语句最大长度以参数设置值为准,超过部分不再记录并以省略号(......)结尾。
- RDS MySQL 5.6、5.7版本支持loose_rds_audit_max_sql_size参数控制记录长度,取值范围为
[0,8129]
。 - RDS MySQL 8.0版本支持loose_rds_audit_log_event_buffer_size参数控制记录长度,取值范围为
[0,8129]
。
- RDS MySQL 5.6、5.7版本支持loose_rds_audit_max_sql_size参数控制记录长度,取值范围为
- 如果您开启的SQL洞察为试用版,暂不支持调用API(DescribeSQLLogRecords和DescribeSQLLogFiles)查询审计日志。
- 洞察日志包含锁等待时间,而慢日志不包含。
- 如果使用RDS数据库代理地址连接,代理开启了事物级连池,洞察日志记录的客户端IP,由于连接可能会被复用,所以
show processlist
或者SQL洞察显示的IP地址和端口可能和客户端实际的IP地址和端口不一致。 - 当程序使用Prepare方式时,会在SQL洞察中出现2条语句,一条包含问号,一条包含具体值。
- 挂载到PolarDB-X 1.0(DRDS)的RDS MySQL实例执行一条SQL语句时,由于水平拆分(分库分表)原因,会在RDS MySQL实例上产生多条SQL洞察和审计日志。
开启SQL洞察和审计
说明 如果您在日志服务的CloudLens for RDS开启了RDS MySQL实例的审计日志采集功能,系统会自动开启对应RDS MySQL实例的SQL洞察和审计功能。详情请参见CloudLens for RDS。
- 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
- 在左侧导航栏中,选择 。
- 开通SQL洞察。
- 如果RDS MySQL实例处于华东1(杭州)、华东2(上海)、华北1(青岛)、华北2(北京)、华南1(深圳)、华北3(张家口)、华北5(呼和浩特)、西南1(成都)、华南3(广州)、华南2(河源)、华北6(乌兰察布)、中国(香港)、新加坡、马来西亚(吉隆坡)和印度尼西亚(雅加达),单击一键开启,开通SQL洞察和审计。说明 如果您当前的阿里云账号未开通DAS专业版,请按照界面提示,开通DAS专业版,详细信息请参见购买DAS专业版。
- 如果RDS MySQL实例处于除上述地域外的其他所有地域,单击正式版,选择SQL洞察和审计日志的存储时长并单击确定,开通SQL洞察和审计。
说明- SQL洞察和审计默认存储时长为30天,您可以在服务设置中修改存储时长。
- 超过存储时长的SQL日志将被删除。
- 如果RDS MySQL实例处于华东1(杭州)、华东2(上海)、华北1(青岛)、华北2(北京)、华南1(深圳)、华北3(张家口)、华北5(呼和浩特)、西南1(成都)、华南3(广州)、华南2(河源)、华北6(乌兰察布)、中国(香港)、新加坡、马来西亚(吉隆坡)和印度尼西亚(雅加达),单击一键开启,开通SQL洞察和审计。
- 在右侧页面中单击对应功能页签即可查看相关信息。
修改SQL日志的存储时长
关闭SQL洞察和审计
警告 SQL洞察和审计功能关闭后,SQL洞察和审计的日志会被清空。请将SQL洞察和审计的日志导出并保存至本地后,再关闭SQL洞察和审计功能。当重新开启SQL洞察和审计功能时,SQL洞察和审计的日志将从本次开启SQL洞察和审计的时间开始记录。
- 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
- 在左侧导航栏中,选择 。
- 在搜索页签的日志列表区域,单击导出。
- 在弹出的对话框中,选择导出字段和导出时间范围,单击确认。
- 导出完成后,在查看导出列表中,下载已导出的文件并妥善保存。
- 在服务设置页,关闭SQL洞察和审计的开关,然后单击确定。说明 如果您在日志服务的CloudLens for RDS开启了RDS MySQL实例的审计日志采集功能,系统会自动开启对应RDS MySQL实例的SQL洞察和审计功能,因此您还需要关闭该数据库实例的审计日志采集功能。详情请参见CloudLens for RDS。
常见问题
Q:SQL洞察的全量请求统计区域中的logout!
语句是什么?
A:
logout!
是指连接断开。logout!
的耗时,是指上一次交互时间到logout!
发生时间的差值,可以理解为连接空闲的时长。状态列的1158是指网络链接断开,其可能的原因是:- 客户端连接超时。
- 服务端异常断开。
- 服务端连接Reset(超过interactive_timeout或wait_timeout时长)。
Q:SQL洞察的来源统计中,为什么会出现%的访问来源?
A:该情况可能在您使用存储过程时出现。按如下示例可以复现这种情况:
说明 示例中数据库实例为RDS MySQL,测试账号为test_user,测试数据库为testdb。
- 在RDS控制台创建普通权限账号及其授权的数据库,详细操作请参见创建数据库和账号。
- 使用测试账号通过命令行方式连接数据库实例,详细操作请参见通过客户端、命令行连接RDS MySQL实例。
- 切换到测试数据库,并创建如下存储过程。
-- 切换到测试数据库 USE testdb; -- 创建存储过程 DELIMITER $$ DROP PROCEDURE IF EXISTS `das` $$ CREATE DEFINER=`test_user`@`%` PROCEDURE `das`() BEGIN SELECT * FROM information_schema.processlist WHERE Id = CONNECTION_ID(); END $$ DELIMITER;
- 使用高权限账号连接数据库实例,详细操作请参见通过客户端、命令行连接RDS MySQL实例。
- 调用存储过程。
-- 切换到测试数据库 USE testdb; -- 调用存储过程 CALL das(); +--------+-----------+--------+--------+---------+------+-----------+-------------------------------------------------------------------------+ | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | +--------+-----------+--------+--------+---------+------+-----------+-------------------------------------------------------------------------+ | 487818 | test_user | %:2065 | testdb | Query | 0 | executing | SELECT * FROM information_schema.processlist WHERE Id = CONNECTION_ID() | +--------+-----------+--------+--------+---------+------+-----------+-------------------------------------------------------------------------+