GaussDB(DWS)一键式现场信息收集工具,助你快速复现现网执行计划

举报
-CHEN111- 发表于 2022/04/12 16:20:07 2022/04/12
【摘要】 计划生成问题的处理依赖于对应环境,而在本地复现现网的计划生成问题时,很难手动构造可以准确复现问题的镜像集群和客户数据。针对此问题,GaussDB(DWS)提供了一个能够快速复现计划生成问题的解决方案,即通过精准收集并导出现场环境的辅助信息,以SQL语句的形式在本地执行导出信息,从而实现现场信息的导入,以在本地复现现场问题。

前言

计划生成问题的处理依赖于对应环境,而在本地复现现网的计划生成问题时,主要有两个困难:

  1. 需要在本地以1:1的比例创建客户集群的镜像集群(DN 的数量相同)。若客户集群的节点数很多,则很难在本地创建镜像集群。
  2. 由于无法获取客户数据,因此需要手动构造数据。很难构造出能够准确复现问题的数据。

为了解决上述的两个困难,需要收集一些现场信息来辅助复现问题,这些信息包括:

  • 查询对象(表、视图、索引、函数、命名空间)的定义
  • 所需的统计信息(pg_class、pg_statistic、pg_statistic_ext)
  • 影响计划复现的配置参数
  • 节点信息和node group信息
  • 数据库信息(数据库编码、数据库兼容性)

GaussDB(DWS)提供了一个在本地快速复现现网计划生成问题的解决方案:将现场信息导出的功能集成在内核中,在客户现场,通过客户端执行 SQL 语句的方式使用现场信息导出功能,然后将导出的现场信息发送回本地,在本地执行导入脚本,将现场信息导入本地的集群中,就可以在该集群中复现问题了。
未命名文件.png
该解决方案既避免了创建镜像集群和手动构造数据,又不需要登录客户的服务器,使用方便且适用面广,为维护工作和定位问题提供了便利。

如何使用?

1. 预置条件

预设现场环境如下:

CREATE TABLE t1(c1 int, c2 timestamp) DISTRIBUTE BY HASH(c1);
INSERT INTO t1 VALUES( generate_series(1,10), sysdate);
ANALYZE t1;

2. 执行概述

EXPLAIN关键字新增语法选项STATS,用于导出现场信息。

执行 EXPLAIN (STATS ON) xxx 语句(xxx即为现场执行报错语句)后,获取复现所需的现场信息,此时将导出的现场信息作为输入,以 SQL 语句的形式执行,从而将现场信息导入本地集群。

以上述预置条件为例,假设现场执行查询SELECT * FROM t1时,出现错误,则通过本文所述特性,获取复现当前环境所需信息的 SQL 语句如下。

EXPLAIN (STATS ON)
SELECT * FROM t1;

3. 结果说明

执行上述导出语句后,得到以下信息:

3.1 查询对象的定义

 --@ query objects

 -- Create namespace query objects

 -- Create function query objects

 -- Create sequence query objects

 -- Create table query objects

 -- Create table "t1"

 DROP TABLE IF EXISTS "public"."t1";
 SET search_path = public;
 CREATE  TABLE t1 (
         c1 integer,
         c2 timestamp without time zone
 )
 WITH (orientation=row, compression=no)
 DISTRIBUTE BY HASH(c1);

 -- Create view query objects

 --@@ query objects

对于查询对象的定义信息导出,主要针对 表、视图、索引、函数以及命名空间 信息进行导出。

