RDS MySQL的SQL审计功能已升级为SQL洞察功能,继续为您的数据库提供安全审计、性能诊断等增值服务,升级过程中不影响实例的正常使用,升级后费用更低,功能更丰富。

前提条件

  • RDS MySQL实例为高可用版、三节点企业版。
  • 如果是RAM用户,则必须具备RDS的读写权限,例如AliyunRDSFullAccess权限。如何为RAM用户授权,请参见通过RAM对RDS进行权限管理

背景信息

开启SQL洞察功能可以记录所有DQL、DML和DDL操作信息,这些信息是系统通过网络协议分析所得,对系统CPU消耗极低。试用版支持免费保留最近一天的日志,更长的日志保留时间需要额外付费。

通知

如果RDS MySQL实例处于华东1(杭州)、华东2(上海)、华北1(青岛)、华北2(北京)、华南1(深圳)、华北3(张家口)、华北5(呼和浩特)、西南1(成都)、华南3(广州)、华南2(河源)、华北6(乌兰察布)、中国(香港)、新加坡、马来西亚(吉隆坡)和印度尼西亚(雅加达)地域,SQL洞察功能已升级为SQL洞察和审计,新增了SQL洞察-对比查看来源分析SQL Review相关SQL识别SQL诊断和优化流量回放和压测实时审计等多种新功能。

计费

  • SQL洞察:
    • 试用版:自2020年8月20日开始,各地域将陆续对SQL洞察试用版进行调整:

      SQL洞察试用版将增加15天的使用期限,即使用时间超过15天后,会自动关闭SQL洞察试用版,如果你需要持续使用,请提前修改为非试用版。

      说明 每个实例的SQL洞察试用版只能开启一次。
    • 非试用版:按小时扣费,不同地域的实例有不同的计费。
      • 0.0122元/(GB*小时):中国香港、新加坡地域。
      • 0.008元/(GB*小时):除上述地域外的其它所有地域。
      说明 RDS推出存储包,支持抵扣RDS MySQL的SQL洞察使用量,帮助您节省支出,具体请参见存储包
  • SQL洞察和审计:如果您已开启SQL洞察和审计,则费用统一由DAS专业版收取,RDS侧不再收取SQL洞察的费用。更多信息,请参见产品计费

使用场景

  • 对数据安全有严格要求的行业,如金融行业、安全行业、证券行业、政务行业、保险行业等。
  • 需要详细排查数据库运行情况的场景,如极端场景的问题排查、SQL语句性能排查。
  • 极端情况保护数据的场景,可以通过SQL洞察记录的SQL语句恢复数据。

SQL洞察与Binlog日志的区别

RDS MySQL版的增量数据可以通过SQL洞察或Binlog日志来查看,但是两者又有区别:

  • SQL洞察:类似于MySQL的审计日志,会统计所有DQL、DML和DDL操作信息,这些信息是系统通过网络协议分析所得。SQL洞察不解析实际的参数值,在SQL查询量较大的时候会丢失少量记录。因此通过这种方式来统计增量数据可能会出现不准确的情况。
  • Binlog日志:准确记录数据库所有的增、删、改操作信息以及恢复用户的增量数据。Binlog日志先暂存在实例中,系统定期将实例中已经写完数据的Binlog日志转移至OSS保存7天。无法保存正在写入数据的Binlog文件,所以单击一键上传Binlog后仍有部分Binlog日志没有被上传。这种方式可以准确记录数据库的增量数据,但是无法获取实时日志。

注意事项

  • 在线查询时间范围最多为24小时。这是因为SQL洞察记录所有数据库行为,会记录大量SQL语句,在线查询选择时间范围过大,会导致长时间没有返回查询结果,甚至查询超时。
    说明 如果需要查询更大时间范围的SQL记录,请您导出后进行查询。导出功能会异步导出日志,适合大时间范围内的查询。
  • 在线查询支持组合查询。例如在关键字搜索栏输入test1 test2可以查询包含test1或test2的SQL日志。
  • 在线查询不支持模糊查询。
  • 在线查询的关键字至少包含4个字符。
  • SQL语句长度限制为2048字节,超过的部分无法记录;如果SQL语句长度超过8192字节,将不记录整条SQL语句。
  • 如果您开启的SQL洞察为试用版,暂不支持调用API(DescribeSQLLogRecordsDescribeSQLLogFiles)查询审计日志。

