应急预案:AnalyticDB产品中禁止使用Bad SQL的方法

应急预案:AnalyticDB产品中禁止使用Bad SQL的方法

更新时间:2020-07-27 17:46:52

1. 概述

本文主要介绍在专有云环境中,AnalyticDB产品中禁止使用Bad SQL的方法。

1.1. 适用范围

  • 专有云V2企业版,AnalyticDB
    说明
    • 适用于专有云V2.0.0~V2.5.0环境,包含V2.0.0和V2.5.0环境。

    • 只适用产品版本AnalyticDB V2.0版本,AnalyticDB V3.0版本不适用。

  • 专有云V3企业版,AnalyticDB
    说明
    • 适用于专有云V3.0.0~V3.11.0环境,包含V3.0.0和V3.11.0环境。

    • 只适用产品版本AnalyticDB V2.0版本,AnalyticDB V3.0版本不适用。

1.2. 用户告知

  • 适用平台:x86
  • 授权级别:L3(产品研发工程师)
  • 临时或固化方案:固化
  • 操作复杂度:中
  • 预估执行时长:6小时
  • 业务影响:否
    说明:为提高性能,优化配置项。
  • 风险等级:低

2. 问题描述

因为Bad SQL造成CN(COMPUTENODE)节点异常,导致库的整体读写性能下降,从而影响整个库的查询,需要暂时屏蔽非重要业务的大量Bad SQL的执行。

3. 解决方案

3.1. 环境检查

  1. 访问以下链接,登录RMUI控制台。
    http://[$Gallardo_IP]:8315/index
    说明:[$Gallardo_IP]为gallardo_ag容器的IP地址。
  2. 任意查找一个FN(FRONTNODE)节点并登录,并记录相应的Pid值。
  3. 依次执行以下命令,查找日志目录。
    pwdx [$Pid]
    说明:[$Pid]为上一步记录的Pid值。
  4. 执行以下命令,进入指定目录。
    cd [$Path]/logs
    说明:[$Path]上一步中获取的目录。
  5. 执行以下命令,检索Bad SQL。
    egrep "Total_time=[0-9]{5,}" access.log --color
    说明:Total_time的单位为毫秒,超过60秒以上的SQL一般为Bad SQL,但并不绝对。
    Bad SQL几个特点如下:
    • select命令查询的表数据量非常大。
    • 在使用group by xxx时,xxx字段不是分区字段。
    • 用到like的语句,例如like '%abc'like '%abc%'
    • SQL中有二级分区条件的,一定要指定二级分区列。

3.2. 实施步骤

库级别禁止Bad SQL

  1. 访问以下链接,登录Garuda Console。
    http://[$Ads_AG_IP]:8080/console-dev
    说明:[$Ads_AG_IP]为AdminGateway#服务角色对应的容器IP。
  2. 单击配置管理,选择高级,进入/global/metainfo/db/[$DB]路径。
    说明:[$DB]为相应的库名。
  3. 在右侧节点数据窗口的mergenode/query下,配置以下参数:
    说明
    • 如果已有filterSqlKeys参数,请备份修改前的键值,然后按照以下参数修改键值。
    • 如何添加mergenode,请参见补充说明
    • 键为filterSqlKeys
    • 值为[$Bad_SQL]
      说明
      • [$Bad_SQL]为环境检查中获取的Bad SQL。
      • 如果已有键值,则需要备份修改前的内容。
      • 添加或者修改键值需要注意以下几点:
        • 键值必须小写。
        • 键值尽量将SQL写全,避免误禁止其他SQL。
        • 多个键值之间用逗号半角逗号(,)分隔。
    • 值类型为string
  4. 如库级别需要临时开放禁止的Bad SQL,进入/global/metainfo/db/[$DB]路径,在右侧节点数据窗口的mergenode/query下,将filterSqlKeys参数改为filterSqlKeys_bak即可。

集群级别禁止Bad SQL

  1. 登录Garuda Console,单击配置管理,选择高级,进入/global/config/query路径。
    说明:不建议在集群级别禁止Bad SQL。
  2. 在右侧节点数据窗口中配置以下参数:
    说明:如果已有filterSqlKeys参数,请备份修改前的键值,然后按照以下参数修改键值。
    • 键为filterSqlKeys
    • 值为[$Bad_SQL]
    • 值类型为string

3.3. 结果验证

  1. 登录任意一个FN(FRONTNODE)节点,依次执行以下命令,查找日志目录。
    pwdx [$Pid]
  2. 执行以下命令,进入指定目录。
    cd [$Path]/logs
  3. 执行以下命令,确认Bad SQL在最新的日志中没有出现。
    grep "[$Bad_SQL]" access.log

4. 回滚方案

如需回滚,请根据实际情况进行回滚。

  • 如果在实施步骤中是修改filterSqlKeys的键值,请参见实施步骤,将其改为备份的原始值。
  • 如果在实施步骤中是新增filterSqlKeys键,请删除相应的键值即可。

5. 补充说明

  1. 登录Garuda Console,单击配置管理,选择高级,进入/global/metainfo/db/[$DB]路径,在右侧节点属性窗口中,单击添加数据
  2. 添加一个空值数据,数据类型选择HashMap
  3. 节点数据窗口中,单击添加数据,创建mergeNode键,为空,值类型HashMap
  4. 选中mergeNode,单击添加数据,即可mergeNode下添加相关配置。