• [其他] 安装裸金属dws工步报错,在IAM申请DWS管理租户op_svc_dws失败
    【安装部署】【工步报错】在IAM申请DWS管理租户op_svc_dws失败【问题现象】报错:"ConsoleOnlineUtil" object has no attribute 'online_silvan_address'【解决方法】日志详情中可见报错文件路径,找到报错文件,修改self.online_silvan_address=self.online_silvan_address 为self.online_silvan_address = self.get_online_silvan_address()
  • [其他] BMS重启卡主影响DWS集群
    问题描述:BMS重启失败,一直卡在:A start job is  running for NetworkConfig问题现象:问题处理:1.查看有没有硬件事件告警,有则联系硬件进行处理   历史处理经验一:对硬件进行热插拔后恢复正常2.如果重启的节点上有cn,则进行cn剔除,不影响集群运行,剔除可参考https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=150170
  • [其他] GaussDB(DWS) 创建分区表来提升SQL性能
    在GaussDB(DWS) 上执行查询时,经常会发现性能瓶颈点在表的扫描上, 查看磁盘IO使用情况,发现使用率经常达到100%。针对上述场景,结合SQL语句的业务场景,如果表的某一列有日期特征,在查询条件中也经常使用这个日期列过滤数据,那么我们就可以考虑将这个表建成分区表。分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储。这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。分区表和普通表相比具有以下优点:改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。GaussDB(DWS)支持的分区表为范围分区表。范围分区表:将数据基于范围映射到每一个分区。这个范围是由创建分区表时指定的分区键决定的。分区键经常采用日期,例如将销售数据按照月份进行分区。(一)建分区表语句例子CREATE TABLE pt_table1(id INT, create_time TIMESTAMP, conent TEXT) WITH (orientation=column) DISTRIBUTE BY HASH (id) PARTITION BY RANGE (create_time) ( PARTITION P202203 start('2022-03-01'::timestamp) end('2022-04-01'::timestamp) every (interval '1 day') ) ENABLE ROW MOVEMENT;上面的这个语句按天建立了一个列存分区表,建立了一个月的分区,其中2022-03-01之前的数据保存在第一个分区里,3月的数据按天保存在每个分区里。(二)查看分区信息的语句select * from user_tab_partitions where schema = 'public' and table_name = 'pt_table1' order by high_value;(三)增加新分区ALTER TABLE pt_table1 ADD PARTITION P202204 START('2022-04-01'::timestamp) END('2022-05-01'::timestamp) EVERY(interval '1 day');(四)增加历史分区对历史数据增加分区,需要使用分区的SPLIT方法。ALTER TABLE pt_table1 SPLIT PARTITION P202203_0 into (PARTITION P202202 START('2022-02-01'::timestamp) END('2022-03-01'::timestamp) EVERY (interval '1 day'));(五)增加MAXVALUE分区将超过右边界的值都放入一个分区,可以使用MAXVALUE分区ALTER TABLE pt_table1 ADD PARTITION pmax END(MAXVALUE);(六)指定分区名查询分区的数据SELECT COUNT(*) FROM pt_table1 PARTITION (P202202_1);使用分区表后SQL的性能往往会带来数十倍到百倍的提升,并且磁盘的读IO会大幅下降,还有更多的表设计最佳实践,请参考以下链接:https://support.huaweicloud.com/bestpractice-dws/dws_05_0046.html
  • [生态空间] GaussDB(DWS)运维 -- sequence相关
    【DWS的序列概述】GaussDB(DWS)是一个share nothing架构的产品,seqeunce编号需要通过GTM统一分配。集群规模越大、节点数越多、sequence调用越频繁,sequnce对GTM的压力就越大。对于seqeunce的使用一般有如下建议建议业务中不要大量使用sequence,建议不要超过50个如果业务允许,建议使用uuid替换sequence使用sequence的时候,需要定义cache值不小于100【序列相关信息查询】建议定义如下视图进行查询CREATE OR REPLACE FUNCTION public.dfm_get_seqence_info ( OUT namespace text, -- 序列的schema OUT sequencename text, -- 序列名称 OUT min_value bigint, -- 序列最小值 OUT max_value bigint, -- 序列最大值 OUT start_value bigint, -- 起始值 OUT increment_by bigint, -- 增加步长 OUT cache_value bigint, -- cache值 OUT is_cycled boolean -- 是否可以循环使用 ) RETURNS SETOF record LANGUAGE plpgsql NOT FENCED NOT SHIPPABLE AS $function$ DECLARE rowObject record; rowDetail record; queryObjectStr text; queryDetailStr text; BEGIN --Get all the node names queryObjectStr := 'SELECT c.oid, relname, n.nspname FROM pg_class c INNER JOIN pg_namespace n on c.relnamespace = n.oid WHERE c.relkind = ''S'''; FOR rowObject IN EXECUTE(queryObjectStr) LOOP queryDetailStr := 'SELECT start_value, increment_by, max_value, min_value, cache_value, is_cycled FROM ' || quote_ident(rowObject.nspname) || '.' || quote_ident(rowObject.relname); FOR rowDetail IN EXECUTE(queryDetailStr) LOOP namespace = rowObject.nspname; sequencename = rowObject.relname; start_value = rowDetail.start_value; increment_by = rowDetail.increment_by; max_value = rowDetail.max_value; min_value = rowDetail.min_value; cache_value = rowDetail.cache_value; is_cycled = rowDetail.is_cycled; RETURN next; END LOOP; END LOOP; RETURN; END; $function$ ; CREATE VIEW public.dfm_get_seqence_info AS SELECT * FROM public.dfm_get_seqence_info();示例postgres=# CREATE SEQUENCE public.test_seq; CREATE SEQUENCE Time: 13.917 ms postgres=# CREATE TABLE public.test_serial(a bigserial, b int) DISTRIBUTE BY ROUNDROBIN; NOTICE: CREATE TABLE will create implicit sequence "test_serial_a_seq" for serial column "test_serial.a" SQLSTATE: 00000 LOCATION: CreateSeqOwnedByTable, parse_utilcmd.cpp:144 CREATE TABLE Time: 16.572 ms postgres=# CREATE SEQUENCE public.test_seq_1; CREATE SEQUENCE Time: 13.412 ms postgres=# CREATE TABLE public.test_serial_default(a bigint default nextval('public.test_seq_1'::regclass), b int) DISTRIBUTE BY ROUNDROBIN; CREATE TABLE Time: 12.006 ms postgres=# SELECT * FROM public.dfm_get_seqence_info; namespace | sequencename | min_value | max_value | start_value | increment_by | cache_value | is_cycled -----------+-------------------+-----------+---------------------+-------------+--------------+-------------+----------- public | test_seq | 1 | 9223372036854775807 | 1 | 1 | 1 | f public | test_serial_a_seq | 1 | 9223372036854775807 | 1 | 1 | 1 | f public | test_seq_1 | 1 | 9223372036854775807 | 1 | 1 | 1 | f (3 rows)【序列和表的bind关系查询】查询sequence和表的bind关系,主要场景有两个表的字段类型为bigserial或者serial类型,内置生成一个序列表的字段的默认值为序列的序列号这两个场景在上述里面都有casepostgres=# SELECT postgres-# pg_get_userbyid(c1.relowner) AS seqowner, -- sequence的用户 postgres-# n1.nspname AS seqschema, -- sequence的schema postgres-# c1.relname AS seqname, -- -- sequence的名称 postgres-# (pg_sequence_parameters(c1.oid)).minimum_value AS minvalue, -- sequence的最小值 postgres-# (pg_sequence_parameters(c1.oid)).maximum_value AS maxvalue, -- sequence的最大值 postgres-# (pg_sequence_parameters(c1.oid)).increment AS incrementby, -- sequence的步长 postgres-# pg_get_userbyid(c.relowner) AS tableowner, -- 关联的表的owner postgres-# n.nspname AS tableschema, -- 关联的表的schema postgres-# c.relname AS tablename,-- 关联的表的名称 postgres-# a.attname, -- -- 关联的表的列的名称 postgres-# d.adsrc as defaultexpression -- 关联的sequence的表达式 postgres-# FROM pg_catalog.pg_class c postgres-# INNER JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace postgres-# INNER JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid postgres-# INNER JOIN pg_catalog.pg_attrdef d ON d.adrelid = c.oid AND d.adnum = a.attnum postgres-# INNER JOIN pg_catalog.pg_depend p ON p.objid = d.oid postgres-# INNER JOIN pg_catalog.pg_class c1 ON c1.oid = p.refobjid postgres-# INNER JOIN pg_catalog.pg_namespace n1 ON n1.oid = c1.relnamespace postgres-# WHERE c.relkind = 'r'::"char" AND c.oid > 16384 postgres-# AND n.nspname not in ('pg_toast', 'cstore', 'pg_catalog') postgres-# AND a.attnum > 0 postgres-# AND p.classid='pg_catalog.pg_attrdef'::regclass postgres-# AND refclassid = 'pg_catalog.pg_class'::regclass postgres-# AND p.refobjsubid = 0 postgres-# AND c1.relkind = 'S'::"char" postgres-# ; seqowner | seqschema | seqname | minvalue | maxvalue | incrementby | tableowner | tableschema | tablename | attname | defaultexpression -----------+-----------+-------------------+----------+---------------------+-------------+------------+-------------+---------------------+---------+---------------------------------------- j00565968 | public | test_serial_a_seq | 1 | 9223372036854775807 | 1 | j00565968 | public | test_serial | a | nextval('test_serial_a_seq'::regclass) j00565968 | public | test_seq_1 | 1 | 9223372036854775807 | 1 | j00565968 | public | test_serial_default | a | nextval('test_seq_1'::regclass) (2 rows)【替换方案】实际业务中使用sequence一般有两个场景保证表数据均匀分布。这种场景可以把sequence字段替换为uuidpostgres=# DROP TABLE public.test_serial; DROP TABLE Time: 19.871 ms postgres=# CREATE TABLE public.test_serial(a text DEFAULT sys_guid(), b int) DISTRIBUTE BY HASH(a); CREATE TABLE Time: 19.245 ms或者使用roundrobin分布替换,然后删除sequence相关列postgres=# ALTER TABLE public.test_serial DISTRIBUTE BY ROUNDROBIN; ALTER TABLE Time: 218.796 ms postgres=# ALTER TABLE public.test_serial DROP COLUMN a; ALTER TABLE Time: 9.509 ms保证字段数据的唯一性。这种场景可以使用uuid()+主键的方式实现postgres=# DROP TABLE public.test_serial; DROP TABLE Time: 18.786 ms postgres=# CREATE TABLE public.test_serial(a text DEFAULT sys_guid(), b int, primary key(a)) DISTRIBUTE BY HASH(a); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_serial_pkey" for table "test_serial" CREATE TABLE注:理论上一个集群内的uuid不会重复,但还是建议表上增加主键约束
  • [生态空间] 【dws812】【用户的connect权限问题】同一个版本的不同集群创建用户后一个有connect权限,一个没有
    【功能模块】【操作步骤&问题现象】1、分别登录集群database,创建user2、使用新创建的user登录集群,一个可以正常登录,一个登录报错没有connect权限【截图信息】该集群可以正常登录登录报错的集群【日志信息】(可选,上传日志内容或者附件)
  • [其他] 【变更】GaussDB升级8.1.1,manager升级8.0.2.1后,页面监控不再显示
    一、问题现象GaussDB升级8.1.1,manager升级8.0.2.1后,页面监控历史数据正常展示,升级后监控不显示二、问题分析1.监控数据是oma进程上报给pms服务,查看oma文件的依赖库 ll /opt/huawei/Bigdata/om-agent/OMA/bin/omm_agent.bin,发现部分依赖库not found2.联系客户, 发现升级时使用setuptool工具是老版本自带的,本次升级没有下载新版本工具三、解决方法1.客户补做升级指导书中,补充rpm包和提交preinstall章节2.再次检查依赖库是否完整,依赖库 ll /opt/huawei/Bigdata/om-agent/OMA/bin/omm_agent.bin已恢复3.重启相关进程4.页面监控恢复正常
  • [其他] GaussDB(DWS) JDBC连接报错和性能问题定位
    1. 建议首先查看定位指南:GaussDB for DWS JDBC问题定位指南2. 检查JDBC的jar包是否正确,查看JDBC包与驱动类有两种JDBC的驱动jar包:gsjdbc4.jar:与PostgreSQL保持兼容的驱动包,其中类名、类结构与PostgreSQL驱动完全一致,曾经运行于PostgreSQL的应用程序可以直接移植到当前系统使用。gsjdbc200.jar:如果同一JVM进程内需要同时访问PostgreSQL及GaussDB(DWS)请使用此驱动包,它的主类名为“com.huawei.gauss200.jdbc.Driver”(即将“org.postgresql”替换为“com.huawei.gauss200.jdbc”),数据库连接的URL前缀为“jdbc:gaussdb”,其余与gsjdbc4.jar相同。注意:如果应用中同时使用开源postgresql-XX.X.X.jar驱动包,请使用gsjdbc200.jar,将主类名修改为“com.huawei.gauss200.jdbc.Driver”,url前缀修改为“jdbc:gaussdb”,避免冲突。3.JDBC的jar包版本判断方法【方法一】在windows上解压,查询META-INF目录下MANIFEST.MF文件内容,其中Version就是对应的版本。若MANIFEST.MF中存在Bundle-Vendor: PostgreSQL Global Development Group则为开源【方法二】步骤1:在linux上解压,其中xxxx是JDBC驱动包文件名jar -xvf xxxx步骤2:查看gs_version版本信息cat META-INF/MANIFEST.MF例如下面是JDBC 8.0.0版本:Manifest-Version: 1.0Ant-Version: Apache Ant 1.10.5Created-By: 1.8.0_232-Huawei_JDK_V100R001C00SPC171B003-b09 (Huawei Tec hnologies Co., Ltd)gs_version: (GaussDB A 8.0.0 build 9edcabca) compiled at 2020-05-06 23 :02:57 commit 7745 last mr 12970如果是开源的postgres的JDBC包,建议更换为DWS的JDBC包防止有性能及未知的问题。3.JDBC的代码示例:常用示例4.JDBC性能问题分析案例【JDBC问题的定位方法】分析JDBC的问题时,我们可以在连接串中打开日志功能,请参考以下URL:jdbc:postgresql://192.168.0.1:8000/test?loggerLevel=TRACE&loggerFile=jdbc.log在日志jdbc.log中可以看到语句执行过程中,JDBC和DWS集群的交互过程。案例一 查询中有大量系统表访问语句集群CPU消耗高在某局点的应用中,业务在执行SQL前,会使用JDBC的接口ResultSetMetaData.getColumnTypeName获取列属性,在jdbc.log日志中可以看到有大量的系统表查询语句。三月 18, 2022 2:28:49 下午 org.postgresql.core.v3.QueryExecutorImpl sendParse非常详细:  FE=> Parse(stmt=null,query="select * from t1 where id = $1",oids={23})……三月 18, 2022 2:28:49 下午 org.postgresql.core.v3.QueryExecutorImpl sendParse非常详细:  FE=> Parse(stmt=null,query="SELECT c.oid, a.attnum, a.attname, c.relname, n.nspname, a.attnotnull OR (t.typtype = 'd' AND t.typnotnull), pg_catalog.pg_get_expr(d.adbin, d.adrelid) LIKE '%nextval(%' FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid) JOIN pg_catalog.pg_attribute a ON (c.oid = a.attrelid) JOIN pg_catalog.pg_type t ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef d ON (d.adrelid = a.attrelid AND d.adnum = a.attnum) JOIN (SELECT 16979 AS oid , 1 AS attnum UNION ALL SELECT 16979, 2 UNION ALL SELECT 16979, 3) vals ON (c.oid = vals.oid AND a.attnum = vals.attnum) ",oids={})问题根因:查询为简单语句,走了Light Proxy(CN轻量化),将语句下发给了单个DN去处理,常见的场景过滤条件是分布列的等值查询(Where id = 1),或者向一个DN插入数据的INSERT语句。这种情况,系统表语句中对应的OID都是数据节点的OID,在CN节点上查询没有结果,因此列的元数据信息没有在JDBC的连接中缓存,造成每次访问列信息都去做一次查询。规避方法:关闭enable_light_proxy参数,命令为:gs_guc reload -Z coordinator -Z datanode -N all -I all -c "enable_light_proxy = off"案例二 调用JDBC的addBatch和executeBatch批量插入数据性能差问题根因:使用的是开源postgresql-XX.X.X.jar驱动包,替换为gsjdbc200.jar后性能恢复案例三 连接报错FATAL: Invalid username/password,login denied.问题根因:使用的是开源postgresql-XX.X.X.jar驱动包,替换为gsjdbc200.jar后连接成功案例四 使用JDBC连接池后,报错Caused by: java.net.SocketException: 打开的文件过多问题根因:连接池的写法存在问题,在Java中反复初始化连接池,建立的物理连接保存在连接池里不断的堆积,最终造成打开文件数过多。解决方案:按照文档正确使用JDBC连接池对象。案例五 使用JBDC的批量模式插入数据,报错字段超长,但报错信息中的Batch entry 0 INSERT INTO不是报错的那条数据。问题根因:没有开启JDBC的批量模式造成报错的数据不是异常的数据。解决方案:在JDBC的连接串中设置batchMode=true后问题解决案例六 使用JDBC执行语句,插入数据量大时报错 Unable to interpret the update count in command completion tag:insert 0 30219884931问题根因:开源PG的JDBC 8.x版本存在该问题,在9.x版本修复。解决方案:升级JDBC驱动版本。案例七 业务报错:Exception in thread "main" org.postgresql.util.PSQLException: ERROR: pooler: Communication failure, failed to send session commands or invalid incoming data, error count: 2.问题根因:JDBC的URL写错,写成currentSchema=db1?useSSL=false,其中db1?useSSL=false解析成schema名字。JDBC将set search_path=jwy_pic?useSSL=false; 语句发送到DN,造成报错退出。解决方案:URL的参数之间的连接使用&,例如currentSchema=db1&useSSL=false。
  • [其他] DWS监控面板添加监控视图前端报404
    【问题现象】DWS监控面板添加监控视图前端报404【问题版本】HCS 8.1.0  DWS 8.1.1.5【具体现象】1、前端报错404的url为dws/rest/v1/xxx/clusters/xxx/dms/monitoring/performance/check-duplicate2、进入FCD后台查看url_mapping.json文件,过滤查找check-duplicate,没有 ,check-duplicate接口未注册【解决方案】注:本文中的解决方案仅限于新搭的未做过升级的环境,新升级环境遇此问题请联系研发1、在FCD后台找到配置文件,/opt/FusionCloudDeploy/FusionCloudDeploy/plugins_cloudservices/DWS/conf/url_mapping.json2、注册接口,将接口配置写入url_mapping.json{"sendTimout": 0,"targetService": "DatabaseManager","method": "POST","endpointId": "dws","targetUri": "/v1/{project_id}/clusters/{cluster_id}/dms/monitoring/performance/check-duplicate","readTimout": 70,"targetProtocol": "https","uri": "/rest/v1/{project_id}/clusters/{cluster_id}/dms/monitoring/performance/check-duplicate","connectTimout": 0}3、重跑FCD工步,HCSD工具中找到DWS注册url mapping工步的任务IDbash /opt/rootscripts/fcdscripts/retry_step.sh run -i 任务ID4、去页面刷新,重新添加监控视图
  • [环境搭建] Jmeter连接gaussdb报错
    【功能模块】【操作步骤&问题现象】1、Jmeter使用jdbc连接Opengauss2、报错: Cannot create PoolableConnectionFactory (Invalid or unsupported by client SCRAM mechanisms)【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [讲座&活动公告] 【直播】GaussDB for MySQL关键特性发布和技术解读
    直播时间:2022/3/22 19:00-20:30直播嘉宾:佳恩 华为云数据库高级产品经理直播链接:https://bbs.huaweicloud.com/live/cloud_live/202203221900.html 直播简介:本次直播GaussDB(for MySQL)将正式发布HTAP混合负载特性,复杂查询效率提升百倍,让企业决策更加快速,准确。
  • [其他] GaussDB(DWS)元数据不一致-分区索引异常
    【问题现象】某据点查看表定义报错:ERROR:  The local index xxx on the partition xxx not exist【原因分析】该问题主表索引无损坏,报错原因由于单个分区索引记录在系统表pg_partition中与其他系统表不一致,未找到对应分区索引信息报错,【问题复现】1、创建表带p1 p2两个分区create table a_0317(a int) partition by range(a) (partition p1 values less than (4), partition p2 values less than (8));2、创建主表与分区索引 create index a_0317_index on a_0317(a) local (partition p1_index, partition p2_inde);3、查看分区该表分区索引信息如下:1)查看主表索引信息:select oid,* from pg_class where relname ='a_0317_index';oid   |   relname    | relnamespace | reltype | reloftype | relowner | relam | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | reltoastidxid | reldeltarelid | reldeltaidx | relcudescrelid | relcudescidx | relhasindex | relisshared | relpersistence | relkind | relnatts | relchecks | relhasoids | relhaspkey | relhasrules | relhastriggers | relhassubclass | relcmprs | relhasclusterkey | relrowmovement | parttype | relfrozenxid | relacl | reloptions--------+--------------+--------------+---------+-----------+----------+-------+-------------+---------------+----------+-----------+---------------+---------------+---------------+---------------+-------------+----------------+--------------+-------------+-------------+----------------+---------+----------+-----------+------------+------------+-------------+----------------+----------------+----------+------------------+----------------+----------+--------------+--------+------------ 700647 | a_0317_index |         2200 |       0 |         0 |       10 |   403 |      700647 |             0 |        0 |         0 |             0 |         0 |             0 |             0 |           0 |              0 |            0 | f           | f           | p              | i       |1 |         0 | f          | f          | f           | f              | f              | 0        | f                | f              | p        |      0 |        |(1 row)2)根据主表索引信息查看分区索引信息:select * from pg_partition where parentid= 700647; relname  | parttype | parentid | rangenum | intervalnum | partstrategy | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | reltoastidxid | indextblid | indisusable | reldeltarelid | reldeltaidx | relcudescrelid | relcudescidx | relfrozenxid | intspnum | partkey | intervaltablespace | interval | boundaries | transit | reloptions----------+----------+----------+----------+-------------+--------------+-------------+---------------+----------+-----------+---------------+---------------+---------------+------------+-------------+---------------+-------------+----------------+--------------+--------------+----------+---------+--------------------+----------+------------+---------+------------ p1_index | x        |   700647 |        0 |           0 | n            |      700651 |             0 |        0 |         0 |             0 |  0 |             0 |     700631 | t           |             0 |           0 |              0 |            0 |            0 |          |         |             |          |            |         | p2_inde  | x        |   700647 |        0 |           0 | n            |      700650 |             0 |        0 |         0 |             0 |  0 |             0 |     700632 | t           |             0 |           0 |              0 |            0 |            0 |          |         |             |          |            |         |(2 rows)4、连接CN开启读写事务,从pg_partition系统表删除p1分区的索引信息start transaction read write;delete from pg_partition where relname = 'p1_index';5、查看表定义报错与现场报错相同,问题复现:\d+ a_0317ERROR:  The local index 700633 on the partition 700647 not exist.CONTEXT:  referenced column: pg_get_indexdef【处理方法】注:尝试过对主表与分区索引做过reindex均无效。1、删除该表索引信息DROP INDEX a_0317_index;2、对该表索引进行重建create index a_0317_index on a_0317(a) local (partition p1_index, partition p2_inde);3、查看表定义无报错:\d+ a_0317                        Table "public.a_0317" Column |  Type   | Modifiers | Storage | Stats target | Description--------+---------+-----------+---------+--------------+------------- a      | integer |           | plain   |              |Indexes:    "a_0317_index" btree (a) LOCAL(PARTITION p1_index, PARTITION p2_inde)  TABLESPACE pg_defaultRange partition by(a)Number of partition: 2 (View pg_partition to check each partition range.)Has OIDs: noDistribute By: HASH(a)Location Nodes: ALL DATANODESOptions: orientation=row, compression=no
  • [其他] 主动预防-DWS集群gdb安装
    该工具需要在集群所有节点进行安装:HCS或HCSO的DWS中默认没有安装gstack/gdb等工具,如需安装可参考以下步骤:登录华为官方镜像网址:https://mirrors.huaweicloud.com/home 选择欧拉系统,点击对应的镜像链接,依次下载以下三个包:libbabeltrace-1.5.6-1.eulerosv2r8.aarch64.rpmgdb-headless-8.2-3.h3.eulerosv2r8.aarch64.rpmgdb-8.2-3.h3.eulerosv2r8.aarch64.rpm使用rpm -ivh按顺序依次安装三个包 线下纯软环境如果没有gdb,如需安装可参考以下步骤,选择其中一种即可:方式一(yum源安装):需提前配置好yum源或挂载好OS镜像yum install –y gdb*方式二(rpm包安装):下载安装包(以x86架构为例)http://mirror.centos.org/centos/7/os/x86_64/Packages/gdb-7.6.1-120.el7.x86_64.rpmrpm -ivh gdb-7.6.1-120.el7.x86_64.rpm其他架构安装包连接:https://mirrors.huaweicloud.com/search/os方式三(源码安装)下载源码安装包:https://ftp.gnu.org/gnu/gdb/gdb-8.2.1.tar.gz使用root用户将安装包上传服务器按照以下步骤进行安装:tar -zxvf gdb-8.2.1.tar.gzcd gdb-8.2.1/./configuremake -j32make install附报错排查:源码安装一般报错为gcc未安装,导致无法执行编译make等命令,建议先安装gcc,安装步骤参考如下:一般要必须安装这两个包(以x86架构为例):gcc-4.8.5-44.el7.x86_64.rpmgcc-c++-4.8.5-44.el7.x86_64.rpm如果出现需要依赖别的包,需要下载相对应的报缺失安装包,下载连接:https://mirrors.huaweicloud.com/search/os或者对应网站http://mirror.centos.org/centos/7/os/x86_64/Packages/下载好安装包之后:进行安装,比如:rpm -ivh gcc-4.8.5-44.el7.x86_64.rpm如果配置的yum源可以这样安装:yum install -y gcc*
  • 主动预防-DWS关键工具安装确认
    参考如下博客连接:https://bbs.huaweicloud.com/blogs/396499
  • [性能调优] 【GaussDB 8.0】【copymanger功能】数据获取时会出现间隔等待
    【功能模块】使用【GaussDB 8.0】【copymanger功能】中copyout方法的使用过程问题【操作步骤&问题现象】1、设置数据库连接信息,调用了copymanager的copycout方法2、获取到数据返回是执行了一批数据读取后,数据读取就停止了,过一段时间大致7分钟,又继续获取到对应数据,比如说表中有1000条数据,先读取到200条,然后就停止了过了7分钟后又获取了200条,直到把表中数据获取完成。主要疑问是:1、copyout方法是分批获取数据吗?每次获取先获取一部分数据,然后再进行再查询获取一部分数据直到将表中数据获取完成?2、如果是分批获取数据,如何减少每次获取数据的等待间隔时长。3、再下图中,重写了copyout方法逻辑后,通过system.out输出观察出,cp.readFromCopy方法,执行一部分输出后,会有几分钟等待时间后,再继续数据获取【截图信息】
  • [分享驿站] GaussDB(DWS) SQL进阶培训相关问答
    培训资料:https://partner.huawei.com/university/webui_portal/#/cert/certDetails?certId=CRE201912180000 ## 1. 如何查看node_group和schema的权限 目前已有列,表,自定义对象,当前角色等视图可以查看权限,schema和group暂时未加入系统视图,需要自己写SQL查看,方法如下: grantor 授权人 grantee 权限持有人 public 所有用户 is_grantable 当前用户是否可以授权给其它人 ```SQL postgres=# select * from information_schema.column_privileges; --列级权限查询,privilege_type可看都有哪些权限 grantor | grantee | table_catalog | table_schema | table_name | column_name | privilege_type | is_grantable -----------+-----------+---------------+--------------------+---------------------------------------+-------------------------------------+----------------+-------------- user1 | PUBLIC | postgres | pg_catalog | pgxc_stat_replication | client_port | SELECT | NO user1 | user1 | postgres | pg_catalog | pg_authid | rolvaliduntil | INSERT | YES user1 | PUBLIC | postgres | pg_catalog | pg_statio_sys_indexes | idx_blks_hit | SELECT | NO postgres=# select * from information_schema.table_privileges; --表级权限查询,privilege_type可看都有哪些权限 grantor | grantee | table_catalog | table_schema | table_name | privilege_type | is_grantable | with_hierarchy -----------+-----------+---------------+--------------------+---------------------------------------+----------------+--------------+---------------- user1 | PUBLIC | postgres | pg_catalog | pg_attribute | SELECT | NO | YES user1 | PUBLIC | postgres | pg_catalog | pg_index | SELECT | NO | YES user1 | PUBLIC | postgres | pg_catalog | pg_opclass | SELECT | NO | YES postgres=# select * from information_schema.usage_privileges; --自定义对象权限查询,privilege_type可看都有哪些权限 grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable -----------+-----------+----------------+--------------------+------------------------+----------------------+----------------+-------------- user1 | PUBLIC | postgres | pg_catalog | default | COLLATION | USAGE | NO user1 | PUBLIC | postgres | pg_catalog | C | COLLATION | USAGE | NO user1 | PUBLIC | postgres | pg_catalog | POSIX | COLLATION | USAGE | NO postgres=# select * from information_schema.role_usage_grants; --当前角色拥有的对象权限,privilege_type可看都有哪些权限 grantor | grantee | object_catalog | object_schema | object_name | object_type | privilege_type | is_grantable -----------+-----------+----------------+--------------------+------------------------+----------------------+----------------+-------------- user1 | PUBLIC | postgres | pg_catalog | default | COLLATION | USAGE | NO user1 | PUBLIC | postgres | pg_catalog | C | COLLATION | USAGE | NO user1 | PUBLIC | postgres | pg_catalog | POSIX | COLLATION | USAGE | NO ``` 查看schema上的权限 ```SQL --schema上有CREATE,ALTER,DROP,USAGE四种权限 SELECT u_grantor.rolname::information_schema.sql_identifier AS grantor, grantee.rolname::information_schema.sql_identifier AS grantee, current_database()::information_schema.sql_identifier AS schema_catalog, g.nspname::information_schema.sql_identifier AS schema_name, prtype::information_schema.character_data AS privilege_type, CASE WHEN pg_has_role(grantee.oid, g.nspowner, 'USAGE'::text) OR g.grantable THEN 'YES'::text ELSE 'NO'::text END::information_schema.yes_or_no AS is_grantable FROM (select nspname, nspowner, (aclexplode(COALESCE(pg_namespace.nspacl, acldefault('r'::"char", pg_namespace.nspowner)))).* from pg_namespace) g(nspname, nspowner, grantor, grantee, prtype, grantable), pg_authid u_grantor, (SELECT pg_authid.oid, pg_authid.rolname FROM pg_authid UNION ALL SELECT 0::oid AS oid, 'PUBLIC'::name AS "?column?") grantee(oid, rolname) WHERE g.grantee = grantee.oid AND g.grantor = u_grantor.oid and g.prtype = ANY (ARRAY['USAGE'::text, 'CREATE'::text, 'ALTER'::text, 'DROP'::text]) AND (pg_has_role(u_grantor.oid, 'USAGE'::text) OR pg_has_role(grantee.oid, 'USAGE'::text) OR grantee.rolname = 'PUBLIC'::name); grantor | grantee | schema_catalog | schema_name | privilege_type | is_grantable -----------+-----------+----------------+--------------------+----------------+-------------- w00567668 | w00567668 | postgres | public | USAGE | YES w00567668 | w00567668 | postgres | public | CREATE | YES w00567668 | w00567668 | postgres | public | ALTER | YES w00567668 | w00567668 | postgres | public | DROP | YES w00567668 | PUBLIC | postgres | public | USAGE | NO (5 rows) ``` 查看逻辑集群上的权限 ```SQL --逻辑集群上有USAGE,CREATE,COMPUTE三种权限 select u_grantor.rolname::information_schema.sql_identifier AS grantor, grantee.rolname::information_schema.sql_identifier AS grantee, group_name, prtype::information_schema.character_data AS privilege_type, CASE WHEN pg_has_role(grantee.oid, 10::oid, 'USAGE'::text) OR g.grantable THEN 'YES'::text ELSE 'NO'::text END::information_schema.yes_or_no AS is_grantable from ( select group_name, (aclexplode(COALESCE(group_acl, acldefault('r'::"char", 10::oid)))).* from pgxc_group) g(group_name, grantor, grantee, prtype, grantable), pg_authid u_grantor, (SELECT pg_authid.oid, pg_authid.rolname FROM pg_authid UNION ALL SELECT 0::oid AS oid, 'PUBLIC'::name AS "?column?") grantee(oid, rolname) where g.grantee = grantee.oid AND g.grantor = u_grantor.oid and g.prtype = ANY (ARRAY['USAGE'::text, 'CREATE'::text, 'COMPUTE'::text]) AND (pg_has_role(u_grantor.oid, 'USAGE'::text) OR pg_has_role(grantee.oid, 'USAGE'::text) OR grantee.rolname = 'PUBLIC'::name); grantor | grantee | group_name | privilege_type | is_grantable -----------+-----------+------------+----------------+-------------- w00567668 | w00567668 | node_group | USAGE | YES w00567668 | w00567668 | node_group | CREATE | YES w00567668 | w00567668 | node_group | COMPUTE | YES w00567668 | PUBLIC | node_group | USAGE | NO w00567668 | PUBLIC | node_group | CREATE | NO w00567668 | PUBLIC | node_group | COMPUTE | NO (6 rows) ``` ## 2. sequence是否支持cache,一次获取多个值 可以通过“CACHE”在创建sequence时指定缓存大小,暂时不能通过alter修改。 ```SQL CREATE SEQUENCE fooo_seq START WITH 5 INCREMENT BY 5 CACHE 3 CYCLE; --创建起始值为5,步长为5,缓存为3,循环使用的序列 --修改SEQUENCE暂时不支持 ``` ## 3. numeric精度 ``` NUMBERIC[(P[,S])] DECIMAL[(P[,S])] NUMBER[(P[,S])] ``` 精度p取值范围为[1,1000],标度s取值范围为[0,p]。其中p为总位数,s为小数位数 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131072位,小数点后最大16383位。 开发建议: ```TEXT 1) numeric能表示更高的精度,但占用空间也大。 2) 列存表的numeric有优化,定义精度如在38以下,内部自动也用bigint实现,性能会有明显提升。 3) 开发建议:建议显式指定标度和精度,小数位为0时,建议用整数类型,不要用numeric。 ``` ## 4. uuid是如何保证唯一性的 集群内全局唯一,不同集群间可能会重。 a. 同一套集群内部使用时,uuid不会重复。 b. 数据从A集群,迁移到B集群,在B集群上也不会重复。 c. 并行运行的不同集群,同一时刻产生的uuid可能会重复。 UUID的结构组成如下: ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20223/15/1647326582629924461.png) UUID的使用: ``` postgres=# select sys_guid(); --生成一个UUID类型的序列号,返回类型为TEXT sys_guid ---------------------------------- 622AA549BA9404DA1F3EF757D700FFFE (1 row) ``` ## 5. 是否支持round robin方式分布的表 a. 8.1.2版本开始支持round robin分布方式,由参数default_distribution_mode控制。 b. 8.1.2版本后新建集群表的默认分布方式为round robin。 c. 从低版本升级到8.1.2版本的default_distribution_mode默认值依然为hash,如需要round robin可以在线修改配置参数。 ```SQL postgres=# \d+ t1 Table "public.t1" Column | Type | Modifiers | Storage | Stats target | Description --------+---------+-----------+---------+--------------+------------- a | integer | | plain | | Has OIDs: no Distribute By: ROUND ROBIN Location Nodes: ALL DATANODES Options: orientation=row, compression=no ``` ## 6. string_agg列转行的长度限制 内部使用text类型,最大长度为1GB。 ## 7. join + groupby时分布键的选择策略,goupby时能否指定分布键 join时可以通过hint指定表的stream方式,见产品手册“Stream方式的Hint”。例如: ```SQL select /*+ redistribute(store) */ ... --让store表做重分布 ``` group by时指定分布键暂不支持,需求规划中。 ## 8. 分布键选择规范 a. 分布列的列值应比较离散,以便数据能够均匀分布到各个DN。 b. 在没有主键或没有某一列非常离散的情况下,也可以选择多分布列,以保证数据更均匀的分布到各个DN。 c. 在满足上面原则的情况下,考虑选择查询中的连接条件为分布列,以便join任务能够下推到DN中执行,且减少DN之间的通信数据量。 参考:表的设计 https://bbs.huaweicloud.com/blogs/203219 ## 9. 行列表选择规范 a. GaussDB(DWS)可以指定两种表数据存储方式,即行存或列存。其值为COLUMN,则表的数据将以列式存储;其值为ROW,则表的数据将以行存存储。若不指定,默认值为ROW。 b. 行存储适合OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。 c. 列存储适合数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的操作较少。 ## 10. explain analyze DML时会不会真正执行 会的 ``` postgres=# create table t3(a int); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using round-robin as the distribution mode by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE postgres=# explain analyze insert into t3 values(100); QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------- id | operation | A-time | A-rows | E-rows | Peak Memory | A-width | E-width | E-costs ----+----------------------------------------------+--------+--------+--------+-------------+---------+---------+--------- 1 | -> Data Node Scan on "__REMOTE_FQS_QUERY__" | 2.015 | 0 | 0 | 24KB | | 0 | 0.00 ====== Query Summary ===== ----------------------------------------- Coordinator executor start time: 0.302 ms Coordinator executor run time: 2.039 ms Coordinator executor end time: 0.130 ms Planner runtime: 0.131 ms Query Id: 78812993479046345 Total runtime: 2.542 ms (12 rows) postgres=# select * from t3; a ----- 100 (1 row) ``` ## 11. 执行计划如何查看 DWS数据库的SQL调优基础 https://bbs.huaweicloud.com/blogs/163514
总条数:2746 到第 页
上滑加载中