功能说明

  • SQL洞察:
    • SQL审计日志

      记录对数据库执行的所有操作。通过审计日志记录,您可以对数据库进行故障分析、行为分析、安全审计等操作。

    • 增强搜索

      可以按照数据库、用户、客户端IP、线程ID、执行时长、扫描行数等进行多维度检索,并支持导出和下载搜索结果。

      说明
      • 单维度查询时,维度内设置多个查询条件,查询时执行or操作。例如用户栏查询user1和user2,会查询出user1和user2的所有SQL语句。
      • 多维度查询时,维度之间执行and操作。例如用户栏查询user1,操作类型栏查询select,会查询出user1执行的select语句。
      • 暂不支持模糊查询。
    • SQL分析

      可以对指定时间段的SQL日志进行可视化交互式分析,找出异常SQL,定位性能问题。

    • 降低成本

      采用新的列式存储和压缩技术,大幅降低了SQL日志存储空间,平均可帮您节省大约60%的成本。

  • SQL洞察和审计,详情请参见SQL洞察和审计

开通SQL洞察

说明 如果您在日志服务的CloudLens for RDS开启了RDS MySQL实例的审计日志采集功能,系统会自动开启对应RDS MySQL实例的SQL洞察功能。详情请参见CloudLens for RDS
  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧导航栏单击SQL洞察,进入SQL洞察和审计页面。
  3. 开通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日志将被删除。

修改SQL日志的存储时长

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧导航栏单击SQL洞察,进入SQL洞察和审计页面。
  3. 单击服务设置
  4. 修改存储时长并单击确认

关闭SQL洞察

说明 SQL洞察功能关闭后,SQL审计日志会被清空。请将SQL审计日志导出并保存至本地后,再关闭SQL洞察功能。
  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧导航栏单击SQL洞察,进入SQL洞察和审计页面。
  3. 搜索页签的日志列表区域,单击导出
  4. 在弹出的对话框中,选择导出字段导出时间范围,单击确认
  5. 导出完成后,在查看导出列表中,下载已导出的文件并妥善保存。
  6. 单击服务设置
  7. 关闭SQL洞察的开关,然后单击确认
    说明 如果您在日志服务的CloudLens for RDS开启了RDS MySQL实例的审计日志采集功能,系统会自动开启对应RDS MySQL实例的SQL洞察功能,因此您还需要关闭该数据库实例的审计日志采集功能。详情请参见CloudLens for RDS

常见问题

  • Q:开通SQL洞察后,如何确认SQL洞察生成的日志大小?
    A:您可以在基本信息页面的使用量统计区域查看实例的SQL洞察日志大小。SQL洞察日志大小
  • Q:是否可以删除部分SQL洞察内容?

    A:目前还没有此功能,可以通过关闭SQL洞察功能避免产生费用。

  • Q:SQL洞察的日志列表区域中的logout!语句是什么?
    A:logout!是指连接断开。logout!的耗时,是指上一次交互时间到logout!发生时间的差值,可以理解为连接空闲的时长。状态列的1158是指网络链接断开,其可能的原因是:
    • 客户端连接超时。
    • 服务端异常断开。
    • 服务端连接Reset(超过interactive_timeout或wait_timeout时长)。
  • Q:SQL洞察的日志列表中,为什么会出现%客户端IP
    A:该情况可能在您使用存储过程时出现。按如下示例可以复现这种情况:
    说明 示例中测试账号为test_user,测试数据库为testdb。
    1. 在RDS控制台创建普通权限账号及其授权的数据库,详细操作请参见创建数据库和账号
    2. 使用测试账号通过命令行方式连接数据库实例,详细操作请参见通过客户端、命令行连接RDS MySQL实例
    3. 切换到测试数据库,并创建如下存储过程。
      -- 切换到测试数据库
      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;
    4. 使用高权限账号连接数据库实例,详细操作请参见通过客户端、命令行连接RDS MySQL实例
    5. 调用存储过程。
      -- 切换到测试数据库
      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() |
      +--------+-----------+--------+--------+---------+------+-----------+-------------------------------------------------------------------------+