3.2 所需的统计信息

 --@ statistics

 -- Import "pg_class_tmp"

 SET search_path = "public";
 COPY "pg_class_tmp" FROM stdin DELIMITER ',';
 public,t1,4,10,0
 \.

 -- Import "pg_statistic_tmp"

 SET search_path = "public";
 COPY "pg_statistic_tmp" FROM stdin DELIMITER ',';
 public,t1,pg_catalog,int4,c,1,f,0,4,-1,2,3,0,0,0,97,97,0,0,0,\N,{.527273},\N,\N,\N,{1\,2\,3\,4\,5\,6\,7\,8\,9\,10},\N,\N,\N,\N,-1
 public,t1,pg_catalog,timestamp,c,2,f,0,8,1,1,3,0,0,0,2060,2062,0,0,0,{1},{1},\N,\N,\N,{"2022-04-12 14:24:09"},\N,\N,\N,\N,-.333333
 \.

 -- Import "pg_statistic_ext_tmp"

 SET search_path = "public";
 COPY "pg_statistic_ext_tmp" FROM stdin DELIMITER ',';
 \.

 --@@ statistics

对于所需的统计信息的导出,主要针对 pg_class_tmp 、 pg_statistic_tmp 、pg_statistic_ext_tmp 信息进行导出。

3.3 影响计划复现的配置参数

 --@ config options

 -- acceleration_with_compute_pool = off
 -- agg_redistribute_enhancement = off
 -- allocate_mem_cost = 0
 -- best_agg_plan = 0
 -- cache_tag_value_num = 60000
 -- codegen_cost_threshold = 10000
 -- codegen_strategy = partial
 -- constraint_exclusion = partition
 -- cost_model_version = 1
 -- cost_param = 16
 -- cpu_index_tuple_cost = 0.005
 -- cpu_operator_cost = 0.0025
 -- cpu_tuple_cost = 0.01
 -- cursor_tuple_fraction = 0.1
 -- debug_group_dop =
 -- default_statistics_target = 100
 -- default_storage_nodegroup = installation
 -- effective_cache_size = 16384
 -- enable_absolute_tablespace = on
 -- enable_bitmapscan = on
 -- enable_bloom_filter = on
 -- enable_broadcast = on
 -- enable_change_hjcost = off
 -- enable_codegen = on
 -- enable_codegen_print = off
 -- enable_compress_hll = off
 -- enable_compress_spill = on

 -- 省略部分输出

 --@@ config options

所有配置参数的信息被存放在 guc_variables 数组中,以 config_generic 结构存储,config_genericgroup 字段指明了该配置参数在哪个功能模块中被使用。
此外,还有一些配置参数虽然没有直接在计划生成阶段被使用,但间接影响了计划的生成,例如兼容性相关的配置参数,这些配置参数也需要被导出。

3.4 节点信息和node group信息

 --@ node groups

 -- Create nodes

 CREATE NODE "datanode1" WITH (type = 'datanode');
 CREATE NODE "datanode2" WITH (type = 'datanode');
 CREATE NODE "datanode3" WITH (type = 'datanode');
 CREATE NODE "datanode4" WITH (type = 'datanode');

 -- Create node groups

 CREATE NODE GROUP "node_group" WITH (datanode1, datanode2, datanode3, datanode4);

 -- Update tables' node groups

 UPDATE pgxc_class
 SET    pgroup = 'node_group'
 FROM   pg_class JOIN
        pg_namespace ON (relnamespace = pg_namespace.oid)
 WHERE  relname = 't1' AND
        nspname = 'public' AND
        pg_class.oid = pcrelid;


 --@@ node group

扫描 pgxc_nodepgxc_group 系统表,获取节点信息与node group信息,然后构造出CREATE语句。

3.5 数据库信息

 --@ database

 CREATE DATABASE "plan_sim" ENCODING 'UTF8'
     LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8' DBCOMPATIBILITY 'ORA';
 \c "plan_sim"

 --@@ database

扫描 pg_database 系统表,获取数据库信息,然后构造出 CREATE 语句并输出。

总结

本文主要对“一键式现场信息收集工具”特性进行说明,通过对EXPLAIN关键字新增STATS选项,实现对复现现场场景所需信息的收集导出,并以此导出信息作为输入,以SQL语句的形式,执行后将现场信息导入本地集群。

2(4).png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。