• [其他] 【总结】DWS运维常用SQL
    DWS提供了丰富的接口、视图来用于查看和诊断当前集群的运行状况,为了提高运维效率,现整理一些比较常用的,供DBA、DWS运维人员参考。1. 查看用户及连接:连接数不够会导致业务大量报错,因此,有必要监控集群上各个CN上的连接数,确保其在正常范围内,集群内每个CN的最大连接数可以通过show max_connections得到,集群当前已使用的连接数可以用以下SQL查询。其中活跃连接指当前正在使用的连接,缓存连接指数据库内部连接池缓存的连接,这两种连接都会占用数据库连接数,因此都需要进行监控。活跃连接:select usename, count(*) from pgxc_stat_activity where usename != 'Ruby'  group by 1 order by 2 desc活跃+缓存连接:Select usename, count(*) from pgxc_stat_activity where usename != 'Ruby'  group by 1 order by 2 desc2. 查看活跃语句及执行时间:通过查看活跃语句及执行时间,可以找出当前运行时间较长的语句,分析是否有问题。Select now()-query_start,* from pgxc_stat_activity where state='active' and usename != 'Ruby' order by 1 desc;3. 查看锁等待情况:通过查看锁等待情况,可以找出当前出现锁冲突的SQL,并进行解决首先执行附件中locks.txt创建相关视图,然后执行以下视图查询锁等待情况。select * from pgxc_locks_wait;4. 查杀语句:通过查看活跃语句及执行时间,找到coorname和pid,例如cn_5001和139906305218304执行execute direct on (cn_5001) 'select pg_terminate_backend(139906305218304)';查看结果是否为true5. 查看库内所有表大小:通过以下SQL可以查看库内所有表大小。建议在表数量不多时使用,库内超过1000张表时,运行速度可能较慢。Select nspname, relname, pg_table_size(c.oid) from pg_class c, pg_namespace n where c.relnamespace = n.oid and c.relkind = 'r' order by 3 desc;6. 查看数据倾斜建议在表数量不多时使用,库内超过1000张表时,运行速度可能较慢。SELECT * FROM pgxc_get_table_skewness ORDER BY totalsize DESC;7. 查看库大小:select pg_database_size('your_database_name')8. 查看脏页率:DWS表数据在经过更新、删除后,会产生脏页,脏页会占用空间,需要使用vacuum full命令清理。通过以下命令可以检查脏页率情况。注意如果检查过程中有表被删除,此SQL可能报错,找其他时间重新运行即可。SELECT c.oid AS relid, n.nspname AS schemaname, c.relname,pg_stat_get_live_tuples(c.oid) AS n_live_tup,pg_stat_get_dead_tuples(c.oid) AS n_dead_tup,round(n_dead_tup * 100 / (n_live_tup + n_dead_tup+0.0001),2) AS dead_tup_ratioFROM pg_class cLEFT JOIN pg_index i ON c.oid = i.indrelidLEFT JOIN pg_namespace n ON n.oid = c.relnamespaceWHERE c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])GROUP BY c.oid, n.nspname, c.relnameorder by dead_tup_ratio desc;9. 查询系统内所有表行数:使用以下两步可以获取库中所有表实际行数,建议在表数量小于1000时使用,表数量较大时执行可能较慢。执行以下语句:select string_agg(a.v_sql,'union all ') from (select 'select '''||relname||''',count(*) from '||relname||' ' as v_sql from pg_class where relnamespace=2200 and relkind='r') a将执行结果拷贝到SQL执行窗口,进行执行。 
  • [其他] 【总结】【资源管理】工作负载管理实战
       一、   场景介绍当有多个数据库用户同时在DWS上执行SQL作业时,可能出现以下情况:1. 一些复杂SQL可能会长时间占用集群资源,从而影响其他查询的性能。例如一组数据库用户不断提交复杂、耗时的查询,而另一组用户经常提交短查询。在这种情况下,短时查询可能不得不在队列中等待耗时查询完成。2. 一些SQL由于数据倾斜、执行计划未调优等原因,占用过多内存空间,导致其他语句因申请不到内存而报错,或占用过多磁盘空间,导致磁盘满而触发集群只读,无法进行写入。为了提高系统整体吞吐量,避免坏SQL影响系统整体运行,可以使用DWS工作负载管理功能处理这类问题,DWS工作负载管理以工作负载队列为资源承载,对于不同的业务类型可以创建不同的工作负载队列,为这些队列配置不同的资源占比,然后将数据库用户添加至对应的队列中,以此来限制这些数据库用户的资源使用。例如,将经常提交复杂查询作业的数据库用户分为一类,为这类用户创建一个工作负载队列并给这个队列分配多一些的资源,之后将这类用户添加至这个队列中,那么这类用户所提交的复杂作业只能使用所创建队列拥有的资源;同时再创建一个占用资源较少的队列分配给执行短查询的用户使用,这样两种作业就能够同时执行互不影响。二、   框架介绍在实际业务运行中,系统压力可能集中在集群中的一部分节点或者系统资源中的某项资源,导致系统资源不能充分利用,集群性能不能充分发挥。因此,GaussDB(DWS)提供了基于用户资源池的资源管理功能,将不同类型的作业关联到不同的资源池分别管理,以实现系统资源(并发、CPU、内存、存储空间)的隔离和作业的异常处理,避免发生资源的不合理占用。工作负载管理支持配置的队列资源包含:并发、内存、CPU及磁盘空间,关联该队列的用户执行的所有作业均受队列资源限制。总体架构如下:三、   配置指南(一)        页面基本操作1.       进入工作负载管理步骤1:登录华为云或HCS首页,选择数据仓库服务跳转到DWS管理控制台。步骤2:在集群列表中单击需要访问“工作负载管理”页面的集群名称,例如DWS_openlab。步骤3:切换至“工作负载管理”页签。 在工作负载管理页面,您可以修改工作负载管理的全局配置,可以在工作负载管理页面添加、创建、修改工作负载队列,添加数据库用户至队列,也可以将队列中的某个数据库用户从队列中移除。负载管理页面添加、创建、修改工作负载队列,添加数据库用户至队列,也可以将队列中的某个数据库用户从队列中移除。此外,最新版本的DWS还支持工作负载队列资源的动态调整,用户可以指定任务计划,在不同时间段内为队列分配不同资源,来最大程度的利用系统资源。具体可见最佳实践案例二。工作负载管理页面概览如下。----结束2.      打开或关闭工作负载管理工作负载管理配置包括工作负载开关、全局最大并发数。这里的全局最大并发数指的是单个CN上的最大并发数,如果您通过工作负载开关关闭了工作负载管理功能,那么所有的工作负载管理功能将不再可用。3.      资源配置在“资源配置”一栏,您可以浏览当前工作负载队列的资源配置情况,包括“CPU资源(%)”、“内存资源(%)”、“存储资源(MB)”、“查询并发”。4.      设置异常规则在“异常规则”一栏,您可以浏览当前工作负载队列中的异常规则设置情况,异常规则允许您对队列中用户执行的作业做异常控制。5.      关联用户在“关联用户”一栏,您可以浏览当前工作负载队列中已关联的用户,且可以看到当前时间每个用户已使用的内存以及磁盘使用量,如下图所示。(二)        添加工作负载队列步骤1: 登录DWS管理控制台。步骤2: 在集群列表中单击需要访问“工作负载管理”页面的集群名称。步骤3: 切换至“工作负载管理”页签。步骤4: 单击工作负载队列旁的“+”符号添加队列。  步骤5: 参见表1-1填写工作负载队列的名称和相关资源配置。参数项描述取值名称工作负载队列的名称。queue_testCPU资源(%)队列中的数据库用户在执行作业时可使用的CPU时间片比例。20内存资源(%)队列所占用的内存百分比。  注意:当前版本的“内存资源(%)”与“查询并发”只有一个生效。20储存资源(MB)可使用的永久表空间大小。1024查询并发队列中的最大查询并发数。  注意:当前版本的“内存资源(%)”与“查询并发”只有一个生效。10显示添加工作负载队列:步骤6: 核对信息后,单击“确定”,添加队列完成。----结束(三)        修改工作负载队列在工作负载队列中,您可以对某个工作负载队列的参数进行修改。步骤1: 登录DWS管理控制台。步骤2: 在集群列表中单击需要访问“工作负载管理”页面的集群名称。步骤3: 切换至“工作负载管理”页签。步骤4: 在左侧“工作负载队列”中单击需要修改的队列名称,出现如下页面,包括“短查询配置”、“资源配置”、“异常规则”、“关联用户”。步骤5: 修改短查询配置。修改为相应取值,单击右侧“保存”。如果集群中运行的是查询业务,或查询跑批混合业务,建议开启短查询加速,并根据当前队列在每个CN上可能运行的最大短查询并发数来设置短查询并发。这样,在系统中占用内存小于32MB的短查询将会单独排队运行,不和跑批复杂查询一起排队,加快短查询响应速度。 参数项描述取值短查询加速 短查询加速开关,默认打开 打开短查询并发 短查询作业为执行估算内存小于32MB的查询作业,默认值"1"表示不管控。 10配置完成后点击保存:步骤6: 修改资源配置。1、单击右侧“编辑”,参见下表修改相应参数。参数项描述取值名称工作负载队列的名称。queue_testCPU资源(%)队列中的数据库用户在执行作业时可使用的CPU时间片比例。20内存资源(%)队列所占用的内存百分比。  注意:当前版本的“内存资源(%)”与“查询并发”只有一个生效。20储存资源MB)可使用的永久表空间大小。1024查询并发队列中的最大查询并发数。  注意:当前版本的“内存资源(%)”与“查询并发”只有一个生效。102、单击“确定”。步骤7: 修改异常规则。(1)参见表1-3修改相应参数。说明:异常规则允许您对队列中用户执行的作业做异常控制,目前支持下表的相关配置。– 如选择“终止”,则需要设置相应时间。– 如选择“不约束”,则无异常规则约束。参数项描述取值阻塞时间作业的阻塞时间,单位秒。包括全局并发排队以及局部并发排队的总时间。例如,如果配置“阻塞时间”为300秒,那么当该队列中的用户执行的某个作业在阻塞300秒后将会被杀死。1200执行所消耗时间作业的已被执行时间,单位秒。从开始执行到当前所消耗的时间。  例如,如果配置“执行所消耗时间”为100秒,那么当该队列中的用户执行的某个作业在执行超过100秒后将被杀死。2400所有DN上CPU总时间作业在所有DN上执行时所耗费的CPU总时间,单位秒。100检查倾斜率的时间间隔检查作业执行CPU倾斜率的间隔时间,单位秒,需同“所有DN上CPU时间的倾斜率”一起设置。2400所有DN上CPU总时间倾斜率作业在DN上执行时的CPU时间的倾斜率,依赖于“检查倾斜率的时间间隔”的设置。90(2)单击“保存”。步骤8: 关联用户。说明:● 一个数据库用户只有被添加到某个队列中之后,该用户运行作业所使用的资源才能被管控。● 一个数据库用户只能被添加至一个队列中,从队列中移除的用户可以再次添加至其他队列。(1) 单击右侧“添加”。(2)从当前用户列表中,勾选需要添加的用户,一次可勾选多个。(3)单击“确定”。(4)如果需要删除用户,则单击待删除用户所在行右边的“删除”即可。----结束(四)        查询概览步骤1: 登录DWS管理控制台。步骤2: 在集群列表中单击需要访问“工作负载管理”页面的集群名称。步骤3: 切换至“工作负载管理”页签。步骤4: 在左侧“工作负载队列”中单击需要查看的队列名称。在“查询概览”区域:可以看到当前时间当前队列中正在运行的长短查询数,图表信息15秒刷新一次。----结束(五)        删除工作负载队列步骤1: 登录DWS管理控制台。步骤2: 在集群列表中单击需要访问“工作负载管理”页面的集群名称。步骤3: 切换至“工作负载管理”页签。步骤4: 在左侧“工作负载队列”中单击需要删除的队列名称。步骤5: 单击右侧的“删除”。说明:删除队列时如果队列中有关联的数据库用户,那么队列删除后这些用户将被关联默认队列。(六)        资源限制相关参数除了页面提供的工作负载管理功能外,DWS也提供了一些guc参数,来限制单语句占用的最大资源,避免单个语句占用过多资源,导致系统不可用。1.       query_max_memory: 限制单语句在单DN上占用的最大内存量,如单语句分配内存超过这个值,将进行报错,将内存归还给系统。建议按如下方法配置:1)  登陆任意CN查询:execute direct on (dn_1) 'select * from pg_total_memory_detail where memorytype = ''max_dynamic_memory''';查出来的值即为单个DN上所有SQL可以使用的总内存。2)  建议根据业务并发数,将query_max_memory设置为上步查出总内存的1/2, 1/3,假设系统表发数较小(<20),可设置为1/2, 如为中大并发(>20),可设置为1/3。 2.     sql_use_spacelimit:限制单语句在单个DN上最大插入的数据量大小,如单语句在单个DN上插入数据量超过这个值,将进行报错,避免单个SQL在单个DN上插入的数据量过大,造成DN严重倾斜,导致性能差,及磁盘满问题。建议此参数设置为单DN可用总空间的1/5。 ----结束四、   最佳实践以下以两个实践案例来说明工作负载管理的实际应用。其中案例一为XX财政工作负载管理配置,可以作为小规模集群(一般小于50节点)混合业务场景下的配置参考。案例二为XX银行工作负载管理配置,可以作为中大规模集群联机查询和复杂跑批混合业务场景下的配置参考。注意其中的配置指标值均为根据具体业务要求而定,实施时需要根据现场实际需求确定。(一)    小规模集群:XX财政工作负载管理规划XX财政业务场景主要分为联机交易(OLTP)和报表分析(OLAP)两大类,其中报表服务的优先级相对较低,在合理的情况下优先保障业务系统的正常运行。XX财政节点规模较小,其工作负载管理目标为避免报表分析业务影响联机交易,其资源负载管理配置可供中小规模集群(<60节点)的数据集市、BI分析、小型数仓集群参考。业务系统中运行的SQL分为简单SQL和复杂SQL,大量复杂SQL的并发执行会导致数据库服务器资源争抢,简单SQL的大量并发对服务器不构成持续压力,短时间内可执行完成,不会造成业务堆积。其中报表服务中运行的SQL以复杂SQL居多,整体业务逻辑相对复杂,在数据库层面需要分别对核心交易和报表服务进行合理的资源管控,以保障业务系统正常运行。报表分析类业务的优先级和实时性相对较低,但是复杂度更高,为有效进行资源管控,将报表分析和核心交易业务进行数据库用户分离,例如核心交易业务使用数据库用户budget_config_user,报表分析业务使用数据库用户report_user。针对交易用户和报表用户分别进行CPU资源和并发数控制以保障数据库稳定运行。结合报表分析业务的负载调研、日常监控和测试验证,50并发以内的复杂报表SQL不会引起服务器资源争抢,不会引起业务系统卡慢,配置报表用户可使用20%的CPU资源。结合核心交易业务的负载调研、日常监控和测试验证,100并发以内的查询SQL不会对系统造成持续压力,配合交易用户可使用60%的CPU资源。l  交易用户资源配置:CPU=60%,并发=200,内存=60%,存储=1024000MB。l  报表用户资源配置:CPU=20%,并发=20,内存=20%,存储=1024000MB。l  设置单个语句最大内存使用量,超过使用量则报错退出,避免单个语句占用过多内存。 异常规则中设置阻塞时间=1200S,执行所消耗时间1800s,强制终止。(二)        中大规模集群:XX银行工作负载管理规划XX银行使用DWS作为银行核心数据仓库,每日运行批处理任务,也供业务用户进行一些灵活查询。为了更充分的利用系统资源,同时兼顾到各个类型业务的要求,根据DWS工作负载管理提供的能力,设计了XX银行工作负载管理方案。XX银行节点规模大,达240节点,其工作负载管理目标为合理调配多种业务占用的资源,达到资源利用效率的最佳配置,其资源负载管理配置可供中大规模集群(>60节点)的企业级数据仓库、行业云数据仓库参考。XX银行数据仓库中的任务可以分为以下三大类:1.      跑批任务。跑批任务是数据仓库内主要运行的任务,主要分为数据加载、批量加工和数据导出三类。其中,加载作业先运行,然后是批量加工作业,最后由数据导出作业将加工的结果同步到下游系统。加载作业主要在0:00~05:00运行,批量加工作业基本持续一整天,需要和其他类型任务一起综合考虑资源分配。导出任务主要在12:00~14:00运行。2.      业务用户灵活查询。业务灵活查询由业务分析师、数据挖掘工程师等发起,主要在上班时间内进行,即每天09:00~12:00, 14:00~20:00两个时间段。3.      运维任务(备份等)。运维任务主要是数据备份。当前XX银行数据备份采用的是GDS导出方案,主要在20:00~24:00运行。具体工作负载计划见下表所示: 因此,根据上述6类任务类型,划分6个队列,每个队列都可以在相应时间段内按照负载计划自动调整资源利用情况(自动调整资源功能需升级到最新版本才能使用),在每个时间段内分配不同的并发、CPU、内存资源,实现了不同时间段内作业优先级的动态调整,即保证了业务优先级,也使得系统总体资源利用最大化。同时,每个队列也根据业务实际需求分配了最大空间使用量。下图为相应的负载模型,将不同的用户加入到不同的队列中,来实现对用户占用资源的管控。此外,针对异常作业占用过多资源问题,XX银行也利用DWS异常处理功能,设置了丰富的异常SQL处理规则,见下表所示:       同时,为了避免单个语句占用过多磁盘、内存资源,也可以使用以下参数来对单语句使用的内存、磁盘空间资源进行限制。query_max_memory:限制单语句在单DN上占用的最大内存量,如单语句分配内存超过这个值,将进行报错,将内存归还给系统。XX银行单DN最大可用动态内存为100GB,并发数为60,query_max_memory设置为30GB。sql_use_spacelimit:限制单语句在单个DN上最大插入的数据量大小,XX银行单个DN可用磁盘空间为2TB,sql_use_spacelimit设置为400GB。 
  • [运维管理] 【Gaussdb 8.1.0】【主备同步】不同的主备同步状态
    【功能模块】【操作步骤&问题现象】集群发生主备切换后,在恢复的时候,不同的情况会出现不同的主备同步状态,如startingneed repair(disconnected)catcupbuilding这些不同的状态都是表示啥意思,是什么情况下才会出现的?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [运维管理] 【DWS 8.1.0】【base目录】base目录下面的数据库oid找不到
    【功能模块】【操作步骤&问题现象】在类似于如下目录/DWS/data3/h84dn3/primary0/base下面子目录17614,我理解这个是数据库的oid,然后进到对应集群后台,查询如下select oid,datname from pg_database,结果中没有oid为17614的数据库,这是怎么回事?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [运维管理] 【DWS 8.1.0】【集群环境】数据目录下的DN目录
    【功能模块】【操作步骤&问题现象】集群中每个节点4个DN,有data1,data2,data3,data4共四个数据目录,data1下有5个子目录data2下有4个子目录data3下有3个子目录data4下有4个子目录为什么是这种目录结构呢?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [实践系列] GaussDB(DWS)实践系列-数据仓库日常巡检策略总结
    【摘要】 为保证现网数据库稳定运行,需要进行日常例行巡检,以保障系统的软硬件处于良好的工作状态,并能够及时发现可能出现的问题,做好风险预警和问题处理。数据仓库日常巡检策略总结一、     摘要为保证现网数据库稳定运行,需要进行日常例行巡检,以保障系统的软硬件处于良好的工作状态,并能够及时发现可能出现的问题,做好风险预警和问题处理。二、     巡检内容介绍(一)检查数据库基本状况登录数据库后台,查询数据库集群状态和实例是否正常,Normal为正常状态。(二)检查数据库资源使用1、检查数据库连接登录数据库使用如下命令查询数据库连接数,查看数据库连接数是否超过设置的最大连接数的60%:select coorname,count(1)    from pgxc_stat_activity group by coorname;2、检查CPU使用top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器,查询结果如下:其中第三行%Cpu(s):  4.9 us,  2.4 sy,  0.0 ni, 92.6 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 stus:用户cpu使用率,反映用户进程CPU使用情况sy:系统cpu使用率,反应系统进程(函数调用等)CPU使用情况id:空闲CPU百分比,反应CPU是否繁忙。当id值大于50%时,数据库CPU资源充裕。3、检查磁盘空间为了防止磁盘占用超过90%,触发集群只读,需要确认磁盘空间占用在正常范围内,如果占用超60%,可以删除时间过久的备份文件,使用如下命令查询:df -h4、检查内存使用使用free  -g或者top命令查询内存使用情况,例如top命令:total:总内存free:空闲内存used:已使用内存buff/cache:缓存当free值大于50%时,数据库内存资源充裕。5、检查I/O使用使用iostat -xm 1 命令查询I/O使用情况:rMB/s:每秒读单位MBwMB/s:每秒写单位MBawait:io等待单位ms%util:磁盘使用率如果%util接近100%,表明I/O请求太多,I/O系统已经满负荷,磁盘可能存在瓶颈,一般%util大于70%,I/O压力就比较大,读取速度有较多的wait。 6、检查网络资源使用sar -n DEV 1命令查看网络资源使用情况。rxkB/s:每秒网络接收数据量单位kbtxkB/s:每秒网络发送数据量单位kb关注发送和接收的数据量是否达到网卡的瓶颈,例如万兆网卡瓶颈约为1G。(三)检查数据库备份结果例如将如下备份脚本加入到crontab定时任务中,每日凌晨3点归档到指定目录,需要定期检查备份脚本运行和备份文档的归档情况:import osimport commandsimport datetimeimport time env = 'source /opt/huawei/Bigdata/mppdb/.mppdbgs_profile;'dump_home = '/srv/BigData/mppdb/data2/gs_dump/'dump_log = '%sbackupdb.log' % dump_homecmdfile = '%sbackup_cmd.txt' % dump_homeif not os.path.isdir(dump_home):    cmd =   'mkdir -p %s' % dump_home    os.system(cmd) def log(msg,logfilefullpath):      os.system('echo "%s" >> %s' % (msg, logfilefullpath)) def exec_sql(sql):    cmd = '%s   gsql -d postgres -p 25308 -t -c "%s"' %  (env,sql)    (status,   output) = commands.getstatusoutput(cmd)    return   status,output def getalldb():    databases   = []    sql =   "select datname from pg_database where   datname='paas_basedateservice';"      status,output = exec_sql(sql)     if status   != 0 :          log(output,dump_log)     for i in   output.split('\n'):        if   i.strip() != '':              databases.append(i.strip())      log('database count is : %s' % len(databases),dump_log)    return   databases def exec_dump(databases,begin_date):    dump_dir =   '%s%s/' % (dump_home,datetime.datetime.now().strftime('%Y%m%d'))     if not   os.path.isdir(dump_dir):        cmd =   'mkdir -p %s' % dump_dir          os.system(cmd)       dumpallfile = '%sgs_dumpall_%s.sql' %(dump_dir,begin_date)    dumpalllog   = '%sgs_dumpall_%s.log' %(dump_dir,begin_date)      log('dumpall : start time is [%s]' % (   datetime.datetime.now().strftime('%Y%m%d%H%M%S')),dump_log)    cmd =   '%sgs_dumpall -s -g -p 25308 -f %s > %s 2>&1' %   (env,dumpallfile,dumpalllog)      log('--------------%s--------------'% begin_date,cmdfile)    log(cmd,   cmdfile)    os.system(cmd)      log('dumpall : end   time is   [%s]' % (datetime.datetime.now().strftime('%Y%m%d%H%M%S')),dump_log)     for db in   databases:          desfile = '%s%s_%s.sql' % (dump_dir,db,begin_date)          logfile = '%s%s_%s.log' % (dump_dir,db,begin_date)          log('dump database [%s] : start time is [%s]' %   (db,datetime.datetime.now().strftime('%Y%m%d%H%M%S')),dump_log)        cmd =   '%sgs_dump %s -p 25308 -C -F p -f %s > %s 2>&1' %   (env,db,desfile,logfile)          log(cmd,cmdfile)          os.system(cmd)          log('dump database [%s] : end     time is [%s]' % (db,   datetime.datetime.now().strftime('%Y%m%d%H%M%S')),dump_log) def main():    while   True:          current_time = datetime.datetime.now()        hour =   current_time.strftime('%H')          begin_date = current_time.strftime('%Y%m%d%H%M%S')          log('check time [%s]' % begin_date,dump_log)        if   hour == '03':              log('start time is %s' % begin_date,dump_log)              databases = getalldb()              exec_dump(databases,begin_date)              end_time = datetime.datetime.now().strftime('%Y%m%d%H%M%S')              log('end   time is %s' %   end_time,dump_log)          time.sleep(3600) if __name__ == '__main__':    main()(四)检查数据库性能1、      查询数据库锁信息如果 pgxc_thread_wait_status 视图wait_status有acquire lock状态,说明此sql存在锁冲突,通过以下语句查询锁冲突的sql。select query from   pgxc_stat_activity where query_id in(select query_id from   pgxc_thread_wait_status where query_id > 0 and wait_status like 'acquire   lock%');无法释放的锁的线程,可以使用SELECT  pg_cancel_backend(pid)命令释放。2、      识别未作analyze的表在数据库中,统计信息是规划器生成计划的源数据。没有收集统计信息或者统计信息陈旧往往会造成执行计划严重劣化,从而导致性能问题。以下命令能够查询表最近执行analyze的时间。SELECT n.nspname,pg_stat_get_last_analyze_time(c.oid)FROM pg_class cLEFT JOIN pg_namespace n ON n.oid = c.relnamespaceWHERE c.relkind = 'r'::"char" and c.relname='t1';3、      检查耗时久的SQL使用如下命令可以查询当前数据库中耗时TOP 20的SQL,可根据具体SQL进一步分析耗时久的原因。select   pid,coorname,datname,usename,application_name,(now()-query_start) as   queryruntime,(now()-xact_start) as   xactruntime,waiting,query_id,substr(query,1,80) as query from   pgxc_stat_Activity where state<>'idle'   and datname <>'postgres' order by xactruntime   desc,queryruntime desc limit 20;4、      检查有倾斜的表数据倾斜问题是分布式架构的重要难题,它破坏了各个节点对等的要求,导致单节点(倾斜节点)所存储或者计算的数据量远大于其他节点,所以会造成以下危害:存储上的倾斜会严重限制系统容量,在系统容量不饱和的情况下,由于单节点倾斜的限制,使得整个系统容量无法继续增长。      计算上的倾斜会严重影响系统性能,由于倾斜节点所需要运算的数据量远大于其它节点,导致倾斜节点降低系统整体性能。      数据倾斜还严重影响了分布式架构的扩展性。由于在存储或者计算时,往往会将相同值的数据放到同一节点,因此当倾斜数据(大量数据的值相同)出现之后,即使我们增加节点,系统瓶颈仍然受限于倾斜节点的容量或者性能。可参考如下脚本检查生产库中存在数据分布倾斜的表。#!/bin/bashresultdir=/opt/skewness_xunjian/check_result_`date   +%Y%m%d%p`mkdir $resultdirsource /opt/huawei/Bigdata/mppdb/.mppdbgs_profilegsql -d postgres -p   25308 -c "select datname from PG_DATABASE where datname!='template1' and   datname!='template0' and datname!='postgres'" | grep -v datname|grep -v   - | grep -v row > /opt/skewness_xunjian/databasenamewhile read i; do        if [[ -z $i ]]; then                continue        fi        gsql -d $i -p 25308 -c "select   t.tableowner, s.schemaname, s.tablename, (s.totalsize/1024/1024/1024)::int as   \"totalsize(GB)\", s.skewratio from pgxc_get_table_skewness s,   pg_tables t where s.schemaname=t.schemaname and s.tablename=t.tablename and   s.skewratio>=0.05 and s.totalsize>1*1024*1024*1024::bigint order by   s.skewratio desc;" > ${resultdir}/${i}_`date   +%Y%m%d%p`_result_filter.txtdone   </opt/skewness_xunjian/databasename5、      历史TOPSQL巡检定期对生产集群运行的SQL进行统计分析,可以识别低效SQL并推动优化整改,从而提升系统的整体性能。步骤1:抓取指定时间段,指定database的topsql并创建统计表。create table topsql_1930_2000s DISTRIBUTE BY HASH(queryid) asselect t.dbname,t.count,t.avg_duration,t.count*t.avg_duration as totaltime,t.max_duration,t.stream_count,t.subplan_count,t.queryid,p.query   from (selectsubstr(query,1,60) as sub_query,dbname,count(1) as count,round(avg(duration),2) as avg_duration,max(duration) as max_duration,public.stream_count(query_plan) as stream_count,public.subplan_count(query_plan) as subplan_count,max(queryid) as queryidfrom pgxc_wlm_session_infowhere dbname in('ch_yszx_gz','ch_bmys_xa','ch_pems')and start_time >'2020-05-12 19:30:00'and finish_time < '2020-05-12 20:00:00'group by 1,2,6,7having (count >0  ))t left join pgxc_wlm_session_info    p on t.queryid = p.queryid;步骤2:使用copy语句把统计表数据导出到服务器指定路径上,保存为csv格式。步骤3:通过ftp工具把topsql_1930_2000.csv文件取到本地分析topsql。针对耗时长、stream多的SQL进行分析优化。(五)检查数据库安全性登录数据库,通过审计日志查询client_conninfo,detail_info等信息,检查是否有异常IP登录或者异常操作。SELECT * FROM pg_query_audit('2020-06-10 08:00:00','2020-06-10 23:55:33'); 华为云社区论坛链接:https://bbs.huaweicloud.com/forum/forum-598-1.html
  • [实践系列] GaussDB(DWS)实践系列-业务表拆分显示策略分享
    【摘要】 XXX局点的数据库为全省集中部署,涉及到20000+业务数据表,且业务数据表全部放在一个schema下。为应对审计部门的核查,每季度需要将全省集中的生产数据库拷贝到汇总库中,再按照省市县约100+区划进行分离,实现A区划用户只有权限查看其本区划内的数据,其余区划信息均不可见,并且能够实现A区划数据的分离提取。GaussDB(DWS)-业务表拆分显示策略分享一、摘要XXX局点的数据库为全省集中部署,涉及到20000+业务数据表,且业务数据表全部放在一个schema下。为应对审计部门的核查,每季度需要将全省集中的生产数据库拷贝到汇总库中,再按照省市县约100+区划进行分离,实现A区划用户只有权限查看其本区划内的数据,其余区划信息均不可见,并且能够实现A区划数据的分离提取。二、解决方案(一)       需求分析客户需求大致如下图所示,业务表table1保存全省数据,现有区划A用户和区划B两个用户,为实现按区划显示和拆分,需要做到区划A用户仅能看到A区划的数据,例row1、row3、row5,而B区划数据对他不可见,并且能够实现A区划数据的分离提取。(二)       解决方案通过对客户业务表进行分析总结大致分为两类,一类具有明确的区划属性(含有province字段),一类不含区划属性,属于全省公共业务表。具有区划属性的业务表需要实现按区划显示和拆分,没有区划属性的业务表保存全省公共数据,对于每个区划均可见。步骤一:业务表分类业务数据表全部放在同一个schema下,例如‘schema_hxxt’,首先需要能够区分出哪些业务表具有区划属性,哪些业务表没有区划属性,可通过如下方式进行筛选。(1)具有区划属性的业务表筛选方式。SELECTn.nspname   AS schemaname,c.relname   AS tablename,pg_catalog.pg_get_userbyid(c.relowner)   as "Owner"FROM   pgxc_class xLEFT   join pg_class c on c.oid = x.pcrelidLEFT   JOIN pg_namespace n ON n.oid = c.relnamespaceWHERE   n.nspname ='schema_hxxt'AND   c.oid IN (SELECT   attrelid FROM pg_attribute WHERE attname = 'province'); (2)没有区划属性的业务表筛选方式。SELECTn.nspname   AS schemaname,c.relname   AS tablename,pg_catalog.pg_get_userbyid(c.relowner)   as "Owner"FROM   pgxc_class xLEFT   join pg_class c on c.oid = x.pcrelidLEFT   JOIN pg_namespace n ON n.oid = c.relnamespaceWHERE   n.nspname ='schema_hxxt'AND   c.oid NOT IN   (SELECT attrelid FROM pg_attribute WHERE attname = 'province'); 步骤二:用户访问控制          客户的需求核心是能够在不修改业务表结构的情况下,实现用户访问控制,考虑使用视图view来实现。各区划用户以“us+区划编码”命名,例如A区划的编码province为610000,A区划用户名设置为 “us610000”。视图view以“v_tablename”命名,例如业务表名为table1,对应视图命名为“v_table1”。如下表所示。区划名区划编码(province字段值)区划用户名业务表名视图命名A区划610000us610000table1v_table1table2v_table2table3v_table3B区划710001us710001table4v_table4table5v_table5table6v_table6 (1)  针对具有区划属性的业务表由于该类业务表中具有区划字段province,并且每个区划有全局唯一的区划编码,例如A区划的区划编码为610000,B区划的区划编码为710001。视图定义中通过将区划数据和登录的区划用户关联的方式,进行权限控制。视图定义设计如下:create   view v_table1 asselect   * from table1 where province=substr(current_user,3);(2)  针对没有区划属性的业务表由于该类业务表中没有区划字段province,各个区划用户均可访问全量的业务表数据,不需要按照区划进行访问控制。视图定义设计如下:create   view v_table2 as select * from table2;构造最小用例测试验证: --创建测试的业务用户 province_testCREATE USER province_test PASSWORD 'Bigdata123@'; --创建测试的数据库 db_test,属主为 province_testCREATE DATABASE db_test OWNER province_test ENCODING 'GBK' template =   template0; --创建区划用户,A区划us610000,B区划us710001create user us610000 identified by 'Bigdata123@';create user us710001 identified by 'Bigdata123@'; --创建含有province字段的业务表create table table1(province varchar(30),id int);create table table2(province varchar(30),id int);create table table3(province varchar(30),id int);--创建不含province字段的业务表create table table4(codename varchar(30),id int);create table table5(codename varchar(30),id int);create table table6(codename varchar(30),id int); --创建含有province字段业务表对应的用户访问控制视图create view v_table1 as select * from table1 where   province=substr(current_user,3);create view v_table2 as select * from table2 where   province=substr(current_user,3);create view v_table3 as select * from table3 where   province=substr(current_user,3);--创建不含province字段业务表对应的查询视图create view v_table4 as select * from table4;create view v_table5 as select * from table5;create view v_table6 as select * from table6; --插入业务数据insert into table1 values('610000',110);insert into table1 values('610000',111);insert into table1 values('610000',112);insert into table1 values('710001',113);insert into table1 values('710001',114);insert into table1 values('710001',115);insert into table1 values('710001',116); insert into table2 values('610000',210);insert into table2 values('610000',211);insert into table2 values('610000',212);insert into table2 values('710001',213);insert into table2 values('710001',214);insert into table2 values('710001',215);insert into table2 values('710001',216); insert into table3 values('610000',310);insert into table3 values('610000',311);insert into table3 values('610000',312);insert into table3 values('710001',313);insert into table3 values('710001',314);insert into table3 values('710001',315);insert into table3 values('710001',316); insert into table4 values('n610000',1110);insert into table4 values('n610000',1111);insert into table4 values('n610000',1112);insert into table4 values('n710001',1113);insert into table4 values('n710001',1114);insert into table4 values('n710001',1115);insert into table4 values('n710001',1116);insert into table4 values('n810002',1117);insert into table4 values('n810002',1118);insert into table4 values('n810002',1119); insert into table5 values('n610000',2210);insert into table5 values('n610000',2211);insert into table5 values('n610000',2212);insert into table5 values('n710001',2213);insert into table5 values('n710001',2214);insert into table5 values('n710001',2215);insert into table5 values('n710001',2216);insert into table5 values('n810002',2217);insert into table5 values('n810002',2218);insert into table5 values('n810002',2219); insert into table6 values('n610000',3310);insert into table6 values('n610000',3311);insert into table6 values('n610000',3312);insert into table6 values('n710001',3313);insert into table6 values('n710001',3314);insert into table6 values('n710001',3315);insert into table6 values('n710001',3316);insert into table6 values('n810002',3317);insert into table6 values('n810002',3318);insert into table6 values('n810002',3319); --使用业务用户 province_test为区划用户赋权grant select on v_table1 to us610000;grant select on v_table2 to us610000;grant select on v_table3 to us610000;grant select on v_table4 to us610000;grant select on v_table5 to us610000;grant select on v_table6 to us610000; grant select on v_table1 to us710001;grant select on v_table2 to us710001;grant select on v_table3 to us710001;grant select on v_table4 to us710001;grant select on v_table5 to us710001;grant select on v_table6 to us710001;初始化后的测试业务表和视图如下所示:通过视图可以实现用户访问控制,针对有区划属性的业务表,A区划用户仅能看到A区划对应的业务数据,其余区划的业务数据均不可见;针对没有区划属性的业务表,A区划用户可以全部业务数据,该方案能够满足客户的整体需求。步骤三:指定区划数据提取使用copy命令导出时需要赋予用户超户权限(must be system admin to COPY to or from a file)。--使用copy命令操作前,需要赋予区划用户例如us610000超户权限GRANT ALL PRIVILEGES TO us610000; --使用区划用户导出对应数据文件copy (select * from public.v_table1) to   '/srv/BigData/mppdb/data1/copy_table1_us610000.csv'with(format 'csv',header 'on',encoding 'gbk'); --使用区划用户导入对应数据文件copy public.table1 from   '/srv/BigData/mppdb/data1/copy_table1_us610000.csv'with(format 'csv',header 'on',encoding 'gbk'); --完成copy命令导出导入后,回收超户权限REVOKE ALL PRIVILEGES FROM us610000;步骤四:批量化脚本处理--有区划属性的视图批量创建\o /srv/BigData/mppdb/data1/create_view_command_province.sqlselect 'create view '||n.nspname||'.v_'||c.relname||' as select *   from '||c.relname||' where province=substr(current_user,3);' as   create_view_commandfrom pgxc_class xleft join pg_class c on c.oid = x.pcrelidleft join pg_namespace n on n.oid = c.relnamespacewhere c.oid in (select attrelid from pg_attribute where attname =   'province');\o --没有区划属性的视图批量创建\o /srv/BigData/mppdb/data1/create_view_command_noprovince.sqlselect 'create view '||n.nspname||'.v_'||c.relname||' as select *   from '||c.relname||';' as create_view_commandfrom pgxc_class xleft join pg_class c on c.oid = x.pcrelidleft join pg_namespace n on n.oid = c.relnamespacewhere c.oid not in (select attrelid from pg_attribute where attname =   'province');\o --区划用户使用copy命令批量导出\o /srv/BigData/mppdb/data1/copy_out_command.sqlselect 'copy (select * from '||vw.schemaname||'.'||vw.viewname||' where province = '''||substr(current_user,3)||''') to   '||'''/srv/BigData/mppdb/data1/'||substr(current_user,3)||'/copy_'||vw.viewname||'.csv'''||' with(format '||'''csv'''||',header   '||'''on'''||',encoding '||'''gbk'''||');' as as copy_out_commandfrom pg_views vw where vw.schemaname='public' and vw.viewname ~   '^v_.';\o --区划用户使用copy命令批量导入\o /srv/BigData/mppdb/data1/copy_in_command.sqlselect 'copy '||tb.schemaname||'.'||tb.tablename||' from  '||'''/srv/BigData/mppdb/data1/'||substr(current_user,3)||'/copy_v_'||tb.tablename||'.csv'''||' with(format '||'''csv'''||',header   '||'''on'''||',encoding '||'''gbk'''||');' as copy_in_commandfrom pg_tables tb where tb.schemaname='public';\o  --赋予区划用户的批量权限\o    /srv/BigData/mppdb/data1/grant_privileges.sqlselect 'grant select on v_'||tb.tablename||' to '||us.usename||';' as   grant_privilegesfrom pg_tables tb,(select usename from pg_user where usename ~   '^us.') uswhere tb.schemaname='public' order by us.usename,tb.tablename;\o --回收区划用户的批量赋权\o /srv/BigData/mppdb/data1/revoke_privileges.sqlselect 'revoke all privileges from '||us.usename||';' as   grant_privileges from pg_user us  where   usename ~ '^us.';\o【相关链接】GaussDB(DWS)-SQL语句上线验收指导:https://bbs.huaweicloud.com/blogs/188162数据仓库自动化清理功能实现:https://bbs.huaweicloud.com/blogs/175440数据仓库日常巡检策略总结:https://bbs.huaweicloud.com/blogs/175009GaussDB(DWS)-资源管控方案技术实战分享:https://bbs.huaweicloud.com/blogs/174637GaussDB(DWS)-性能优化最佳实践https://bbs.huaweicloud.com/blogs/195263华为云社区论坛链接:https://bbs.huaweicloud.com/forum/forum-598-1.html
  • [实践系列] GaussDB(DWS)实践系列-SQL语句上线验收操作指导
    【摘要】 为了最大限度提升应用开发人员的代码质量、减少业务SQL的性能风险、降低运维调优工作量,需要针对上线的SQL语句进行验收审核,并输出上线前验收Checklist,协助完成数据库开发规范自检。 SQL语句上线验收操作指导一、摘要为了最大限度提升应用开发人员的代码质量、减少业务SQL的性能风险、降低运维调优工作量,需要针对上线的SQL语句进行验收审核,并输出上线前验收Checklist,协助完成数据库开发规范自检。二、DML语句验收CheckList应用开发人员自检工作主要分为两个阶段,包括开发阶段和验收阶段:开发阶段:开发人员严格按照设计规范进行代码开发,并通过验收checklist中的排查方法和标准对所负责模块的SQL进行自检。验收阶段:业务人员进行系统全流程点击,根据第四章【附件3】的方法抓取TOP SQL,按照checklist排查方法验证是否符合验收标准,并汇总输出验收表,详细验收checklist如下所示: 三、DML语句验收标准DML(Data Manipulation Language数据操作语言),用于对数据库表中的数据进行操作。如:插入、更新、查询、删除,此处的DML语句还包括视图定义、存储过程中的SQL语句。标准1:执行下推&没有stream分布式数据库架构下需最大限度的降低查询时节点之间的数据流动,以提升查询效率,因此SQL语句执行要实现stream算子为0。可通过第四章【附件1】方式查看SQL语句执行计划,从而判断执行计划是否下推,以及是否含有stream算子。(一)判断执行计划是否下推 数据库后台根据第四章【附件3】的方法统计TOP SQL,如果TOP SQL中bxt_count列均为0,表示优化后没有不下推的SQL,验收通过。详细说明:如果执行计划中有Data Node Scan节点,那么此执行计划为不可下推的执行计划;如果执行计划中有Streaming节点,那么计划是可以下推的。下图执行计划信息(红色方框部分)可看出此SQL语句不能下推,这种场景需要分析并消除不下推的因素,具体可查看客户端连接的coordinator实例的日志信息辅助定位分析,并进行优化整改。 (二)判断执行计划是否含有stream算子数据库后台根据第四章【附件3】的方法抓取TOP SQL,如果TOP SQL中stream_count列均为0,表示优化后SQL不含有stream算子,验收通过。详细说明:执行计划中含有Streaming(type: Gather),如果Streaming(type: Gather)下面的计划信息中存在Streaming字符串信息,那么执行计划含有stream算子,否则不含stream算子。(1)如下是含有stream算子的计划(下面的红色方框部分含有Streaming字符串信息),需要进行SQL改写消除Stream算子。(2)如下是不含stream算子的执行计划(下面的红色方框部分不含Streaming字符串信息)。标准2:没有关联子查询数据库后台根据第四章【附件3】的方法抓取TOP SQL,如果TOP SQL中subplan_count列均为0,表示优化后没有关联子查询,验收通过。详细说明:当SQL语句存在不能提升的关联子查询时,执行计划中会显示SubPlan关键字,如下图所示。对于这种场景需要将关联子查询提升为跟父表的关联,消除SubPlan。标准3:有效使用索引关于索引,经常遇到的问题是缺乏索引、索引过滤效果不佳,这两类问题场景可通过第四章【附件2】方式查看SQL语句执行信息进行识别。(一)缺乏索引扫描命中率小于10%的SQL需要添加索引。如下执行信息中,从红色椭圆框可以看到表boss_t_fb_datasourceinfo过滤条件province = '610000' AND type = 'SELECT' AND year = 2019过滤掉2342条记录,最终输出0条记录,这种就是典型的缺乏索引的场景。(二)索引过滤效果不佳如下执行信息中,从红色椭圆框可以看到表epay_t_voucherreceive_log 经过索引index_pki_epay_voucherreceive_log_vouno扫描之后,还需要经过条件vtcode = '5106' AND voucherstatus = 1过滤掉118682个元组,最终输出393条元组,这种就是典型的索引过滤效果不明显的场景,需要进行索引优化。(三)高效索引特征高效索引一般会直接通过Index Cond命中绝大部分有效输出,体现在执行信息上为没有“Rows Removed by Filter:”输出,如下图所示。或者“Rows Removed by Filter:”后面跟的数字远小于对应算子在A-rows列的数据,或者“Rows Removed by Filter:”后面跟的数字非常小(例如调优经验参考值,该数字小于100)。标准4:避免冗余ORDER BY语句冗余ORDER BY场景主要出现在含有string_agg函数的SQL语句中,如下图所示,括号内的order by动作需要提升在父查询中,否则子查询的排序结果不能传递给父查询,会导致string_agg函数的输出出现非预期结果。标准5:SELECT FOR UPDATE语句必须在事物块中使用for update语句功能是在当前事务中对指定行进行加锁,事务提交后释放。该语句必须在事务块或者存储过程中使用,且锁会持续到事务结束。如果在事务块或者存储过程外使用,SQL语句执行完成之后相关锁就会自动释放,无法实现预期的锁效果。标准6:不能对复制表进行并发更新操作分布式场景下业界通用准则是将字典表(又称维度表)建成复制表,使用复制表可减少参与计算的线程数和减少网络数据交互,以提升查询性能。从业务上角度分析,这类表的数据相对稳定,通常对这类数据进行只读操作,仅当基础信息发生变更时才会由业务维护人员对字典表进行修改。因此从数据特征上讲,复制表不会发生并发更新动作,如果存在并发更新场景,就需要考虑复制表的设计是否合适。标准7:递归调用语句必须存在递归终结条件建议谨慎使用递归语句(WITH RECURSIVE),使用WITH RECURSIVE的时候一定要注意递归调用的终止条件,确保递归可终止,否则会进入死循环,导致内存耗尽或者下盘文件撑爆磁盘空间,最终导致集群不可用。如下语句中,如果存在满足多条记录的superguid和guid成环的场景(比如表gl_t_account_subject中满足条件code = '2011' AND acctsystypeguid = 'DCD3A09596DF4B339F3406107871A7B4' AND province = '610324' AND year = 2020的记录的superguid和guid相等),就会导致递归调用陷入死循环,中间结果下盘导致磁盘空间被占满。WITH   RECURSIVE result AS(    SELECT        guid, code, name, superguid,   province, year    FROM gl_t_account_subject    WHERE code = '2011'    AND acctsystypeguid =   'DCD3A09596DF4B339F3406107871A7B4'    AND province = '610324' AND year = 2020    UNION ALL    SELECT        k.guid, k.code, k.name, k.superguid,   k.province, k.year    FROM gl_t_account_subject k    INNER JOIN result c    ON c.superguid = k.guid    WHERE k. acctsystypeguid = 'DCD3A09596DF4B339F3406107871A7B4'    AND k.province = '610324'    AND k.year = 2020)SELECT      guid, code, nameFROM   resultWHERE   province = '610324' AND year = 2020ORDER   BY code ;四、附件附件1:查看执行计划查看SQL执行计划时,仅需在SQL语句前面加上explain关键字,在数据库中执行就会输出SQL语句的执行计划(不会导致SQL语句的实际执行)。explainSELECT   *FROM epay_vw_pay_voucher_billWHERE billno =   '6100001022204000007'AND province = '610000' AND   year = 2019;附件2:查看执行信息添加explain关键字会显示SQL执行计划,但并不会实际执行sql语句,explain analyze会实际执行sql语句并返回执行信息。查看执行信息时,需要在SQL语句前面加上explain analyze关键字,在数据库执行就会输出SQL语句的实际执行信息,每一个步骤为一个数据库运算符。explain analyzeSELECT   *FROM epay_vw_pay_voucher_billWHERE billno =   '6100001022204000007'AND province = '610000' AND   year = 2019;附件3:统计TOP SQL为了保障系统稳定运行,SQL上线前都需要覆盖检查和优化,避免因不规范SQL导致系统运行卡顿或资源耗尽。因此,需要增强巡检和校验手段,识别出耗时、高频、后台临时线程较多等需优化的TOP SQL,并进行整改,测试后再上线使用,为测试充分性增加一道防护网。本小节内容指导应用开发人员进行TOP SQL统计收集。(一)开启SQL统计参数开启SQL统计功能,然后进行业务连跑,数据库后台会自动记录SQL执行信息,业务连跑结束之后,查询active SQL视图,获取SQL执行信息,查找耗时、高频、后台临时线程较多等需优化的TOP SQL进行重点优化分析。登陆任一数据节点,切换到omm用户,执行如下命令开启active SQL统计功能。gs_guc reload -Z datanode -Z coordinator -N all -I all -c "enable_resource_track = on"gs_guc reload -Z datanode -Z coordinator -N all -I all -c "enable_resource_record = on"gs_guc reload -Z datanode -Z coordinator -N all -I all -c "resource_track_level = query"gs_guc reload -Z datanode -Z coordinator -N all -I all -c "resource_track_cost = 100"gs_guc reload -Z datanode -Z coordinator -N all -I all -c "resource_track_duration = 0"(二)TOP SQL收集1、准备工作(1)更新统计信息在数据库中,统计信息是规划器生成计划的源数据。没有收集统计信息或者统计信息陈旧往往会造成执行计划严重劣化,从而导致性能问题。检测前需要进行全库统计信息收集。通过执行ANALYZE语句可收集与数据库中表内容相关的统计信息,统计结果存储在系统表PG_STATISTIC中,查询优化器会使用这些统计数据,以生成最有效的执行计划,以对postgres库执行analyze操作为例执行如下命令,其余数据库仅需修改-d后面的库名即可。gsql -d postgres -p 25308 -c ‘analyze’ (2)统计表初始化如果在检测前active SQL功能已经打开,需要执行以下动作清理历史SQL统计信息。gs_ssh -c “gsql -d postgres -p 25308 -c ‘delete from gs_wlm_session_info’”gsql -d postgres -p 25308 -c ‘vacuum full gs_wlm_session_info’2、获取TOP SQL列表按照本章第1小节完成操作前准备,执行如下函数进行SQL检测,统计出TOP SQL。(1)脚本准备a.筛选subplan登陆postgres数据库创建如下存储过程,统计执行计划中的subplan数量。CREATE OR REPLACE FUNCTION public.subplan_count(text) RETURNS integer LANGUAGE sql IMMUTABLE STRICT NOT FENCEDAS $function$    select ((length($1) -   length(replace($1, 'SubPlan', '')) )::int / length('SubPlan'))::int$function$;b.筛选Stream算子登陆postgres数据库创建如下存储过程,统计执行计划中的Stream算子数量。CREATE OR REPLACE FUNCTION public.stream_count(text) RETURNS integer LANGUAGE sql IMMUTABLE STRICT NOT FENCEDAS $function$    select ((length($1) -   length(replace(replace($1, 'Streaming(type: B', ''), 'Streaming(type: R',   ''))) / length('Streaming(type: B'))::int$function$;   C.筛选不下推SQL   登录postgres数据库创建如下存储过程,如果存储过程调用结果大于0,则该SQL为不下推SQL。CREATE OR REPLACE FUNCTION public.bxt_count(text) RETURNS integer LANGUAGE sql IMMUTABLE STRICT NOT FENCEDAS $function$    select ((length($1) -   length(replace($1, '_REMOTE_TABLE_QUERY_', '')) )::int /   length('_REMOTE_TABLE_QUERY_'))::int$function$; (二)统计TOP SQL登陆postgres数据库,通过sql语句统计Topsql列表。selectsubstr(query, 1, 60) as   sub_query,                                --截取sql语句的1-60字段进行分组统计       dbname,                                             --数据库名       count(1) as count,                                      --sql调用频次       round(avg(duration), 2) as   avg_duration,                    --sql平均执行时间                       public.stream_count(query_plan) as   stream_count,            --统计执行计划中stream算子数          public.subplan_count(query_plan) as   subplan_count,          --统计执行计划中subplan个数  public. bxt_count (query_plan) as bxt_count,                 --统计执行计划中不下推次数        max(queryid)   as query_id                                       --根据queryid查询具体SQL  from pgxc_wlm_session_info   where dbname in ('chw_pems')                                 --数据库名   and start_time > '2020-03-15   19:00:00'                         --开始时间   and finish_time < '2020-03-15   20:00:00'                        --结束时间group by 1,2,5,6,7having(stream_count > 0   or subplan_count > 0 or bxt_count>0)               order by stream_count desc;SQL查询结果如下:上述步骤截取sql语句的前60个字符,可根据queryid(图中max列信息) 查询完整的sql语句。--使用上例sql查出来TOP SQL的queryid,查询完整的sql语句select query from  pgxc_wlm_session_info where   queryid='xxxxx';华为云社区论坛链接:https://bbs.huaweicloud.com/forum/forum-598-1.html
  • [实践系列] GaussDB(DWS)实践系列-性能优化最佳实践
    【摘要】 项目交付过程中可能会遇到系统响应慢、用户体验差等性能问题,影响客户感知和工作效率。系统性能优化的目的是通过调整系统软硬件配置、参数优化、架构优化、SQL优化等手段,使系统能高效的运行,提升用户的满意度,本文旨在通过常规手段的介绍给大家提供一些思考和启发。 GaussDB(DWS)性能优化最佳实践一、摘要项目交付过程中可能会遇到系统响应慢、用户体验差等性能问题,影响客户感知和工作效率。系统性能优化的目的是通过调整系统软硬件配置、参数优化、架构优化、SQL优化等手段,使系统能高效的运行,提升用户的满意度,本文旨在通过常规手段的介绍给大家提供一些思考和启发。二、系统卡慢原因分析引起系统性能卡慢的常见原因有以下几点:       (1)部分业务实现逻辑存在问题:例如系统存在很多冗余逻辑,额外增加了系统的复杂度和资源消耗。(2)SQL代码质量不高:例如缺少索引、子查询过多、不合理递归等。(3)数据库内核对个别场景的支撑能力不足:例如TP型数据库在AP场景处理方面存在不足。(4)服务器硬件资源配置不足:例如客户部分老系统运行10年以上,前期规划的硬件资源因为数据膨胀等原因已经不堪重负,出现硬件资源瓶颈。(5)无法进行合理的资源管控:因为业务要求或者数据库能力等原因,无法进行合理的资源管控,导致业务高峰期资源抢占严重,大面积业务出现卡慢甚至不可用。(6)应用厂商测试不充分,生产存在大量漏测场景:因为应用厂商的能力和态度等原因,在前期性能测试时场景考虑不充分,遗漏大量可能的高并发场景,导致系统上线后出现性能瓶颈。(7)其他包括云平台和微服务等配置因素:因为云平台和微服务等配置不当(过小),导致系统整体性能下降。(8)日常运维工作不到位:例如生产环境周期性的进行垃圾和统计信息更新,并且针对历史数据进行归档,为系统减负。三、系统性能优化浅谈系统性能优化往往需要结合客户要求、业务场景、多管齐下制定系统性能优化方案。可通过以下几点优化方向综合考量,并制定合理的优化策略。优化策略如下表所示: 详细措施和实施策略如下: 资源管控配置参考:资源管控方案技术实战分享 https://bbs.huaweicloud.com/blogs/174637标准参考SQL语句上线验收指导相关内容:https://bbs.huaweicloud.com/blogs/188162四、参考链接SQL语句上线验收指导:https://bbs.huaweicloud.com/blogs/188162数据仓库自动化清理功能实现:https://bbs.huaweicloud.com/blogs/175440数据仓库日常巡检策略总结:https://bbs.huaweicloud.com/blogs/175009资源管控方案技术实战分享:https://bbs.huaweicloud.com/blogs/174637华为云社区论坛链接:https://bbs.huaweicloud.com/forum/forum-598-1.html
  • [实践系列] GaussDB(DWS)实践系列-资源管控方案技术实战分享
    【摘要】 资源管控的目的是基于业务场景和可用资源,进行合理的资源与并发度管控,以保障数据库可以在高负载场景下正常运行,不会因为资源争抢和耗尽出现系统卡死,提升系统整体吞吐量。 一、摘要   项目交付中可能会遇到同时包含核心交易(OLTP)和报表分析(OLAP)的混合业务场景,其中报表分析类业务复杂度高,消耗大量系统资源,但实时性要求较低,而核心交易类业务并发较大,多为简单事务处理,对实时性要求高。当系统处于业务高峰时,报表分析类业务并发操作会加剧系统负载,且长时间占用资源无法释放,最终可能导致整体性能裂化,实时性要求较高的核心交易类业务因资源争抢而无法得到响应,从而影响客户整体体验。   资源管控的目的是基于业务场景和可用资源,进行合理的资源与并发度管控,以保障数据库可以在高负载场景下正常运行,不会因为资源争抢和耗尽出现系统卡死,提升系统整体吞吐量。二、场景分析    如上图所示,业务场景主要分为核心交易(OLTP)和报表分析(OLAP)两大类,其中报表服务的优先级相对较低,在合理的情况下优先保障业务系统的正常运行。   业务系统中运行的SQL分为简单SQL和复杂SQL,大量复杂SQL的并发执行会导致数据库服务器资源争抢,简单SQL的大量并发对服务器不构成持续压力,短时间内可执行完成,不会造成业务堆积。其中报表服务中运行的SQL以复杂SQL居多,整体业务逻辑相对复杂,在数据库层面需要分别对核心交易和报表服务进行合理的资源管控,以保障业务系统正常运行。三、方案规划(一)       静态资源池规划   静态资源池可以控制数据库能使用服务器资源的上限,由于服务器操作系统运行也需要消耗一定的资源,因此预留一定的服务器资源来保障操作系统的正常运行。推荐静态资源池配置:数据库分配93% CPU资源和70% 内存资源。这样可以保证服务器能够正常响应系统请求。l  静态资源池分配93% CPU资源和70% 内存资源。(二)       交易用户和报表用户分离   报表分析类业务的优先级和实时性相对较低,但是复杂度更高,为有效进行资源管控,将报表分析和核心交易业务进行数据库用户分离,例如核心交易业务使用数据库用户budget_config_user,报表分析业务使用数据库用户report_user。针对交易用户和报表用户分别进行CPU资源和并发数控制以保障数据库稳定运行。   结合报表分析业务的负载调研、日常监控和测试验证,20并发以内的复杂报表SQL不会引起服务器资源争抢,不会引起业务系统卡慢,因此配置报表用户最多使用20%的CPU资源。   结合核心交易业务的的负载调研、日常监控和测试验证,50并发以内的复杂SQL不会对系统造成持续压力,整体CPU负载小于60%。l  交易用户分配60%的CPU配额和50并发。l  报表用户分配20%的CPU限额和20并发。其中CPU配额是指占用CPU时间片的百分比。若分配给某个用户的CPU配额资源未使用,系统会自动将这些资源共享给其他用户。CPU限额是指用户可以使用的CPU核数的百分比。系统会将百分比换算成具体的核数供用户使用,且用户可使用的CPU限额资源不超过通过百分比换算的核数范围。(三)       并发管控阈值设置   资源管控的并发控制是基于SQL的cost值(SQL执行代价)来评估,结合客户场景、硬件配置和SQL测试分析,当SQL的cost值小于1000时,SQL并发对服务器不构成持续压力,短时间内可执行完成,不会造成业务堆积。当SQL的cost值大于1000时,大量并发会导致服务器资源争抢,引起系统卡慢。因此将受控SQL的cost的临界值设置为1000。当SQL的cost值大于1000时受资源管控的并发度控制,当SQL的cost值小于1000时不受资源管控的并发度控制。l  区分SQL复杂和简单的cost值设置为1000四、实施方案(一)       配置静态资源池l  登录运维管理页面,配置静态服务池,设置cpu为93%,内存为70%(二)       数据库用户分离  创建交易用户(budget_config_user)和报表用户(report_user)。(三)       配置cgroup  使用omm用户登录数据服务器,执行如下命令设置CPU配额:source /opt/huawei/Bigdata/mppdb/.mppdbgs_profilegs_ssh -c "gs_cgroup -c -S class1 -s   60"gs_ssh -c "gs_cgroup -c -S class1 -G wg1 -g   99"gs_ssh -c "gs_cgroup -c -S class2 -s 20   "gs_ssh -c "gs_cgroup -u -S class2 -s 20   --fixed"gs_ssh -c "gs_cgroup -c -S class2 -G wg2 -g   99 "(四)       创建资源池并绑定cgroup  使用omm用户登录数据库服务器,执行如下命令设置并发管控:source /opt/huawei/Bigdata/mppdb/.mppdbgs_profilegSQL -d postgres -p 25308 -c "create   resource pool rp1 with   (mem_percent=0,active_statements=50,control_group='class1:wg1');”gSQL -d postgres -p 25308 -c "create   resource pool rp2 with (mem_percent=0,active_statements=20,control_group='class2:wg2');"(五)       用户绑定资源池  使用omm用户登录数据库服务器,执行如下命令将用户绑定资源池:source /opt/huawei/Bigdata/mppdb/.mppdbgs_profilegSQL -d postgres -p 25308 -c "alter user budget_config_user   resource pool 'rp1';"gSQL -d postgres -p 25308 -c "alter user report_user resource   pool 'rp2';"(六)       修改数据库参数并重启生效  使用omm用户登录数据库服务器,执行如下命令修改数据库参数:source /opt/huawei/Bigdata/mppdb/.mppdbgs_profilegs_guc reload -Z coordinator -Z datanode -N all   -I all -c "parctl_min_cost=1000"gs_guc set -Z coordinator -Z datanode -N all -I   all -c "enable_dynamic_workload=off"cm_ctl stopcm_ctl start五、资源管控测试验证(一)       测试SQL样例select count(1) from p#fasp_t_glctrl122299 a,p#fasp_t_glctrl122299   b;打印执行计划如下,cost值大于1000,已按方案设置资源管控的并发控制阈值cost为1000:(二)       交易用户并发验证l  使用交易用户budget_config_userl  使用测试SQL样例(cost值大于1000)l  启动100并发测试使用budget_config_user进行100并发样例SQL验证,当并发数达到50时管控,超过50并发后剩余SQL在管道内排队等待执行。(三)       报表用户并发验证l  使用报表用户report_userl  使用测试SQL样例(cost值大于1000)l  启动100并发测试使用report_user进行100并发样例SQL验证,当并发数达到20时管控,超过20并发后剩余SQL在管道内排队,等待执行。(四)       报表用户和交易用户同时并发验证l  分别使用交易用户budget_config_user和报表用户report_userl  使用测试SQL样例(cost值大于1000)l  分别启动100并发测试使用budget_config_user和report_user分别进行100并发样例SQL验证,交易用户并发50受控,报表用户并发20受控。(五)       报表用户限额CPU验证l  使用报表用户report_userl  使用测试SQL样例(cost值大于1000)l  启动100并发测试CPU限额设置20%,使用report_user进行100并发样例SQL验证,CPU使用达到20%时进行资源管控。CPU限额设置30%,使用report_user进行100并发样例SQL验证,CPU使用达到30%时进行资源管控。(六)       交易用户配额CPU验证l  使用交易用户budget_config_userl  使用测试SQL样例(cost值大于1000)l  启动100并发测试在配额60%CPU的情况下,CPU使用可以超过60%,不进行CPU强制限制(这点与限额不同),业务高峰时可以根据业务情况弹性扩展。华为云社区论坛链接:https://bbs.huaweicloud.com/forum/forum-598-1.html
  • [实践系列] GaussDB(DWS)实践系列—关于释放磁盘异常占用空间的经验总结
    【摘要】 集群在运行过程中,可能会出现部分节点目录的磁盘使用率偏高,并且仍在不断增长的情况,如果不及时处理可能会因为磁盘使用率超限而影响集群正常运行。例如使用df –h查看到某个目录的磁盘使用率达到70%,远高于集群内的其他节点,但是使用du –sh命令查看对应目录并未发现异常占用磁盘空间的大文件。针对上述情况,就需要排查可能是哪个进程占用了已经被删除了的文件句柄,导致磁盘空间并未真正释放。本文档主要介绍如GaussDB(DWS)运维的那些事?——关于释放磁盘异常占用空间的经验总结一、   摘要        集群在运行过程中,可能会出现部分节点目录的磁盘使用率偏高,并且仍在不断增长的情况,如果不及时处理可能会因为磁盘使用率超限而影响集群正常运行。例如使用df –h查看到某个目录的磁盘使用率达到70%,远高于集群内的其他节点,但是使用du –sh命令查看对应目录并未发现异常占用磁盘空间的大文件。针对上述情况,就需要排查可能是哪个进程占用了已经被删除了的文件句柄,导致磁盘空间并未真正释放。本文档主要介绍如何通过清理残留进程,释放被异常占用的磁盘空间。二、   原因说明(一)   Linux异常占用磁盘空间情况说明        在Linux操作系统中,当一个文件被删除后,在文件系统目录中已经不可见了,所以du就不会再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,所以df 命令查看磁盘占用没有减少。本文主要通过排查清理此类的残留进程,释放磁盘空间。(二)   lsof命令说明        lsof是linux下用于查看打开的文件以及相关关联进程信息的工具,执行lsof,将输出系统中打开文件的信息,包括与文件关联的进程的名字、进程pid、用户、目录、socket套接字、和命名管道等。使用该工具来查找残留进程。三、   操作实践        在巡检时发现节点10.77.20.XXX的根目录‘/’磁盘使用率达到 49%,明显高于其他节点,使用 du -sh * 命令查看该目录文件,未发现有大文件占用磁盘空间。考虑到可能存在未知进程占用文件句柄,导致磁盘空间异常。需要运用lsof工具查看相关关联进程占用已经删除的文件句柄信息。使用命令lsof | grep deleted 命令获取已经被删除但是仍然被应用程序占用的文件列表。考虑到文件列表行数过多,包含其他目录文件信息,不便于筛选定位,将其导入到文件中进行查找。参考命令:lsof | grep deleted > deleted_info.log过滤其他目录信息参考命令:cat deleted_info.log | grep -v "/srv/BigData/mppdb "  > new2.log最终定位到一个残留的bash 进程,占用文件句柄,且该目录下无法找到该文件。判断是此进程占用了文件句柄,导致磁盘异常占用,应及时清理该残留进程。清理定位到的残留进程参考命令:kill -9 53249  (对应进程的pid)使用df -h命令再次查看磁盘空间,‘/’目录磁盘空间使用率从49%降为18%:四、   总结延伸  从释放异常占用磁盘空间的操作过程分析,由于前期运维人员在删除过期文件时忽略了该文件是被进程占用的情况,删除了文件却没有重启或清除进程所导致的。因此在linux系统中删除累积性文件时可以使用lsof命令查看一下文件是否有被进程占用,在删除文件后可以重启或清除相关进程,避免产生磁盘空间异常占用,为日后维护带来不便。
  • [技术干货] 【8大场景系列】玩转数仓运维,做个不秃头的DBA
    【摘要】为了让DBA们通宵加班找故障将成为过去式,减少运维工作量,我们针对华为云数仓GaussDB(DWS)的运维整理了八大系列内容,尽我们最大的可能帮您解决数仓和应用技术转型中遇到的实际问题,让DBA玩转数仓运维“不秃头”。       每一个奋斗在前线的DBA似乎运气都不太好,他们都经历过的诡异事件大概率是:逢年过节必出故障。眼看着要放假了,又接到故障通知,只好通宵加班找问题。没问题的时候可能大家都不会想到你,一出问题就先拿运维试问,于是每逢佳节便出现拜数据仓库的戏谑图片。      为了让DBA们加班找故障成为过去式,减少运维工作量,我们选取容灾、负载管理、数据上云等典型运维场景,围绕华为云数仓GaussDB(DWS)多源数据融合分析、计算/存储资源规划、业务连续性的数仓高可用等核心技术,流式数据入库、集群管理、时区调整、扩容等运维技巧,帮助您解决实际业务运维场景中遇到的问题,让DBA玩转数仓运维“不秃头”。负载管理:让“笨”的数仓“聪明”起来  从四个核心技术为你解密,数仓GaussDB(DWS)负载管理功能如何做好计算/存储资源的划分,让你的数仓“聪明”起来。  GaussDB(DWS)负载管理核心技术解密一:全景图及解决的场景  GaussDB(DWS)负载管理核心技术解密二:白话历史资源监视  GaussDB(DWS)负载管理核心技术解密三:工作负载管理测试分析  GaussDB(DWS)负载管理核心技术解密四:工作负载计划解密保障业务连续性,GaussDB(DWS)高可用有妙招  数仓GaussDB(DWS)所有内部组件CN、DN、GTM、CM等采用多活或主备设计,通过集群管理进行故障检测和切换。在硬件层面,除了最基本的宕机、断网的直接故障外,GaussDB(DWS)还针对夯死、慢节点、亚健康等僵而不死的复杂场景,做了大量的建模和针对性优化,能够实现故障的准确探测和自愈。并且还提供了双集群容灾能力,通过跨AZ、跨Region的物理复制,实现异构集群容灾。  GaussDB(DWS)高可用之数据复制  GaussDB(DWS)高可用之备机重建  GaussDB(DWS)高可用之CN&GTM组件高可用介绍  GaussDB(DWS)高可用之主备从HA技术  GaussDB(DWS)高可用之单点故障业务不中断  华为云GaussDB(DWS)数据仓库以2048大规模节点通过信通院评测认证全方位案例解读数仓数据融合  数仓GaussDB(DWS)采用一套SQL引擎,支持Oracle、MySQL、HDFS等多源数据融合分析,并通过算子下推、加速集群等技术对分析性能进行了大幅优化,在数据免搬迁的前提下,实现了跨源数据免搬迁、高效分析。  GaussDB(DWS)数据融合:提升企业掌握数据之力数据上云是趋势,DBA掌握云端运维是关键  数仓未来是云,越来越多企业面临数仓和应用技术转型,云端运维成数仓运维需要掌握的核心。DWS提供了简单易用的Web管理控制台,帮助您快速创建数据仓库集群,轻松执行数据仓库管理任务。  GaussDB(DWS)云端运维系列手敲代码实践展示GaussDB(DWS)流式数据入库的三种方式  随着金融风控,以及IoT场景对数据实时处理分析的诉求,DWS实时数仓时序数据单机入库性能达10w/s,流数据达60w/s,并能够线性扩展,并且GaussDB(DWS)流式数据可通过Python、C和Java三种接口,让入库全程无忧。  GaussDB(DWS)流式数据入库实践[数仓性能调优从掌握最基本命令开始,十八般武艺轻松搞定数仓性能调优]  数仓性能调优是数仓应用开发和迁移过程中的关键步骤,在整个项目实施过程中占据很大的份量。它没有明确的衡量标准和对错之分,考验的是资深一线技术人员的隐式技能。开发者可通过该系列文章了解数仓的基本原理,然后结合调优思路,对各个调优技巧进行深入的学习。  数仓性能调优必读:从系统级到SQL级,带你进阶为性能调优高手一手掌握GaussDB(DWS)集群运维  数仓GaussDB(DWS)现网运行的PB级数据量以上的大集群已经有10+个,最大商用单集群规模达到240节点。在产品能力上,GaussDB(DWS)可扩展至2048节点,并且该规模在12月已通过信通院的权威评测。另外,还实现了逻辑集群特性,一套物理集群可针对不同业务划分多个逻辑集群,数据相互隔离,支持跨逻辑集群的计算资源调动。通过逻辑集群,可以进一步扩展集群的规模。该系列从基本概念到核心功能,带你了解集群管理、通信等方面的应用之道。  GaussDB(DWS)集群管理系列  GaussDB(DWS)集群通信系列  GaussDB(DWS)逻辑集群系列这份GaussDB(DWS)基础运维知识,你要收藏  从理论到升级案例,带你掌握GaussDB(DWS)升级、扩容面临的疑难问题。  GaussDB(DWS)升级问题定位指南  GaussDB(DWS)扩容问题定位指南  GaussDB(DWS)时区相关知识  数字化浪潮汹涌而来,在5G、云、AI加持下,数仓不断升级演进,激发千行百业的创新和数字化转型。企业DBA更应该从传统的“数据保管人和数仓守护者”角色进行转变。在数仓的易操作、便捷维护等基础上,DBA需要更多地理解业务,用数据回答来自业务方面的诉求,而不仅仅是维护数仓的健康稳定运行,这真的是DBA们的机遇所在。【推荐阅读】【最新活动汇总】DWS活动火热进行中,超多互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [萌新手册] 【最全资料汇总】如何在方案中采用数仓Gauss(DWS),你要的都在这里
          数据仓库服务(Data Warehouse Service,简称DWS)是完全托管的企业级云上数据仓库服务,具备免运维、在线扩展、高效的多源数据加载能力,兼容PostgreSQL生态。助力企业经济高效地对海量数据进行在线分析,实现数据快速变现。分类说明文档名材料链接产品介绍数据仓库DWS介绍DWS主打胶片线下材料,刷线后上线视频介绍https://support.huaweicloud.com/productdesc-dws/dws_01_0002.html快速入门材料https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXD023+Self-paced/about最佳实践https://support.huaweicloud.com/bestpractice-dws/dws_05_0047.html购买数据仓库DWS购买数据仓库服务主页面https://www.huaweicloud.com/product/dws.html使用连接访问管理控制台方式https://console.huaweicloud.com/dws/?locale=zh-cn&region=cn-north-4#/dws/management/listJDBC或ODBChttps://console.huaweicloud.com/dws/?locale=zh-cn&region=cn-north-4#/dws/management/connectManagementAPI调用https://support.huaweicloud.com/api-dws/dws_02_0034.htmlIDE工具命令行工具https://console.huaweicloud.com/dws/?locale=zh-cn&region=cn-north-4#/dws/management/connectManagement图形化工具https://console.huaweicloud.com/dws/?locale=zh-cn&region=cn-north-4#/dws/management/connectManagement典型场景Mysql迁移到DWS实时数据分析、数据治理、用户行为分析BI分析-帆软https://marketplace.huaweicloud.com/product/00301-673057-0--0BI分析-永洪https://marketplace.huaweicloud.com/product/00301-595056-0--0其他数据库迁移到DWSA3 ADB迁移到DWSA3 ADB迁移到DWS材料开发中,待上线Mysql迁移到DWSMysql迁移到DWS材料开发中,待上线Oracle迁移到DWSOracle迁移到DWS材料开发中,待上线Greenplum迁移到DWSGreenplum迁移到DWS材料开发中,待上线社区论坛问题求助智能机器人智能机器人DWS微信公众号沃土云创论坛https://bbs.huaweicloud.com/forum/forum-1343-1.html常见问题常见问题常见问题https://support.huaweicloud.com/dws_faq/dws_03_0001.html【推荐阅读】【最新活动汇总】DWS活动火热进行中,超多互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [其他问题] 高斯dws行存表io高问题
    生产环境使用中发现,高斯库中的行存表创建插入数据后第一次查询io特别高基本使用率一直在100%,严重影响业务,这个问题有没有计划修复及何时修复。
  • [应用案例] GaussDB A(DWS)多租户资源管理配置实例
    一、使用gs_cgroup工具配置控制组1.1配置逻辑集群资源配额配置标准报告的多租户控制组,父租户80%cpu配额(线下8.0版本只能用整个集群80% )、自主分析控制组 class2:analyze 50%cpu(根据需求调整)配额,标准报告控制组class1:standard 50%cpu。命令gs_ssh -c “gs_cgroup -c -N LC_B”创建class控制组gs_ssh -c "gs_cgroup -c -S findm_b_tenant -N LC_B "创建workload用户组gs_ssh -c " gs_cgroup -c -S findm_b_tenant -N LC_B  -G workload_standard –g 50"gs_ssh -c " gs_cgroup -c -S findm_b_tenant -N LC_B  -G workload_analyze  -g 50" gs_ssh -c " gs_cgroup -u -S findm_b_tenant -N LC_B  -G workload_standard –g 50"gs_cgroup -u -S class1 -G grp1 -g 30修改CPU配额gs_cgroup -u -S ${Class控制组名称} -N ${逻辑集群名称} -G ${Workload控制组名称} -g ${CPU配额}gs_ssh -c “gs_cgroup -c -N LC_B –S FINDM_B_TENANT -s 40 -G wg1 -g 20”gs_ssh -c " gs_cgroup -u -S findm_b_tenant -N LC_B  -G workload_analyze –g 50"1.1.4查看配置文件中控制组信息。gs_cgroup –p –N LC_Bselect  * from gs_all_control_group_info;1.2配置逻辑集群资源限额增加CPU 限额 配置gs_cgroup -u -S ${Class控制组名称} -N ${逻辑集群名称} -G ${Workload控制组名称} -g ${CPU限额} –fixed命令示例:gs_cgroup -u -S findm_b_tenant -N LC_B -G workload_analyze -g 50 –fixedgs_cgroup --fixed -u -S class1 -G grp1 -g 30 集群配置:gs_ssh -c "gs_cgroup -u -S findm_b_tenant -N LC_B -G workload_analyze -g 50 --fixed"gs_ssh -c "gs_cgroup -u -S findm_b_tenant -N LC_B -G workload_standard -g 50 --fixed"更新配额/* gs_ssh -c “gs_cgroup -u -T findm_b_tenant -N LC_B  -G workload_analyze –t 50 --fixed”*/二、多租户配置2.1配置多租户1.创建父租户,内存占集群内存100% (先建父租户资源池(角色绑定),后建业务租户资源池)CREATE RESOURCE POOL findm_b_pool WITH (CONTROL_GROUP="tenant", NODEGROUP="LC_B",MEM_PERCENT=100);2.创建业务租户,内存占父租户内存50%,复杂作业并发10。CREATE RESOURCE POOL findm_stand_child WITH (CONTROL_GROUP="tenant:workload_standard", NODEGROUP="LC_B",MEM_PERCENT=50,ACTIVE_STATEMENTS=10);自主分析的设置成50%,复杂作业并发10。CREATE RESOURCE POOL findm_analyze_child WITH (CONTROL_GROUP="b_tenant:workload_analyze", NODEGROUP="LC_B",MEM_PERCENT=50,ACTIVE_STATEMENTS=10);示例: 2.2用户关联多租户(关联业务用户)1.创建角色关联父租户(必须,所有业务用户都关联到该角色)CREATE ROLE stand RESOURCE POOL '_pool'NODE GROUP "LC_B" NOLOGIN PASSWORD DISABLE;2.创建用户关联业务租户CREATE USER {分析用户}  PASSWORD 'xxxxx' RESOURCE POOL 'standard_pool' NODE GROUP "LC_B" USER GROUP 'stand';3.将已存在用户关联业务租户ALTER USER {分析用户} RESOURCE POOL 'analyze_child' NODE GROUP "LC_B" USER GROUP 'stand';示例:ALTER USER qtest RESOURCE POOL 'stand_child' NODE GROUP "LC_B" USER GROUP 'stand';ALTER USER distest RESOURCE POOL 'analyze_child' NODE GROUP "LC_B" USER GROUP 'stand';三、GaussDB 异常规则3.1异常规则清单 3.2配置异常规则序号作用规则名称配置命令1CPU倾斜率cpuskewpercent  gs_ssh -c "gs_cgroup -N LC_B -S  findm_b_tenant -G workload_analyze -E "cpuskewpercent=50,qualificationtime=3200" -a "2执行时间elapsetime  gs_ssh -c "gs_cgroup -N LC_B -S  findm_b_tenant -G workload_analyze -E "elapsedtime=2400" -a "3阻塞时间blocktime  gs_ssh -c "gs_cgroup -N LC_B -S  findm_b_tenant -G workload_analyze -E "blocktime=1200" -a "4落盘空间spillsizegs_ssh -c "gs_cgroup -N LC_B -S  findm_b_tenant -G workload_analyze -E "spillsize=10240" -a "四、GaussDB单作业限制query_max_mem 是执行作业所能够使用的最大内存,如果设置的query_max_mem值大于0,当作业执行时所使用内存超过该值时,将报错退出。1.整个集群设置内存限制作为缺省值(如非标报告):gs_guc reload -Z coordinator -Z datanode -N all -I all -c “ query_max_mem =value “2.标准报告 通过 set query_max_mem=0不限制gs_cgroup –P 查看当前节点资源池挂载情况 Gs_cgroup –h 可以查看帮助错误处理需要重新挂载cgroup卸载cgroupsudo /opt/huawei/Bigdata/mppdb/core/bin/gs_cgroup  -U omm –d装载cgroupgs_cgroup -U omm -H /opt/huawei/Bigdata/mppdb/core –c
总条数:2746 到第 页
上滑加载中