• [问题求助] 希望gaussdb有个专门的官网
    周围很多朋友反映想了解或者想学习gaussdb,但是没有一个很容易让用户找到的入口。当前gaussdb下的产品非常多、杂,希望能有一个类似opengauss.org的专门社区。opengauss都有社区 gaussdb没有,实在不能理解实在是太不方便了,希望能建一个这样的平台,方便广大想了解学习gaussdb的朋友
  • [行业资讯] 云原生数据库风起云涌,华为云GaussDB破浪前行
     Gartner预测,2021年云数据库在整个数据库市场中的占比将首次达到50%;2023年75%的数据库将基于云的技术来构建并跑在云平台之上。 云数据库蓬勃发展的同时,云原生数据库的理念也被市场和各大云厂商所认可。云原生数据库,即基于统一的架构和云原生基础设施,实现多云协同、混合云解决方案、边云协同等能力的数据库。随着企业数字化进程进入到一个新阶段,企业上云不再是简单把业务放入容器和VM中,更应该让业务“生于云、长于云”,Service on Service,企业的数字化升级需要基于云数据库来构建。 云原生2.0是企业智能升级的新阶段,企业云化从“ON Cloud”走向“IN Cloud”,新生能力与既有能力有机协同、立而不破,实现资源高效、应用敏捷、业务智能、安全可信,成为“新云原生企业”。华为云GaussDB聚焦全场景,构筑云原生数据库全栈能力 云原生2.0时代下,企业对云数据库提出了生态兼容、事务一致、极致扩展、插件化等高诉求,华为云GaussDB整合多年数据库领域经验和客户诉求,聚焦全场景,构筑云原生数据库全栈能力,并参与制定云原生数据库行业标准,积极引领云原生数据库发展新方向。 华为云GaussDB构建的云原生数据库核心能力如下:(1)存算分离,极致弹性华为云GaussDB统一采用计算资源层与存储资源层解耦的技术架构,实现分钟级弹性伸缩、秒级高可用切换。(2)多平台软硬协同,数据存储可靠 华为云GaussDB支持ARM、x86等多种平台,并针对不同平台进行优化,充分发挥不同架构底座的硬件资源能力,确保全场景负载数据文件绝对可靠,并具备多副本强一致访问能力,故障自动恢复。(3)跨AZ/Region部署能力,让数据底座更加稳定可靠 华为云GaussDB具备跨AZ的部署能力,并且提供跨AZ的读一致性访问,多AZ节点必须读到一致的数据。此外还支持两地三中心、异地多活等能力。(4)统一架构,多模兼容,开放生态 华为云GaussDB积极拥抱并完全兼容业界主流的数据库生态如MySQL、Mongo和Redis,同时自主研发数据库引擎openGauss,单机代码开源,生态和能力开放,做真正符合客户需要的国产化数据产品。(5)智能运维,自动调度,让数据库运维更加高效、极简 华为云GaussDB积极利用AI技术实现数据库自调优、自诊断、自安全、自运维、自愈等能力,协助DBA降低运维难度,提升运维效率,自动调度平衡资源池。华为云GaussDB坚持长期战略投入,打造世界级数据库服务 近期,中央国家机关2021年数据库软件协议供货采购项目征集公告发布,在央采一期传统的纯软件采购项目中,华为因主要聚焦云数据库赛道,并没有参与这一次一期的纯软交付的央采项目,但华为非常鼓励伙伴基于openGauss开放的能力打造他们自有品牌的数据库商业发行版并积极参与类似这次的央采一期项目;同时华为基于云数据库的能力优势,未来将重点参与相关方向的各类数据库竞标活动。 数据库作为IT产业的三大根技术之一,专家投入的深度、资源投入的决心以及对于数据库领域的专注和执着缺一不可。华为坚持长期战略投入,并汲取世界各地7大研究所不同领域超过100+的业界顶级专家,近1000+数据库领域相关的专业人才,有着强大的专家团和研发团队做支撑。同时立足华为云原生全栈能力,整合华为公司在多元算力、整机服务器、高速存储、新一代网络及企业级软件等领域的经验,基于统一的DFV分布式存储架构与RDMA高速网络等底层硬件的积累和软硬协同,打造了稳定可靠、极致性能的数据库服务。 展望未来,华为公司有能力、有信心在数据库和数据赛道传承华为优良传统,打造以“解决客户实际问题”的世界顶级产品,并在面向未来的云原生数据库方向不断投入,帮助客户快而好的完成“云原生数字化转型”,实现企业智能升级。同时,华为公司秉承“生态开放、互惠互利”的原则,打造基于合作伙伴+客户+开发者共赢的数据库生态圈,旨在做大做强国产数据库事业。  Ps:云数据库开年采购季活动火热进行中,爆款云数据库2.7折起,新购满额还送华为手机P40 Pro 5G,戳此直达>> https://activity.huaweicloud.com/dbs_Promotion/index.html
  • [集群&DWS] 数据仓库服务公有云计费介绍
    本文介绍数据仓库服务公有云计费模型、计费场景以及套餐包的使用规则。    数据仓库服务当前仅使用按需的计费模式,主要有四种产生费用的场景数据仓库节点,创建数据仓库虚拟机规格时产生的费用,按照节点个数每个小时更新账单;数据仓库裸机节点,创建数据仓库裸机规格时产生的费用,话单产生逻辑同上;数据仓库磁盘,创建数据仓库存算分离规格,磁盘存储部分产生的费用;DWS数据仓库集群备份到OBS的存储用量超过该集群总的存储空间,才开始计费,计费标准遵照对象存储服务的存储空间价格。    若用户想要享受更高的折扣,dws提供按需套餐包的形式来满足客户使用包年包月折扣的诉求。客户购买按需套餐包,必须还需要购买相同规格的按需产品,购买按需产品后,每小时的按需话单会正常产生,但套餐包会扣减对应规格的按需账单。两者关系为,套餐包需要下单并支付后才能使用;按需资源不需要下单支付,只要开通即可。    套餐包是客户预先购买的资源使用量配额。在按需资源使用过程中,华为云优先扣减匹配的套餐包使用量,超出配额的使用量需要根据按需付费。购买套餐包之后不会开通资源,如果没有匹配到开通的按需资源,则套餐包没有用处。    套餐包可以在使用周期内可以直接续费或者退订,套餐包退订后,不会影响原来使用套餐包的资源,原来的按需资源会在下一个小时正常按需计费。按需套餐包扣减规则按需套餐包的扣减顺序如下:指定企业项目资源包 -> 有限制场景的资源包 -> 促销活动的资源包 -> 订购的资源包指定企业项目按需套餐包:开通了企业项目的客户,购买按需套餐包时可以选择所属的企业项目。优先扣减指定企业项目的按需套餐包,再扣减适用所有企业项目的按需套餐包。有限制场景的按需套餐包:按需套餐包存在使用场景限制。使用场景包含:云服务区,资源规格等。云服务区:示例1,客户购买云产品时,设置的区域为华北-北京一,则只能扣减资源所在地为华北-北京一的按需套餐包。示例2,华为云上架云产品时,限制的云服务区为华北-北京一,则只能扣减资源所在地为华北-北京一的按需套餐包。资源规格:示例,如果客户购买的数据仓库节点套餐包使用限制为m3.xlarge,则只能匹配资源规格为dws.m3.xlarge的数据仓库节点规格,资源规格为dws.d2.xalrge以及其余规格的资源不能扣减该按需套餐包。促销活动的按需套餐包:客户参加促销活动时的按需套餐包。示例:参加某个促销活动赠送的按需套餐包。订购的按需套餐包:客户下单购买的按需套餐包。    相同类型按需套餐包的扣减顺序如下:失效时间 -> 生效时间 -> 购买时间失效时间:优先扣减先失效的按需套餐包(客户可以从“费用中心 > 我的套餐包”页面中查看生失效时间)。生效时间:失效时间相同时,优先扣减先生效的按需套餐包。购买时间:生失效时间都相同时,优先扣减先购买的按需套餐包。我的套餐包进入“我的套餐包”页面。在左侧导航栏中,单击套餐包名称, 可以查看套餐包详情。单击订单号链接,进入“费用中心 > 我的订单”页面,查看订单详情。单击“前往控制台”,进入控制台的对应服务页。单击“使用详情”,可查看当前服务的使用趋势图。单击“导出使用明细”,可导出使用量明细信息。抵扣方式:分为可重置套餐包和不可重置套餐包。当前数据仓库节点套餐包为可重置套餐包。可重置套餐包为容量线性递减的资源包,每个重置周期结束时清零,下个重置周期初恢复,直至到期。示例:购买的数据仓库磁盘服务按月可重置套餐包,套餐包规格为2920 GB*时/月,生效时间为 2019/07/1 00:00:00 - 2020/07/1 00:00:00,则有效期内每个月有2920 GB*时的套餐包可扣减。Ps:不可重置套餐包:容量线性递减的资源包,伴随抵扣容量不断减少。示例:购买的图像标签不可重置套餐包,总量为10000 次,生效时间为 2019/07/1 00:00:00 - 2020/07/1 00:00:00,则有效期内总共有10000次可扣减。设置剩余使用量预警单击页面右上角的“剩余使用量预警”,可以开启套餐包的使用量预警功能。当套餐包剩余使用量达到预警阀值时,系统会给您发送短信、邮件提醒。套餐包新购、续费后使用总量发生变化时,会重新触发预警判断。套餐包存在区域限制时,系统会对不同区域进行分别统计。当前有多个套餐包叠加使用时,系统会叠加统计剩余使用量。原文链接:https://bbs.huaweicloud.com/blogs/233067【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [测试] GaussDB(DWS)全文检索特性初探
    【摘要】 GaussDB(DWS)全文检索特性概述,以及功能简介。全文检索是在互联网场景下应用非常广泛的特性,搜索引擎、站内搜索、电商搜索等场景下都会使用到,GaussDB(DWS)同样也支持全文检索功能,是基于GIN索引实现的,下面给大家详细介绍一下GaussDB(DWS)的全文检索特性的功能。全文检索实现的功能,简单来说就是根据关键字从在全文字段中搜索到相关的信息,在不使用全文检索特性时,只能通过like ‘%keyword%’方式做模糊匹配,无法利用到索引,只能进行全表扫描,效率非常低,全文检索特性可以有效地提升检索性能。全文检索的基础就是GIN索引,Generalized Inverted Index,也就是通用倒排索引,是一个存储对(key, posting list)集合的索引结构,其中key是一个键值,而posting list 是一组出现过key的位置。如(‘hello', 2,3)中,表示hello在2和3这两个位置出现过。先来了解一下几个接口to_tsvectorto_tsvector(text, text)这个函数可以把一个文本转换为一个向量,其中保存单词和其出现的顺序,test=# SELECT to_tsvector('english', 'huawei cloud data warehouse');                 to_tsvector                 --------------------------------------------  'cloud':2 'data':3 'huawei':1 'warehous':4(1 row)test=# SELECT to_tsvector('zhparser', '华为云数据仓库');             to_tsvector            -----------------------------------  '云':2 '仓库':4 '华为':1 '数据':3(1 row)to_tsqueryto_tsquery(text)这个函数作用是用来把文本转化为可查询的语句,例如:SELECT to_tsquery('华为&深圳');这样就是寻找文本既包含“华为”,也包含“深圳”的语句,&是AND与操作,|是OR或操作如果想知道一个tsvector是否让tsquery成立,可以使用 @@ 操作符,例如:SELECT to_tsvector('zhparser', '华为深圳') @@ to_tsquery('华为&深圳');这条语句会返回Truets_rankts_rank(tsvector, tsquery)这个函数可以计算tsvector和tsquery的近似程度,通过这个函数计算出rank之后,就可以排序了SELECTts_rank(     to_tsvector('zhparser', '华为深圳'),     to_tsquery('华为&深圳')); 讲完了这些接口,让我们来做一些具体实践:1.创建数据库CREATE DATABASE test ENCODING 'utf8' template = template0;【注意】全文检索必须使用在encoding为utf8或者gbk的数据库上。2.创建表CREATE TABLE t1(id int, news text, location text);3.导入数据INSERT INTO t1 VALUES(1, '华为云GaussDB(DWS)数据仓库以2048大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群突破两千的商用数据仓库产品', '北京');INSERT INTO t1 VALUES(2, 'GaussDB(DWS)历经十年磨炼,是业界领先的企业级云分布式数据仓库服务', '深圳');INSERT INTO t1 VALUES(3, '华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践', '深圳');INSERT INTO t1 VALUES(4, '数智金融 使能创新,2020 华为 数智金融论坛在溪村成功举办', '东莞');INSERT INTO t1 VALUES(5, '华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙盛大开幕', '西安');4.创建索引CREATE INDEX t1_news_idx ON t1 USING gin(to_tsvector('zhparser', news));执行查询:SELECT * FROM t1 WHERE to_tsvector('zhparser',news) @@ to_tsquery('华为');查询结果: id |                                                                     news                                                                     | location  ----+----------------------------------------------------------------------------------------------------------------------------------------------+----------   5 | 华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙盛大开幕                                                                  | 西安  1 | 华为云GaussDB(DWS)数据仓库以2048大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群突破两千的商用数据仓库产品                     | 北京  3 | 华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践 | 深圳  4 | 数智金融 使能创新,2020 华为 数智金融论坛在溪村成功举办                                                                                      | 东莞(4 rows)news中只要包含“华为”词组,都会检索出来5.创建多字段联合索引:CREATE INDEX t1_news_location_idx ON t1 USING gin(to_tsvector('zhparser', news||location)); 执行结果:查找同时包含两个词组SELECT * FROM t1 WHERE to_tsvector('zhparser', news||location) @@ to_tsquery('华为 & 深圳');news跟location只要有一个字段中包含“华为”和“深圳”都会检索出来test=# SELECT * FROM t1 WHERE to_tsvector('zhparser', news||location) @@ to_tsquery('华为 & 深圳');  id |                                                                     news                                                                     | location  ----+----------------------------------------------------------------------------------------------------------------------------------------------+----------   3 | 华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践 | 深圳(1 row)查询包含其中一个词组SELECT * FROM t1 WHERE to_tsvector('zhparser', news||location) @@ to_tsquery('云|深圳');news跟location只要有一个包含“云”跟“深圳”这两个词的任何一个都会检索出来。test=# SELECT * FROM t1 WHERE to_tsvector('zhparser', news||location) @@ to_tsquery('云|深圳');  id |                                                                     news                                                                     | location  ----+----------------------------------------------------------------------------------------------------------------------------------------------+----------   5 | 华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙盛大开幕                                                                  | 西安  3 | 华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践 | 深圳  1 | 华为云GaussDB(DWS)数据仓库以2048大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群突破两千的商用数据仓库产品                     | 北京  2 | GaussDB(DWS)历经十年磨炼,是业界领先的企业级云分布式数据仓库服务                                                                             | 深圳(4 rows)6.排序按照某一列包含的某个词组权重来排序SELECT id, news, location ,ts_rank_cd(to_tsvector('zhparser',news), query) AS rank FROM t1, to_tsquery('华为') query WHERE query @@ to_tsvector('zhparser',news) order by rank DESC;执行结果:test=# SELECT id, news, location ,ts_rank_cd(to_tsvector('zhparser',news), query) AS rank FROM t1, to_tsquery('华为') query WHERE query @@ to_tsvector('zhparser',news) order by rank DESC;  id |                                                                     news                                                                     | location | rank  ----+----------------------------------------------------------------------------------------------------------------------------------------------+----------+------   3 | 华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践 | 深圳     |   .3   1 | 华为云GaussDB(DWS)数据仓库以2048大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群突破两千的商用数据仓库产品                     | 北京     |   .2   4 | 数智金融 使能创新,2020 华为 数智金融论坛在溪村成功举办                                                                                      | 东莞     |   .1   5 | 华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙盛大开幕                                                                  | 西安     |   .1(4 rows)搜索出含有“华为”的词组,并且根据权重排序 按照某一列包含多个词组权重排序(同时包含两个词组)SELECT id, news, location,ts_rank_cd(to_tsvector('zhparser', news||location), query) AS rank FROM t1, to_tsquery('华为&深圳') query WHERE query @@ to_tsvector('zhparser',news||location) order by rank DESC;执行结果:test=# SELECT id, news, location,ts_rank_cd(to_tsvector('zhparser', news||location), query) AS rank FROM t1, to_tsquery('华为&深圳') query WHERE query @@ to_tsvector('zhparser',news||location) order by rank DESC;  id |                                                                     news                                                                     | location |   rank     ----+----------------------------------------------------------------------------------------------------------------------------------------------+----------+-----------   3 | 华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践 | 深圳     | .00555556(1 row)搜索出含有“华为”和“深圳”的词组,并且根据权重排序 按照某一列包含多个词组权重排序(包含两个词组其中一个)SELECT id, news, location,ts_rank_cd(to_tsvector('zhparser', news||location), query) AS rank FROM t1, to_tsquery('云|深圳') query WHERE query @@ to_tsvector('zhparser', news||location) order by rank DESC;查看执行结果:test=# SELECT id, news, location,ts_rank_cd(to_tsvector('zhparser', news||location), query) AS rank FROM t1, to_tsquery('云|深圳') query WHERE query @@ to_tsvector('zhparser', news||location) order by rank DESC;  id |                                                                     news                                                                     | location | rank  ----+----------------------------------------------------------------------------------------------------------------------------------------------+----------+------   1 | 华为云GaussDB(DWS)数据仓库以2048大规模节点通过信通院评测认证,华为云数据仓库成为国内首个单集群突破两千的商用数据仓库产品                     | 北京     |   .2   2 | GaussDB(DWS)历经十年磨炼,是业界领先的企业级云分布式数据仓库服务                                                                             | 深圳     |   .2   5 | 华为云 AI 训练营西安站:“ModelArts Pro——行业 AI 落地新利器”主题沙龙盛大开幕                                                                  | 西安     |   .1   3 | 华为GaussDB(DWS)数据仓库,助力招行“人人用数,创新前行,招行客户在华为论坛中表示,华为与招行的联创实验室还将进一步探索云数仓支持OBS存储的实践 | 深圳     |   .1(4 rows)检索出包含“云”或者“深圳”的记录,并且根据权重排序。通过以上的案例,相信大家对GaussDB(DWS)的全文检索使用已经有了一些了解,其实全文检索还有ngram分词,和自定义词典等等其他用法,大家如果有兴趣,可以访问DWS产品文档或者在本社区提问,获取更全面的解答。原文链接:https://bbs.huaweicloud.com/blogs/231250【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [SQL] GaussDB(DWS)查看后台活跃SQL和执行状态
    【摘要】 本帖简单介绍GaussDB(DWS)常用视图和使用方式。背景:使用数据库过程中,执行一条查询语句很慢,想知道后台语句的执行情况。可通过以下方式查看数据库后台当前执行的所有语句和语句的执行情况。1. PGXC_STAT_ACTIVITY视图介绍PGXC_STAT_ACTIVITY视图显示当前集群下所有CN的查询相关的信息,只有系统管理员才有权限执行。该视图的coorname表示执行该语句的CN,query_id字段表示该query的唯一ID,同一条语句在不同节点的query_id相同,不同语句的query_id不同。pid表示该语句在对应节点上的线程ID,usename表示执行该语句的用户,query_start表示该语句开始执行的时间,enqueue表示语句是否正在排队。该字段为空表示未处于排队状态,state字段表示对应的语句执行状态,常见状态如下:active:后端正在执行一个查询。idle:后端正在等待一个新的客户端命令。idle in transaction:后端在事务中,但事务中没有语句在执行。idle in transaction (aborted):后端在事务中,但事务中有语句执行失败。利用此视图对相关字段进行过滤,即可查询得到当前的后台所有CN上的活跃语句:select coorname, usename, client_addr, sysdate-query_start as dur, enqueue, query_id, substr(query,1,60)from pgxc_stat_activity where usename != 'Ruby' and state != 'idle' order by dur desc;其中,Ruby用户为数据库的初始用户,一般情况下我们不关心初始用户相关的语句。执行上述查询即可得到当前后台所有活跃的sql情况和已经执行的时长。接下来,可以根据查到的query_id利用等待视图PGXC_THREAD_WAIT_STATUS对执行的慢sql进行分析,查看语句的执行状态。2. PGXC_THREAD_WAIT_STATUS视图介绍通过CN节点查看PGXC_THREAD_WAIT_STATUS视图,可以查看集群全局各个节点上所有SQL语句产生的线程之间的调用层次关系,以及各个线程的阻塞等待状态,从而更容易定位进程停止响应问题以及类似现象的原因。该视图中我们需重点关注wait_status字段和wait_event字段,其中,wait_status字段表示当前线程的等待状态,wait_event表示等待事件,一般为acquire lock、acquire lwlock、wait io三种类型。根据上一步查询得到的query_id查询等待视图,即可得到该语句的等待时间状态,分析出慢sql的瓶颈点:select * from pgxc_thread_wait_status where query_id = 20971544;例如:select * from pgxc_thread_wait_status where query_id=20971544;   node_name   | db_name  | thread_name  | query_id |       tid       | lwtid | ptid  | tlevel | smpid |     wait_status   |  wait_event    --------------+----------+--------------+----------+-----------------+-------+-------+--------+-------+----------------------  datanode1    | postgres | coordinator1 | 20971544 | 139902867994384 | 22735 |       |      0 |     0 | wait node: datanode3 |  datanode1    | postgres | coordinator1 | 20971544 | 139902838634256 | 22970 | 22735 |      5 |     0 | synchronize quit     |  datanode1    | postgres | coordinator1 | 20971544 | 139902607947536 | 22972 | 22735 |      5 |     1 | synchronize quit     |  datanode2    | postgres | coordinator1 | 20971544 | 140632156796688 | 22736 |       |      0 |     0 | wait node: datanode3 |  datanode2    | postgres | coordinator1 | 20971544 | 140632030967568 | 22974 | 22736 |      5 |     0 | synchronize quit     |  datanode2    | postgres | coordinator1 | 20971544 | 140632081299216 | 22975 | 22736 |      5 |     1 | synchronize quit     |  datanode3    | postgres | coordinator1 | 20971544 | 140323627988752 | 22737 |       |      0 |     0 | wait node: datanode3 |  datanode3    | postgres | coordinator1 | 20971544 | 140323523131152 | 22976 | 22737 |      5 |     0 | net flush data       |  datanode3    | postgres | coordinator1 | 20971544 | 140323548296976 | 22978 | 22737 |      5 |     1 | net flush data  datanode4    | postgres | coordinator1 | 20971544 | 140103024375568 | 22738 |       |      0 |     0 | wait node: datanode3  datanode4    | postgres | coordinator1 | 20971544 | 140102919517968 | 22979 | 22738 |      5 |     0 | synchronize quit     |  datanode4    | postgres | coordinator1 | 20971544 | 140102969849616 | 22980 | 22738 |      5 |     1 | synchronize quit     |  coordinator1 | postgres | gsql         | 20971544 | 140274089064208 | 22579 |       |      0 |     0 | wait node: datanode4  |(13 rows)可以看到,该语句在CN1执行,coordinator1在等datanode4,datanode4在等datanode3,datanode3在的等待状态为net flush data,表示该节点正在向网络中发送数据,说明整个查询的瓶颈点在datanode3的网络传输,该节点可能存在网络瓶颈。等待视图中各等待状态详情可以通过以下文档查看:https://support.huaweicloud.com/devg-dws/dws_04_0565.html3. 二者结合使用对于一些有明显特征的SQL,比如表名/别名/注释等,能根据该特征标志出唯一sql,可以执行以下SQL将PGXC_STAT_ACTIVITY和PGXC_THREAD_WAIT_STATUS进行关联查询:select w.* from pgxc_thread_wait_status w left join pgxc_stat_activity a  on w.query_id=a.query_id  where a.query_id != 0and a.query like '%explain performance%'and a.query not like '%pgxc_stat_activity%';本例中,explain performance能够标识唯一SQL,即可使用该sql直接查询得到等待视图情况。原文链接:https://bbs.huaweicloud.com/blogs/231261【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [SQL] GaussDB(DWS)运维 -- SQL操作 -- 查找所有包含主键&唯一索引的表信息
    【摘要】 查询表相关主键约束、唯一约束或者唯一索引。SELECT    n.nspname AS schemaname, --schema名称    c1.relname AS tablename, -- 表名    c2.relname AS indexname, -- 索引名称    s.conname AS conname,    -- 约束名称    pg_get_constraintdef(s.oid) AS constraintdef, -- 如果是约束,输出约束定义    CASE WHEN s.conname IS NULL THEN pg_get_indexdef(x.indexrelid) END AS indexdef -- 如果不是约束,输出索引定义FROM pg_index xINNER JOIN pg_class c1 ON c1.oid = x.indrelidINNER JOIN pg_class c2 ON c2.oid = x.indexrelidINNER JOIN pg_namespace n ON n.oid = c1.relnamespaceLEFT JOIN pg_constraint s ON s.conrelid = x.indrelid AND s.conindid = x.indexrelidWHERE (x.indisprimary = true OR x.indisunique = true)AND c1.relkind = 'r' AND x.indrelid >= 16384 AND x.indexrelid > 16384AND (c1.reloptions IS NULL OR c1.reloptions::text not like '%internal_mask%')  -- 排除内置对象ORDER BY schemaname, tablename, indexname;原文链接:https://bbs.huaweicloud.com/blogs/230137【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS) 集群扩容系列一:集群扩容与数据重分布
    【摘要】 扩容:添加主机与数据重分布。集群扩容当数据库在运行性能和存储上到达瓶颈时,就需要通过增加主机来提升集群的性能及存储能力,此时,原集群需要进行扩容。如图所示,集群扩容流程包含了四个步骤:1. 节点预处理:确保扩容的节点符合当前环境部署要求。2. 添加主机:将主机和实例添加到指定物理集群。3. 数据重分布:将物理集群原有数据重分布到新扩容节点中。4. 扩容验证:扩容结束后,验证新加主机及新增服务是否正常。其中,添加主机与数据重分布为两个核心步骤,也是耗时最长的步骤,接下来,主要介绍添加主机和重分布的步骤。添加主机添加主机的核心点就是让新增节点上的GaussDB实例和老集群上的实例具有相同的元数据信息,此部分内容涵盖技术点较多,将在以后章节中单独介绍。下面介绍一下添加主机过程中的gs_expand运维工具的使用方法:修改集群部署配置文件(cluster.xml)在集群部署配置文件中添加新增主机的信息: 注意事项: a) 原有的主备关系不能破坏; b) 新增节点上不能包含主备GTM和主备CM Server; c) 新增点上的DN自行成环;执行前置脚本执行前置脚本gs_preinstall, 在任意一台旧集群机器的安装目录下,以root用户执行:gs_preinstall -U perfadm -G users -X  /opt/cluster.xml  --alarm-type=1  --sep-env-file=/opt/temp/env其中: -U:表示用户名;            -G:表示用户群组;            -X:表示配置文件的地址;            --alarm-type:表示告警类型:                a) 1表示使用FusionInsight的告警管理工具管理告警;                b) 2表示告警将写入syslog日志,不发送恢复告警;                c) 3表示预留给OLTP的接口。 执行添加主机在集群用户perfadm下执行:gs_expand -t dilatation -X /opt/cluster.xml --dilatation-mode=insert其中:-t dilatation:表示添加主机;          -X:表示配置文件的地址;          --dilatation-mode=insert:insert表示在线模式,read-only表示离线模式。至此,添加主机的步骤已经完成。数据重分布通常情况下,集群老节点上的数据量基本趋于饱和,只有将数据平均的搬迁到新节点上,才能降低老节点的负载,这就是数据重分布需要达到的目标。在集群用户perfadm下执行:gs_expand -t redistribute --fast-redis --parallel-jobs=4 --redis-mode=insert其中:-t redistribute :表示数据重分布;          --fast-redis:表示快速重分布模式;          --parallel-jobs=4:表示数据重分布的并发度为4;          --redis-mode=insert:insert表示在线模式,read-only表示离线模式。在线重分布在线扩容添加节点过程中会阻塞用户的DDL语句,但和离线扩容相比,阻塞时间较短,不阻塞用户数据的查询、插入、更新、删除语句,对用户业务影响小。在线数据重分布过程中,对正在重分布的数据表,除少量场景有规格限制外,能保证大多数场景业务正常运行。在线重分布期间的规格限制:支持新建table、schema、tablespace、view、游标、存储等;对于正在重分布的表,支持insert、select、update、delete、merge into、drop、copy、gds、truncate、truncate partition等操作;对正在重分布的表,不支持绝大部分ALTER TABLE操作,包括修改表名、修改schema、新增或删除字段、删除分区、修改默认值等操作,但ALTER TABLE ... TRUNCATE PARTITION除外;支持从jdbc、odbc、DS、gsql、LVS等客户端下发作业;支持审计功能;对于超过996列的宽表,该表重分布期间,仅支持insert和select操作,不支持delete、update操作;不支持创建、删除、重命名database;不支持创建、删除、重命名表空间;不支持对正在重分布的表执行vacuum full和cluster命令,实际上,表完成重分布后也相当于完成了一次vacuum full操作;data_redis是重分布预留的schema,用户应该避免创建同名的schema, 如果存在会导致重分布失败;CN剔除和DN节点故障期间,集群状态为degraded,不支持在线重分布;备份恢复期间,不支持与在线重分布同时使用;增删cn期间,不支持与在线重分布同时使用;用户业务对在线重分布的影响:用户对重分布的表执行频繁的DDL和DML操作并且时间比较长时,会影响重分布时间,导致重分布作业处于pending中;用户作业在事务中长时间对表加锁,会长时间阻塞对该表进行重分布,甚至导致该表重分布失败,并反复重试;用户作业对正在重分布的表有大量的数据更新或删除时,会导致重分布多次追增时间较长,增加重分布时间;用户作业如果有truncate或truncate partition操作,会中断重分布作业,重分布作业需要重入;离线重分布离线扩容采用read-only方式执行扩容重分布,在扩容加节点过程中,不建议执行用户业务,如果执行业务,会导致DDL相关语句报错。对于有大的数据库集群,扩容加节点执行时间很长,会导致用户业务被长时间阻塞。在扩容重分布阶段,仅允许用户执行查询操作,由于离线重分布会对重分布表加共享锁,用户插入、更新、删除数据都会被阻塞。由于大表的重分布时间很长,有可能几十分钟或一两个小时,被阻塞的用户作业会等锁超时而中断执行。重分布进度查询重分布过程中会创建以下几张表或视图,包括redis_progress视图、redis_progress_detail表、pgxc_redistb表、redis_status表和redis_config表。它们各自的作用如下,管理员通过对应的视图或表可以查看重分布的进度。管理员可以通过redis_progress视图查看重分布总体进度。redis_progress_detail表记录了数据库中每张表重分布所耗时间。pgxc_redistb表会在每个数据库中创建,记录了对应数据库中需要重分布的表。redis_status表记录了重分布目前所处状态。redis_config表记录了重分布的参数,可以直接通过修改数据库中的redis_config表来动态调整配置参数。原文链接:https://bbs.huaweicloud.com/blogs/228456【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [存储] GaussDB(DWS) 锁管理介绍
    一,表锁GaussDB(DWS) 支持的表锁级别很多,从最低的1级到最高的8级:1级锁,AccessShareLockSELECT语句申请AccessShareLock,只与8级锁冲突,只会阻塞DDL等语句。2级锁,RowShareLockSELECT FOR SHARE/UPDATE语句申请RowShareLock,与7/8级锁冲突。3级锁,RowExclusiveLockINSERT/UPDATE/DELET语句申请RowExclusiveLock,与6-8级锁冲突。4级锁,ShareUpdateExclusiveLockVACUUM/ANALYZE语句申请ShareUpdateExclusiveLock,与5-8级锁冲突。5级锁,ShareLockCREATE INDEX语句申请ShareLock,与4/6/7/8级锁冲突,与5级锁不冲突,同一个表的多个CREATE INDEX可以同时执行不阻塞。6级锁,ShareRowExclusiveLock在GaussDB(DWS) 中,ShareRowExclusiveLock目前只在ALTER SEQUENCE中用到,阻塞表的增删改以及更高级别操作,该锁与3-8级锁冲突。7级锁,ExclusiveLockVACUUM FULL,MERGE PARTITION等语句申请ExclusiveLock级锁,ExclusiveLock只与SELECT兼容,与2-8级锁冲突。除了表锁外,事务锁,扩展锁、记录锁都是使用的ExclusiveLock,下面会进行详细介绍。8级锁,AccessExclusiveLockDDL等语句会申请AccessExclusiveLock,包括ALTER TABLE,DROP TABLE,TRUNCATE,REINDEX,VACUUM FULL等,8级锁与所有锁都冲突。锁冲突矩阵详细的锁冲突矩阵图如下所示: LOCK [TABLE]表锁还可以手动的使用SQL语句的方式进行强制上锁,SQL语句的格式如下所示:LOCK [ TABLE ] [ ONLY ] name [ * ] [, ...] [ IN lockmode MODE ] [ NOWAIT ]其中 lockmode 可以是以下之一:    ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE    | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE要注意的是LOCK语句只能在事务块中执行,事务结束会释放。二,其他锁除了表锁,GaussDB(DWS) 中还有很多其他的锁,下面列出一些常用的锁:1,事务锁写事务会获取一个事务号,并且会以这个事务号申请一个事务锁,锁级别是7级锁ExclusiveLock。事务锁用于控制记录的并发修改,比如,两个事务先后修改同一条记录,在前一个事务未结束之前,后一个事务会等待在前一个事务的事务锁上。2,记录锁当出现并发更新冲突时,冲突的事务会申请记录锁,锁级别是7级锁ExclusiveLock。记录锁主要是提高等待事务的优先级,在更新事务结束后,让持有记录锁的事务第一个被唤醒。3,扩展锁文件扩展时,会申请扩展锁,扩展锁的锁级别是7级锁ExclusiveLock。表、索引、fsm、vm等文件扩展时都会申请扩展锁。4,分区锁分区锁是专门针对分区表的,分区锁的意义与表锁差不多,锁级别从1-8都有。三,用户自定义锁也叫advisory lock,用户可以通过调用GaussDB(DWS) 提供的函数来自定义锁,自定义锁按照作用范围分为两类:1,事务级自定义锁作用范围在本事务内部,可以手动调用函数释放,也可以事务结束自动释放。相关函数:pg_advisory_xact_lock(key bigint)pg_advisory_xact_lock(key1 int, key2 int)pg_advisory_xact_lock_shared(key bigint)pg_advisory_xact_lock_shared(key1 int, key2 int)pg_try_advisory_xact_lock(key bigint)pg_try_advisory_xact_lock(key1 int, key2 int)pg_try_advisory_xact_lock_shared(key bigint)pg_try_advisory_xact_lock_shared(key1 int, key2 int)2,session级自定义锁作用范围跨越事务,需要手动调用相关函数进行合理的释放,session退出时也会强制释放。相关函数:pg_advisory_lock(key bigint)pg_advisory_lock(key1 int, key2 int)pg_advisory_lock_shared(key bigint)pg_advisory_lock_shared(key1 int, key2 int)pg_try_advisory_lock(key bigint)pg_try_advisory_lock(key1 int, key2 int)pg_try_advisory_lock_shared(key bigint)pg_try_advisory_lock_shared(key1 int, key2 int)其中:带shared后缀的相关函数会申请5级锁ShareLock,不带shared后缀的会申请7级锁ExclusiveLock。带try标识的相关函数表示尝试申请锁,如果申请不到,直接返回,不需锁等待四,如何查看锁等待通过查询pg_locks视图查看单个节点的锁持有和等待状态,pg_locks视图的结构如下图:其中:locktype列表示锁类型,包括表锁、事务锁、扩展锁、自定义锁等;relation列表示表的oid,如果是表锁,relation列会显示表的oidtransactionid表示事务号,如果是事务锁,transactionid列会显示session的事务号mode列表示锁级别,级别1-8级;pid列表示session的线程号;granted列表示是否持有锁,‘t’表示持有锁,‘f'表示等待锁;简单示例先创建一张表t1(a int, b int);并插入一条记录(1,1)。1,先后创建两个连接session1,session2,同时对这条记录进行更新,更新顺序如下: 2,对于session1,查看pg_locks,如下图所示session1持有的锁主要包括:1)持有表t1的3级锁RowExclusiveLock,表t1的oid是163842)持有session1的事务锁,事务号是2415620,锁级别7级(ExclusiveLock)3,对于session2,查看pg_locks,如下图所示 由于session1的更新未结束,session2需要等待,session2相关的锁主要包括:1)持有表t1的3级锁RowExclusiveLock,表t1的oid是163842)持有session2的事务锁,事务号是24156303)持有记录(1,1)的记录锁4)等待session1事务结束释放事务锁,granted为’f',申请session1的事务号对应的5级锁(ShareLock),与session1持有7级事务锁冲突,需要锁等待五,锁相关参数GaussDB(DWS) 中锁等待可以设置等待超时相关参数,一旦等锁的时间超过参数配置值会抛错。锁等待超时有两个参数::1) lockwait_timeout当出现表锁冲突的时候生效,当等待表锁的时间超过配置的时间,抛错返回,默认20分钟。2) update_lockwait_timeout当出现记录锁冲突的时候生效,如果等待记录锁的时间超过update_lockwait_timeout,抛错返回,默认20分钟。原文链接:https://bbs.huaweicloud.com/blogs/228062【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [SQL] 初窥自定义C函数
    【摘要】 用户在使用数据库过程中,受限于内置函数的功能,部分业务不易实现时,可以使用自定义C函数实现特殊功能。本文通过两个示例展示自定义C函数的实现过程。前言用户在使用数据库过程中,常常受限于内置函数的功能,部分业务不易实现,或实现后性能较差,在这些场景出现时可以考虑使用C编写自定义函数来实现独立功能。  例如用户针对某些数据列需要使用C编写的特定算法进行计算,如果放在业务层所性能不能接受,就可以尝试有自定义C函数在实现功能的前提下保证实现效率。  粗略的来说,用户使用C编写的自定义函数会被被编译成动态库并且由数据库在需要的时候载入。在一个会话中第一次调用一个特定的用户定义函数时,数据库进程会把动态库文件载入到内存中以便该函数被调用。从这个角度来说,注册自定义函数时需要准备编译好的动态库文件和函数定义,以下会以实际操作举例。 数据类型首先需要先明确,数据库中支持的数据类型在使用自定义C函数操作时,必须将数据库中的数据类型转换为数据库内核可以处理的相关类型,实际上数据库内核在处理内置函数输入时也是类似的操作:例如比较常见的sql类型C类型smallintint16integerint32bigintint64texttext*常见的几种类型中,需要注意的是,对text类的函数,C函数在实际处理时往往不是直接使用 gaussdb 内部的 text\* 类型进行处理的,而是使用C语言的标准类型 char\* 进行处理的。这种情况下就可以先读取到入参的地址,再通过gauss提供的内置C函数(比如简单常用的TextDatumGetCString)转换为 char\* 类型字符串进行操作。应用实例下面以两个简单的HelloWorld例子来说明自定义C函数创建的整体流程。1. 最大公约数最大公约数的计算比较简单,但内部必然会涉及循环,使用SQL实现只能通过类似PL/pgSQL自定义函数或存储过程的方法,如果要达到极限性能的话可以尝试使用自定义C函数实现。  如果以正常的C/C++实现,我们可能会这样来编写代码int gcd_c(int a, int b){     int c = a%b;     while(c) {         a = b;         b = c;         c = a%b;     }     return b;}如果转换成gauss可用的C函数需要进行改造,例如改造成如下文件,并命名未gcd.cpp://postgres.h和fmgr.h为gauss中C函数固定宏和基本定义的头文件#include "postgres.h"#include "fmgr.h"//PG_MODULE_MAGIC为固定调用宏,自定义c函数必须在文件开始位置包含PG_MODULE_MAGIC;//下面两行也是固定调用,这两行可以指定出一个对外开放,并可在自定义C函数创建时被引用的函数//其中gcd为动态库对外可见接口,后面定义C函数时会用到extern "C" Datum gcd(PG_FUNCTION_ARGS);PG_FUNCTION_INFO_V1(gcd);//实际处理函数int gcd_c(int a, int b){     int c = a%b;     while(c) {         a = b;         b = c;         c = a%b;     }     return b;}//主入口函数//PG_FUNCTION_ARGS是一个固定宏,实际是一个入参出参相关信息的结构体Datumgcd(PG_FUNCTION_ARGS){         //入参阶段     //检查 参数是否为空,如果为空,返回空,相当于对空做检查,防止创建函数时未指定strict属性,导致函数执行异常     if(PG_ARGISNULL(0) || PG_ARGISNULL(1)){         PG_RETURN_NULL();     }     //PG_GETARG_INT32(n)表示从PG_FUNCTION_ARGS结构体中抽取入参的第n个参数,并返回为int32类型     int32        arg1 = PG_GETARG_INT32(0);     int32        arg2 = PG_GETARG_INT32(1);     //调用实际执行函数     int32 res = gcd_c(arg1, arg2);     //返回阶段     PG_RETURN_INT32(res);  }编译动态库,编译时请保证gcc/g++>=5.4g++ -c -fpic -Wno-write-strings -fstack-protector-all gcd.cpp -I ${GAUSSHOME}/include/postgresql/server/cfunction g++ -shared -fPIC -Wl,-z,now -o gcd.so gcd.o执行创建C函数命令:create or replace function gcd_my(integer,integer)returns integeras 'xxxxx/gcd.so', 'gcd'language c strict not fenced immutable shippable;这个命令中gcd_my表示后面sql中调用该C函数时使用的名字xxxxxx/gcd.so表示的是当前环境上编译生成动态库放置的位置language c表示该自定义函数为C语言编写的函数not fenced表示该函数执行时使用的是非fenced模式(该模式后面小节会再次说明)strict表示输入不能为空,否则返回也为空(上部分C函数虽然以对空值做了处理,当前为了说明问题,此处也声明了strict属性)其余部分为create function的公共内容,具体可以参考手册中create function章节执行函数select gcd_my(12, 16);2. 将字符串中的第一个字母大写,其他小写内置的字符串处理函数中有大小写转换函数,但没有这种类似只有第一个字符进行大小写转换的定制化函数,如此,我们就可以尝试使用自定义C函数进行实现。  如果以正常的C/C++语言操作,我们可能会这样来写#include <string.h>void upper_str(char* str){     bool has_first = false;     for(int i = 0; i< strlen(str); i++){         if((str[i]>='a' && str[i]<='z') || (str[i]>='a' && str[i]<='z')) {             if(has_first) {                 str[i]=str[i]%0x20 + 'a';             } else {                 str[i]=str[i]%0x20 + 'A';             }         }     }}如果转换成gauss可用的C函数可以改造成如下文件,并命名未upper_str.cpp:#include "postgres.h"#include "fmgr.h"//builtins.h中存在下面使用的TextDatumGetCString的定义#include "utils/builtins.h"#include <string.h>PG_MODULE_MAGIC;extern "C" Datum upper_str(PG_FUNCTION_ARGS);PG_FUNCTION_INFO_V1(upper_str);//实际处理函数void upper_str_c(char* str){     bool has_first = false;     for(int i = 0; i< strlen(str); i++){         if((str[i]>='A' && str[i]<='Z') || (str[i]>='a' && str[i]<='z')) {             if(has_first) {                 str[i]=str[i]%0x20 + 'a' - 1;             } else {                 str[i]=str[i]%0x20 + 'A' - 1;                 has_first=true;             }         }     }}//主入口函数Datumupper_str(PG_FUNCTION_ARGS){         //入参阶段     if(PG_ARGISNULL(0)){         PG_RETURN_NULL();     }     Datum source = PG_GETARG_DATUM(0);     char *src = TextDatumGetCString(source);          //实际调用函数    (void) upper_str_c(src);          //返回阶段     //cstring_to_text可以将char*类型转换为gauss内置的text*类型     //PG_RETURN_TEXT_P宏可以返回text*类型的结构,被上层调用获取     PG_RETURN_TEXT_P(cstring_to_text(src));  }执行创建C函数命令:create or replace function upper_str_my(text)returns textas 'xxxxxx/upper_str.so', 'upper_str'language c strict not fenced immutable shippable;执行函数select upper_str_my('@hello World');注意事项1. fenced/not fenced 模式C函数在注册时有一个选项时fenced,这个模式是gauss提供的一种进程隔离机制。如果在fenced模式下实际执行的函数会放在一个单独启动的进程中执行,而not fenced模式则是在实际执行时和gaussdb同一进程。两种模式各有优劣,需要根据实际情况进行选择。比较建议的方式是,受限创建为fenced模式函数,调试无问题后,再重新注册为not fenced模式,以高效率模式运行。    * fenced模式    优点:执行更安全,如果函数执行出现异常,不会影响到CN/DN进程,保证整个节点的稳定运行;      缺点:需要额外的进程开销,效率较低。      * not fenced模式正好相反      优点:运行效率高,无额外开销;      缺点:如果自定义C代码编码有问题,容易造成CN/DN进程异常等严重问题。2. C函数编写时,需要注意注册时的参数类型和返回类型,系统会根据创建函数时指定的内容传给实际执行的函数,所以如果函数内部处理和创建时指定类型不一致容易出现不可预测的异常3. C函数编写时,需要注意对空值进行特殊处理,或者再创建函数时指定为strict属性的函数3. C函数实现时都是底层实现,应该严格控制不可靠C函数的创建,坚持慎重使用自定义C函数的原则4. C函数创建只能由具有sysadmin权限的用户进行创建,可以通过grant操作赋予其他用户执行权限总结自定义C函数的存在给用户提供了直接实现底层逻辑的机会,一个实现完善的自定义C函数,往往可以给业务带来极强的定制性和大幅度的性能提升。但定制性也是一把双刃剑,如果编写自定义C函数时做的不够完善存在逻辑问题,甚至内存溢出等严重问题,也极可能使系统崩溃。因此可以使用自定义C函数作为一个强有力的工具为实际业务增光添彩,但也需要谨慎的创建使用任意一个C函数避免误伤其他业务。原文链接:https://bbs.huaweicloud.com/blogs/227220【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [测试] GaussDB(DWS)流式数据入库实践三:Java接口
    【摘要】 JDBC接口实现GaussDB(DWS)流式数据入库。GaussDB(DWS)数据入库方式主要有三种:INSERT/COPY/FDW,三者性能INSERT最差,FDW(gds外表/obs外表)性能最好,但在很多客户场景下都是流式数据,不额外落盘,需要直接入库,这种场景下可以采用copy方式入库,Java作为编程语言,广泛应用于互联网应用中,Java访问数据库使用的是JDBC接口,支持copymanager,示例程序如下:import java.sql.Connection;import java.sql.DriverManager;import java.util.Properties;import org.postgresql.copy.CopyManager;import org.postgresql.core.BaseConnection;import java.io.StringReader;public class copy_test { /**  * @param args  */ public static void main(String[] args) { // TODO Auto-generated method stub try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { System.out.println("can not find Driver"); e.printStackTrace(); } String url = "jdbc:postgresql://10.x.x.x:8000/postgres"; Properties props = new Properties(); props.setProperty("user", "jack"); props.setProperty("password", "Gauss_234"); try { Connection con = DriverManager.getConnection(url, props); con.setAutoCommit(false); CopyManager cm = null; StringReader sr = null; String quote = "$"; String delimter = "|"; String sql = "copy test from STDIN with (format 'CSV', delimiter '|', quote '$')"; System.out.println(sql); cm = new CopyManager((BaseConnection) con); StringBuffer tuples = new StringBuffer(); for (int j = 0; j < 3; j++) { tuples.append(quote + "1" + quote + delimter + quote + "a" + quote + "\n"); } sr = new StringReader(tuples.toString()); long rows = cm.copyIn(sql, sr);// 执行copy入库 con.commit();// 提交 con.close(); } catch (Exception se) { se.printStackTrace(); } }}原文链接:https://bbs.huaweicloud.com/blogs/226871【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [测试] GaussDB(DWS)流式数据入库实践二:C接口
    【摘要】 libpq接口实现GaussDB(DWS)流式数据入库。GaussDB(DWS)数据入库方式主要有三种:INSERT/COPY/FDW,三者性能INSERT最差,FDW(gds外表/obs外表)性能最好,但在很多客户场景下都是流式数据,不额外落盘,需要直接入库,这种场景下可以采用copy方式入库,C语言开发应用程序时,ODBC暂不支持copy接口,但libpq支持,示例程序如下:#include <string.h>#include <stdio.h>#include <stdlib.h>#include "./include/postgresql/server/libpq-fe.h"intmain(int argc, char **argv){const char *conninfo;     PGconn     *conn;           PGresult   *res;const char *buffer = "1,Jack\n2,Rose\n3,Tom";if (argc > 1){         conninfo = argv[1];     }else{         conninfo = "host=10.185.180.161 port=8000 dbname=postgres user=jack password=Gauss_234";                }     conn = PQconnectdb(conninfo);if (PQstatus(conn) != CONNECTION_OK){fprintf(stderr, "连接数据库失败: %s",PQerrorMessage(conn));                   }else{printf("连接数据库成功!\n");     }     res=PQexec(conn,"COPY test FROM STDIN DELIMITER ',';");if(PQresultStatus(res) != PGRES_COPY_IN){fprintf(stderr, "copy数据出错1: %s",PQresultErrorMessage(res));     }else{int len = strlen(buffer);if(PQputCopyData(conn,buffer,len) == 1){if(PQputCopyEnd(conn,NULL) == 1){                 res = PQgetResult(conn);if(PQresultStatus(res) == PGRES_COMMAND_OK){printf("copy数据成功!\n");                          }else{fprintf(stderr, "copy数据出错2: %s",PQerrorMessage(conn));                     }              }else{fprintf(stderr, "copy数据出错3: %s",PQerrorMessage(conn));                 }         }else{fprintf(stderr, "copy数据出错4: %s",PQerrorMessage(conn));                       }     }     PQclear(res);     PQfinish(conn);return 0;}原文链接:https://bbs.huaweicloud.com/blogs/226870【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [存储] GaussDB(DWS) GDS导入容错详解
    前言  GaussDB(DWS)作为一款数仓系统经常面临大批量数据的导入导出,并且需要在短时间内处理上百TB的数据,GaussDB针对这种场景提供了一款高性能的导入导出服务工具GDS(GaussDB data server)。本主要面向已经对GDS有了一定基础的同学,如果对GDS不是非常了解可以先查阅GaussDB(DWS)的官方文档。  在海量数据的导入场景下由于用户数据源的多样性会降低数据的质量,因此就需要GaussDB(DWS)需要具备一定的数据容错能力,比如对非法字符的替换,字符集转换转换的容错,多余字段的忽略,字段缺失补齐等等。本文将会从最基础的计算机知识和一个一个的例子开始,让大家慢慢的理解GaussDB(DWS)的容错原理。1.1. 如何判断文件的字符集编码?要想回答清楚这个问题,需要从很基础的概念说起,比如字符集是什么,什么是字符,但是直观起见我就用一个例子来帮助大家理解,来看下们最常用的编辑器工具"vim"是如何处理字符,字符集问题的。1. 编写一个hello.c程序,gcc hello.c -o hello 生成一个hello文件。#include<stdio.h> int main() {  printf("hello world."); }2. vim打开hello^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ð^D@^@^@^@^@^@Ð^D@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^A^@^@^@^@^@^@^@^L^@^@^@^@^@^@^@È^C@^@^@^@^@^@^M^@^@^@^@^@^@^@´^E@^@^@^@^@^@^Y^@^@^@^@^@^@^@^P^N`^@^@^@^@^@^[^@^@^@^@^@^@^@^H^@^@^@^@^@^@^@^Z^@^@^@^@^@^@^@^X^N`^@^@^@^@^@^\^@^@^@^@^@^@^@^H^@^@^@^@^@^@^@õþÿo^@^@^@^@<98>^B@^@^@^@^@^@^E^@^@^@^@^@^@^@^X^C@^@^@^@^@^@^F^@^@^@^@^@^@^@¸^B@^@^@^@^@^@ ^@^@^@^@^@^@^@?^@^@^@^@^@^@^@^K^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@^U^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^@^@^@^@^@^@^@^P`^@^@^@^@^@^B^@^@^@^@^@^@^@0^@^@^@^@^@^@^@^T^@^@^@^@^@^@^@^G^@^@^@^@^@^@^@^W^@^@^@^@^@^@^@<98>^C@^@^@^@^@^@^G^@^@^@^@^@^@^@<80>^C@^@^@^@^@^@^H^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@   ^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@þÿÿo^@^@^@^@`^C@^@^@^@^@^@ÿÿÿo^@^@^@^@^A^@^@^@^@^@^@^@ðÿÿo^@^@^@^@X^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@(^N`^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^F^D@^@^@^@^@^@^V^D@^@^@^@^@^@^@^@^@^@GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-36)^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^A^@8^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^B^@T^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^C^@t^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^D^@<98>^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^E^@¸^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^F^@^X^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^G^@X^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^H^@`^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@  ^@<80>^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@ @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @ "hello" [noeol][converted] 4L, 8799C有经验的同学看到文件中大量的^@时候就会说,这是一个二进制文件,但是我们又是如何判断说这是一个二进制文件的呢? 3. vim 命令模式中使用:set fileencoindgs 可以查看vim在当前的环境下提供了哪些用来处理数据的字符集。@^E^@^@^@^@^@^@^@^X^C@^@^@^@^@^@^F^@^@^@^@^@^@^@¸^B@^@^@^@^@^@ ^@^@^@^@^@^@^@?^@^@^@^@^@^@^@^K^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@^U^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^@^@^@^@^@^@^@^P`^@^@^@^@^@^B^@^@^@^@^@^@^@0^@^@^@^@^@^@^@^T^@^@^@^@^@^@^@^G^@^@^@^@^@^@^@^W^@^@^@^@^@^@^@<98>^C@^@^@^@^@^@^G^@^@^@^@^@^@^@<80>^C@^@^@^@^@^@^H^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@   ^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@þÿÿo^@^@^@^@`^C@^@^@^@^@^@ÿÿÿo^@^@^@^@^A^@^@^@^@^@^@^@ðÿÿo^@^@^@^@X^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@(^N`^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^F^D@^@^@^@^@^@^V^D@^@^@^@^@^@^@^@^@^@GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-36)^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^A^@8^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^B^@T^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^C^@t^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^D^@<98>^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^E^@¸^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^F^@^X^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^G^@X^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^H^@`^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@  ^@<80>^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@ @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @   fileencodings=ucs-bom,utf-8,latin1可以看到当前linux语言环境下vim可以选用ucs-bom(windos为多字节字符提供的bom头机制),utf8,和latin1字符集来识别文件中的数据。4. 继续在vim命令模式中使用:set fileencoding 可以查看当前vim最终选择了哪个字符集来编码数据。^@^@^@^@È^C@^@^@^@^@^@^M^@^@^@^@^@^@^@´^E@^@^@^@^@^@^Y^@^@^@^@^@^@^@^P^N`^@^@^@^@^@^[^@^@^@^@^@^@^@^H^@^@^@^@^@^@^@^Z^@^@^@^@^@^@^@^X^N`^@^@^@^@^@^\^@^@^@^@^@^@^@^H^@^@^@^@^@^@^@õþÿo^@^@^@^@<98>^B@^@^@^@^@^@^E^@^@^@^@^@^@^@^X^C@^@^@^@^@^@^F^@^@^@^@^@^@^@¸^B@^@^@^@^@^@ ^@^@^@^@^@^@^@?^@^@^@^@^@^@^@^K^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@^U^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^@^@^@^@^@^@^@^P`^@^@^@^@^@^B^@^@^@^@^@^@^@0^@^@^@^@^@^@^@^T^@^@^@^@^@^@^@^G^@^@^@^@^@^@^@^W^@^@^@^@^@^@^@<98>^C@^@^@^@^@^@^G^@^@^@^@^@^@^@<80>^C@^@^@^@^@^@^H^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@   ^@^@^@^@^@^@^@^X^@^@^@^@^@^@^@þÿÿo^@^@^@^@`^C@^@^@^@^@^@ÿÿÿo^@^@^@^@^A^@^@^@^@^@^@^@ðÿÿo^@^@^@^@X^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@(^N`^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^F^D@^@^@^@^@^@^V^D@^@^@^@^@^@^@^@^@^@GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-36)^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^A^@8^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^B^@T^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^C^@t^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^D^@<98>^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^E^@¸^B@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^F^@^X^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^G^@X^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@^H^@`^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@  ^@<80>^C@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^C^@ @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @                                                                                                                                                                                                             @   fileencoding=latin1可以看到vim最终选择了latin1来编码数据。其实vim 会顺序的从fileencodings中选择字符集,首先选择bom头发现编码失败,然后尝试使用utf8字符集编码发现还是失败,最后无奈之下只能使用latin1这种万能编码,总之先到先得。当前我使用linux系统语言环境字符集 LANG=en_US.UTF-8如果fileencodings中的编码全都编码失败,则会选择linux操作系统语言环境的字符集UTF8强制编码,编码失败则对非法字符做容错处理。1.1.2. 回过头再看文件中的'^@'是什么    通过:help digraph-table命令可以查看vim的不可见字符的替换表,也就是说vim的屏显功能在实现的时候会将‘00’替换成两个可见字符‘^@’,所以并不是说包含"^@"的文    件就是二进制文件。char  digraph   hex     dec     official name ^@      NU      0x00      0     NULL (NUL) ^A      SH      0x01      1     START OF HEADING (SOH) ^B      SX      0x02      2     START OF TEXT (STX) ^C      EX      0x03      3     END OF TEXT (ETX) ^D      ET      0x04      4     END OF TRANSMISSION (EOT) ^E      EQ      0x05      5     ENQUIRY (ENQ) ^F      AK      0x06      6     ACKNOWLEDGE (ACK) ^G      BL      0x07      7     BELL (BEL) ^H      BS      0x08      8     BACKSPACE (BS) ^I      HT      0x09      9     CHARACTER TABULATION (HT) ^@      LF      0x0a     10     LINE FEED (LF) ^K      VT      0x0b     11     LINE TABULATION (VT) ^L      FF      0x0c     12     FORM FEED (FF) ^M      CR      0x0d     13     CARRIAGE RETURN (CR) digraph.txt.gz [Help][RO]总结:所有的文件本质上都是一串二进制数据流,根本没有什么方绝对的方法可以判断一个文件的内容是什么字符集编码的,即使强如vim也只能尝试着去判断文件的编码,并顺其自然。我们没有什么好的方法去判断一个文件确切的是什么编码,因为文件的编码取决于数据是否满足相应的字符集编码。2.1. 非法字符和乱码继续举例,现有一串字节流:"e4b8bc4042" 如果用utf8字符集编码则得到的结果是“丼@B”,如果用GBK编码则得到的是“涓粿B”,通过不同的字符集编码都能得到合法的字符串,那么哪一个叫乱码呢?乱码:数据本身可以被多种字符集规则识别,校验,只是未按照预期的规则对数据编码。如果上面的字节流稍加修改,"e4b8bc4042"->"e4b8bc",如果用utf8编码则得到的是“丼”,如果用GBK编码则得到的是"涓"和一个非法字符"bc"."bc"被认定为非法字符的原因是bc不能被GBK字符集规则识别,校验,‘bc’只是GBK字符的前半部分属于半个GBK字符。关于GBK的编码规则下面会做介绍。非法字符:在GaussDB(DWS)中不满足指定的字符集规则或者不能转换成目标字符集的字符被称作非法字符。不能转换这个很好理解,我们都知道UTF8所包含的字符数远远大于GBK做能包含的字符数,因此肯定有某些字符包含在UTF8中但不包含在GBK中,比如: "䙑"它虽然不是一个GBK字符但是它一个utf8字符,因此对于GBK来说他就是一个非法字符。同时GaussDB(DWS)中还有有一个特殊的非法字符"0x00"所以应用程序程序本身不可能去帮用户解决乱码的问题,因为在应用程序看来乱码也是一串合法的数据,解决乱码问题需要用户清楚自己文件内容的字符集编码,但是应用程序可以尽可能的去帮助用户解决或者规避非法字符问题。 2.2. 非法字符和乱码处理前面已经说了乱码本质上是不是数据的问题,只是因为选择错了字符集编码,但是一般程序可以对非法字符做一定的处理。我们还是先看下vim是如何处理非法字符的,以便于理解GaussDB(DWS)的处理方式。前置:1. linux 环境,语言环境.UTF-82. ~/.vimrc中添加  set fileencodings=""  ##强制vim不要从fileencodings中选择字符集编码数据,当fileencodings为空时会选择当前语言环境的字符集作为数据编码的字符集。3. cat utf8.txt 添加内容并保存中华人民共和国4. vim -b utf8.txt   将“国”的十六进制“e5 9b bd”认为修改为非法的UTF8字符 “e5 ff bd”,utf8的编码规则下面有说明。     :%!xxd -r 保存。5. vim utf8.txt  查看更改后的数据中华人民共和???显然后面的非法字符‘e5 ff bd’的每一个字节都被替换成"?",这也正是vim的容错处理,事实上GaussDB(DWS)也是这么做的。例如”0x00“在GaussDB(DWS) 中是一个非法字符。当用户设置compatible_illegal_chars=true时会将“0x00”替换成空格,将其他的非法字符替换成"?"否则将会报错 invalid byte sequence for encoding "UTF8": 0x002.3. GaussDB(DWS)导入数据时的字符编码处理GaussDB本质上也是一个应用程序因此和vim一样也会有字符和字符集的处理功能,但是出于功能和性能的考虑GaussDB(DWS)肯定不能像编辑器那样遍历字符集列表选择字符集。 GaussDB在使用GDS导入数据时候会让用户提供导入文件的字符集编码,如果用户没有提供,GaussDB(DWS)会认为用户数据的字符编码和数据库的字符编码是一致的。目前GaussDB(DWS)数据库只支持库级别的编码设置,不能对表单独设置字符集,共支持如下四种编码方式:UTF8、GBK、Latin1、SQL_ASCII按导入文件字符编码方式跟数据库字符编码方式的组合,正交验证各种编码方式下,非法字符是否能容错导入导入文件字符编码方式数据库字符编码方式UTF8GBKLatin1SQL_ASCIIUTF8UTF8编码校验UTF8转换至GBKUTF8转换至Latin1UTF8编码校验GBKGBK转换至UTF8GBK编码校验GBK转换至Latin1GBK编码校验Latin1除0x00外均合法不兼容不校验/除0x00外均合法除0x00外均合法SQL_ASCIIUTF8编码校验GBK编码校验除0x00外均合法不校验/除0x00外均合法注:表中红色字体为8.0.0.5以下版本规格。SQL_ASCII字符集概述:ASCII的扩展字符集,8bit,可以存储除0x00外的任意字节流(GaussDB(DWS)的万能编码)UTF8字符集概述:Unicode字符集具体的编码实现,1-4字节变长字节编码非法取值范围1字节:[0x80, 0xc2]或者(0xf4, 0xff];2字节:1字节为0xe0并且(2字节处于[0x00, 0xa0)或者(0xbf, 0xff]);1字节为0xed并且(2字节处于[0x00, 0x80)或者(0x9f, 0xff]);1字节为0xf0并且(2字节处于[0x00, 0x90)或者(0x8f, 0xff]);1字节为0xf4并且(2字节处于[0x00, 0x80)或者(0xbf, 0xff]);2字节处于[0x00, 0x80)或者(0xbf, 0xff]3字节:3字节处于[0x00, 0x80)或者(0xbf, 0xff];4字节:4字节处于[0x00, 0x80)或者(0xbf, 0xff]。Gaussdb(DWS)GBK字符集概述:国家简体中文字符集,使用2字节表示中文等字符有效值范围:高字节从81到FE,低字节从40到FE,剔除xx7F一条线。建议: GaussDB(DWS)支持GBK字符集编码,虽然GBK字符集比UTF8编码占用的存储空间小,但是GBK字符集编码的字符数远远小于UTF8, 如果用户将UTF8的数据导入GBK的库会存在数据丢失的风险,因此仍然不建议使用GBK字符集作为数据库编码。3.1. GaussDB(DWS)在GDS导入数据的时候实现自动的进行编码转换3.2. GaussDB(DWS) GDS导入自动转换过程3.2.1. 数据读取 DN读取原始数据d6d0b9fa。3.2.2. GBK编码校验当外表参数和数据库参数不同时候数据库会对读取的数据做编码校验,GBK字符集的"中"首字节为'd6' 大于'7f'说明将要解析的字符为多字节字符,且在GBK字符集规定的高字节范围(81->fe)内,说明该多字节字符的长度一定为2,因此还需要继续向下读取一个字节'd0',该字节范围在GBK字符集规定的低字节范围(00->fe)内,说明该多字节字符是一个合法的GBK字符。3.2.3 编码转换GaussDB(DWS)内部定义了很多编码映射文件,其中就包含了GBK和utf8的映射关系,然后从GBK->utf8的map文件中找到"d6d0"这个key就可以找到对应的UTF8的十六进制编码:"e4b8ad",最后将转换后的UTF8字符写入数据库中且该字符占用了3个字节。4. GaussDB(DWS)容错措施4.1. 数据错入错出数据库和GDS的外表参数都设置成sql_ascii编码。sql_ascii字符集编码也叫错入错出编码,当数据库设置为sql_ascii编码后数据库不会对数据进行编码但是会校验数据中是否包含0x00,其他字符都会原样入库。latin1和sql_ascii 都属于单字节字符编码,虽然可以给用户带来方便,但是强烈不建议用户使用这一类编码,因为没有了数据自身的校验约束机制,一旦某张表被写入了多种编码的数据,这张表的可维护性将变得极低。4.2. 非法字符替换 当用户设置compatible_illegal_chars=true时会将非法字符“0x00”替换成空格,否则会产生如下报错 invalid byte sequence for encoding "UTF8": 0x00当用户设置compatible_illegal_chars=true时GaussDB(DWS)会将不能被识别的字符和不能转换的字符替换成"?", 否则也会报错## 不能被转换时 ERROR:  character with byte sequence 0xe4 0x99 0x91 in encoding "UTF8" has no equivalent in encoding "GBK" ## 不能被识别时 invalid byte sequence for encoding "UTF8": 0xe5 0xff 0xbd4.3. 错误表机制        错误表机制只会在数据导入时生效,也就是说只有执行insert into select * from "GDS外表" 时错误表机制才会生效,单纯的查询外表是不会触发错误表机制的。         数据导入过程中发生的错误,一般分为数据格式错误和非数据格式错误。数据格式错误包括编码编码转换错误,不能识别的编码,和非法字符,多列少列,数据类型错误,非空约束,唯一约束,字段过长等等。在创建外表时,通过设置参数“LOG INTO error_table_name”,将数据导入过程中出现的数据格式错误信息写入指定的错误信息表error_table_name中。您可以通过以下SQL,查询详细错误信息。1postgres=# SELECT * FROM error_table_name;错误信息表结构如表1所示。表1 错误信息表列名称类型描述nodeidinteger报错节点编号。begintimetimestamp with time zone出现数据格式错误的时间。filenamecharacter varying出现数据格式错误的数据源文件名。rownumbigint在数据源文件中,出现数据格式错误的行号。rawrecordtext在数据源文件中,出现数据格式错误的原始记录。detailtext详细错误信息。非数据格式错误对于非数据格式错误,一旦发生将导致整个数据导入失败。您可以根据执行数据导入过程中,界面提示的错误信息,帮助定位问题,处理。     根据获取的错误信息,请对照下表,处理数据导入错误。错误信息原因解决办法missing data for column "r_reason_desc"数据源文件中的列数比外表定义的列数少。对于TEXT格式的数据源文件,由于转义字符(\)导致delimiter(分隔符)错位或者quote(引号字符)错位造成的错误。示例:目标表存在3列字段,导入的数据如下所示。由于存在转义字符“\”,分隔符“|”被转义为第二个字段的字段值,导致第三个字段值缺失。BE|Belgium\|1由于列数少导致的报错,选择下列办法解决:在数据源文件中,增加列“r_reason_desc”的字段值。在创建外表时,将参数“fill_missing_fields”设置为“on”。即当导入过程中,若数据源文件中一行数据的最后一个字段缺失,则把最后一个字段的值设置为NULL,不报错。对由于转义字符导致的错误,需检查报错的行中是否含有转义字符(\)。若存在,建议在创建外表时,将参数“noescaping”(是否不对'\'和后面的字符进行转义)设置为true。extra data after last expected column数据源文件中的列数比外表定义的列数多。在数据源文件中,删除多余的字段值。在创建外表时,将参数“ignore_extra_data”设置为“on”。即在导入过程中,若数据源文件比外表定义的列数多,则忽略行尾多出来的列。invalid input syntax for type numeric: "a"数据类型错误。在数据源文件中,修改输入字段的数据类型。根据此错误信息,请将输入的数据类型修改为numeric。null value in column "staff_id" violates not-null constraint非空约束。在数据源文件中,增加非空字段信息。根据此错误信息,请增加“staff_id”列的值。duplicate key value violates unique constraint "reg_id_pk"唯一约束。删除数据源文件中重复的行。通过设置关键字“DISTINCT”,从SELECT结果集中删除重复的行,保证导入的每一行都是唯一的。1postgres=# INSERT INTO reasons SELECT DISTINCT * FROM foreign_tpcds_reasons;value too long for type character varying(16)字段值长度超过限制。在数据源文件中,修改字段值长度。根据此错误信息,字段值长度限制为VARCHAR2(16)。4.4. conflict_delimiter参数解决字段分割符被非法字符"感染"conflict_delimiter 参数解决源数据中因为某种原因只包含了多字节字符的前半部分,导致该半个字节和分隔符被编码成一个字符导致的数据格式错误例如:假设有一行GBK数据"3|+|膢+|20191212"要被导入到UTF8的数据库,用户自定义的字段分割符为"|+|"。这行GBK数据和十六进制对应关系如下33 7C 2B 7C C4 7C 2B 7C 323031393132313 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 3 | + | ** | + | 20191212当导入UTF8数据库时,数据库会发生如下转换。GBK -> UTF8 33->33 (3) 7C->7C (|) 2B->2B (+) 7C->7C(|) C47C-> E886A2(膢) 2B->2B(+) 7C->7C(|) 323031393132313-> 20191212由于用户定义的字段分割符号为"|+|",因此对改行数据分割后获取的数据是3,膢+|20191212,实际上用户可能要获得的是3,?,20191212。"膢" 这个字符其实是一个用户不期望的半个字符,和用户定义的分割符“|+|”中的“|”产生了冲突,导致数据错乱或者导入失败。如果用户想要忽略这种字符可以使用conflict_delimiterr配合compatible_illegal_chars参数将“C4”这个半个GBK字符准换成“?”导入UTF8数据库。原文链接:https://bbs.huaweicloud.com/blogs/224473【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS)集群管理系列:CM组件介绍(核心功能)
    【摘要】 集群管理 CM 组件与各类实例的主备数据同步、倒换、重建等机制高度融合,通过告警、重启、倒换、隔离等手段,赋予数据库实例故障恢复及自愈的高可用(HA)能力,保证数据的可靠性和完整性,最终实现集群对外的业务连续性。GaussDB (DWS) CM 组件核心功能介绍本文在《GaussDB (DWS) 集群管理系列:CM组件介绍(架构和部署形态)》所介绍基本结构的基础上,展示 CM 组件的核心功能,包括状态查询、集群起停、故障恢复和异常检测等。这些功能结合告警、重启、倒换、隔离等手段,与各类实例组件的主备数据同步、倒换、重建等机制一起,构建数据库的高可用(HA)能力,实现集群的对外连续性。集群状态查询通过 cm_ctl query -Cv 可以查看当前集群的整体状态和各实例状态(详细参数说明本文不做介绍,可通过执行 cm_ctl --help 查看)。以下图为例,整个数据库集群部署了3 个 CN,分别是 5001, 5002, 5003;1 组主备 GTM,分别是 1001, 1002三组 DN,主 DN 分别对应 6001, 6003, 6004此外还可看出cluster_state 属性为 normal,说明整个集群属于正常状态balanced 属性为 Yes,说明 GTM 和 DN 均未发生主备倒换DN 6001, 6002, 3002 为 1 个主备从结构(6003 和 6005 类似)发生过主备倒换的集群,状态参考下面示例图(只显示部分状态,其中6001 和 6002 发生主备倒换;balanced 显示 No;集群仍然是 Normal 状态)。如果有实例发生故障,状态参考下面示例图(只显示部分状态,其中 6001 被手动停止,6002 升主;集群处于 Degraded 状态,表明集群仍可继续提供服务)。如果一组 DN 主备从多个发生故障,则状态参考下面示例图(只显示部分状态,其中 6001 被手动停止,6002 磁盘故障无法被拉起;集群处于 Unavaliable 状态,无法提供服务)。启动和停止集群的启动和停止可分为集群级、节点级和实例级等。集群级:启动和停止集群中的所有节点和实例节点级:启动和停止集群中的某个节点实例级:启动和停止集群中的某个节点的某个实例节点内的启动顺序为:① 系统定时任务拉起 OM Monitor 进程② OM Monitor 进程拉起 CM Agent 进程③ CM Agent 进程拉起节点内的 CN,DN,GTM,CM Server 等部署的实例进程以集群级起停为例,cm_ctl 命令和输出示例见下图。故障恢复数据库故障恢复主要指实例发生明确的故障时,CM 组件根据探测到的状态进行仲裁,从而尽可能恢复集群可用性的过程。单节点故障场景在生产环境中不可避免以某个主 DN 故障为例,一次典型的仲裁流程包括:① CM Agent 1探测DN主实例并发现故障② CM Agent 1持续上报实例故障信息至CM Server③ CM Server执行仲裁流程,选择DN备机升主④ CM Server下发升主命令至CM Agent 2⑤ CM Agent 2对实例执行升主操作常见故障类型有(限于篇幅,本文不做具体分析):磁盘故障磁盘损坏慢盘RAID卡损坏网络故障断网闪断时延丢包下电故障节点下电节点重启操作系统故障时间跳变IO过载磁盘空间不足文件句柄耗尽文件权限出错进程数耗尽进程异常退出进程僵死其它故障CPU/内存 损坏等对于不同的实例故障,CM 恢复手段(不同场景下恢复时间 30 秒到 30 分钟不等)主要包括:CN 故障DDL 语句无法执行,DML 语句不受影响通过将故障 CN 剔除,可保障 DDL 语句不受影响仅支持集群内 CN 个数大于 3,且 1 个 CN 发生故障时剔除DN 故障单点故障可自动恢复主 DN 故障时,仲裁备 DN 升主继续提供服务备 DN 故障时,主 DN 将日志和数据同步至从备,业务不受影响主 GTM 故障备 GTM 升主后继续提供服务主 CM Server 故障备 CM Server 接受多数派 CM Agent链接,升主后继续提供服务异常检测从业界经验来看,数据库实例可能处于故障、僵死、亚健康等状态。这些状态的出现概率逐级降低,但检测难度逐级增高。尤其是如何区分亚健康状态和系统繁忙状态,具有较大的挑战性。CM 组件包含异常检测流程,可用于识别和处理网络不稳定、磁盘 IO 挂死、进程/线程僵死、进程频繁退出、实例状态时好时坏等场景,提高集群的稳定性和可用性。以 DN 短链接检测为例,CM Agent 按照固定时间间隔与 DN 实例新建链接。如果与某个主 DN 链接失败或通过新链接无法执行 SQL 语句,则认为该 DN 发生 1 次 Hang 异常。如果多次出现异常,则会触发 Hang 检测机制,将该 DN 实例杀死并执行主备切换。目前常见的异常检测项有:短链接建立通过短链接执行 SQL 语句IO 挂死内存占用异常注:长短链接的概念是相对的。CM Agent 检测实例状态时也会与实例建立链接,通常情况下不会释放,因此称为“长链接”;异常检测流程建立链接并执行 SQL 后随即释放,因此称为“短链接”。原文链接:https://bbs.huaweicloud.com/blogs/224005【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS)云端运维系列第五期:集群安全(审计日志,审计日志转储)
    GaussDB(DWS)集群安全之审计日志GaussDB(DWS)审计日志是GaussDB集群安全保障的重要手段,GaussDB(DWS) 使用云审计服务,可以记录GaussDB(DWS) 管理控制台的关键操作事件,记录下的日志可用于支撑安全分析、合规审计、资源跟踪和问题定位等常见应用场景。针对此功能本次介绍分为两部分,第一部分介绍设置GaussDB(DWS)审计日志,第二部分是转储GaussDB(DWS)审计日志。设置GaussDB(DWS)审计日志操作场景GaussDB(DWS) 支持对特定数据库操作记录审计日志,包括:日志保留策略、用户越权访问、存储过程以及对数据库对象的DML、SELECT、COPY和DDL操作。审计日志配置后,当GaussDB(DWS) 集群状态异常,或根据业务需要,用户可以查询审计信息确定故障原因或定位历史操作记录。前提条件数据库审计日志在集群的“安全配置”页面中进行设置,仅“可用”和“低性能”状态的集群才支持修改安全配置,同时集群的任务信息不能处于“创建快照中”、“节点扩容”、“配置中”和“重启中”。操作步骤登录GaussDB(DWS) 管理控制台。单击“集群管理”。在集群列表中,单击指定集群的名称,然后单击“安全设置”。默认显示“配置状态”为“已同步”,表示页面显示的是数据库当前最新结果。     4. 在“审计配置”区域中,设置审计日志保留策略。     图1 审计日志保留策略详细信息如表1所示。表1 审计日志保留策略参数名说明审计日志保留策略设置审计日志保留策略,支持如下两种策略:o    “空间优先”:表示当单个节点的审计日志超过1G后,将自动淘汰审计日志。o    “时间优先”:表示在“审计日志最小保存时间(天)”内会保留审计日志,超过时间后,根据存储容量限制(单个节点1G),对审计日志进行自动淘汰。默认策略是“空间优先”。说明:版本号为1.0.0和1.1.0的集群不支持设置审计日志保留策略。审计日志最小保存时间(天)当“审计日志保留策略”设置为“时间优先”策略时,该参数有效。可选天数为0~730天,默认值为90天。      5.根据需要设置以下操作的审计开关。      图2 审计项各审计项的详细信息如表2所示。表2 审计项参数名说明审计用户越权访问操作表示是否记录用户的越权访问操作,默认关闭。审计DML操作表示是否对数据表的INSERT、UPDATE和DELETE操作进行记录,默认关闭。审计SELECT操作表示是否对SELECT操作进行记录,默认关闭。审计存储过程执行表示是否在执行存储过程和自定义函数的时候记录操作信息,默认关闭。审计COPY操作表示是否对COPY操作进行记录,默认关闭。审计DDL操作表示是否对指定数据库对象的CREATE、DROP和ALTER操作进行记录。除“Database”、“Schema”和“User”默认启用记录,其他默认关闭。GaussDB(DWS) 除了支持表2的审计功能,默认还开启了如表3所示的关键审计项。表3 关键审计项参数名说明关键审计项记录用户登录成功、登录失败和注销的信息。记录数据库启动、停止、恢复和切换审计信息。记录用户锁定和解锁功能信息。记录用户权限授予和权限回收信息。记录SET操作的审计功能。       6.设置是否开启审计日志转储功能。      7.单击“应用”。单击,“配置状态”显示为“应用中”,表示系统正在保存配置。等待一段时间后再次刷新“配置状态”,当显示为“已同步”,表示已保存配置并生效。转储数据库审计日志GaussDB(DWS) 记录您的数据库中的连接和用户活动相关信息。这些审计日志信息有助于您监控数据库以确保安全或进行故障排除或定位历史操作记录。当前这些审计日志默认存储于数据库中,您还可以将审计日志转储到OBS中使负责监控数据库中活动的用户更方便的查看这些日志信息。您可以在GaussDB(DWS) 管理控制台进行如下操作:开启审计日志转储GaussDB(DWS) 集群创建成功后,您可以为集群开启审计日志转储,将审计日志转储到OBS中,方便查看。开启审计日志转储前需满足如下条件:已创建用于存储审计日志的OBS桶。     开启审计日志转储具体操作如下:登录GaussDB(DWS) 管理控制台。在左侧导航栏中,单击“集群管理”。在集群列表中,单击您想要开启审计日志转储的集群的名称,然后单击“安全设置”。在“审计配置”区域中,开启审计日志转储。每个区域的每个项目首次开启审计日志转储功能时,系统将提示您需创建名称为“DWSAccessOBS”的委托,委托创建成功后,GaussDB(DWS) 可以将审计日志转储至OBS中。默认情况下,只有华为云账号或拥有Security Administrator权限的用户才具备创建委托的权限。账号中的IAM用户,默认没有创建委托的权限,需联系有权限的用户在当前页面完成对GaussDB(DWS) 的委托授权。     图1 开启审计日志转储OBS桶:存储审计数据的OBS桶名称。如果没有可选择的OBS桶,可以单击“查看OBS桶”进入OBS管理控制台创建新的OBS桶。OBS路径:在OBS中存储审计文件的自定义目录。多级目录可用“/”进行分隔,不能以“/”开头。路径取值范围:1~50个字符。如果填写的OBS路径不存在时,系统会先创建该OBS路径再进行转储。转储周期(分):根据用户配置的时间,周期性的将数据转储到OBS中。取值范围:5~43200。单位为分钟。单击“应用”。“配置状态”显示为“应用中”,表示系统正在保存配置。等待一段时间后再次刷新“配置状态”,当显示为“已同步”,表示已保存配置并生效。修改审计日志转储开启审计日志转储后,您可以对转储配置进行修改,如修改日志存放的OBS桶和路径,转储周期等。修改审计日志转储具体操作如下:登录GaussDB(DWS) 管理控制台。在左侧导航栏中,单击“集群管理”。在集群列表中,单击您想要修改审计日志转储的集群的名称,然后单击“安全设置”。在“审计配置”区域中,修改审计日志转储配置。单击“应用”。“配置状态”显示为“应用中”,表示系统正在保存配置。等待一段时间后再次刷新“配置状态”,当显示为“已同步”,表示已保存配置并生效。查看审计日志转储记录开启审计日志转储后,您可以通过OBS查看转储的审计日志。查看审计日志转储记录具体操作如下:登录GaussDB(DWS) 管理控制台。在左侧导航栏中,单击“集群管理”。在集群列表中,单击您想要查看审计日志转储记录的集群的名称,然后单击“安全设置”。在“审计配置”区域中,单击“查看转储记录”。在弹出的“审计日记转储记录”弹出框中,单击“查看OBS桶”,进入OBS管理控制台。选择日志存放的OBS桶和文件夹进入查看具体的日志文件。     您可以选择将日志文件下载,解压并打开查看。审计日志文件字段说明如下。表1 审计日志文件字段说明名称描述time操作时间type操作类型result操作结果username执行操作的用户名database数据库名称client_conninfo客户端连接信息object_name操作对象名称detail_info执行操作详细信息node_name节点名称thread_id线程IDlocal_port本地端口号remote_port远端端口号关闭审计日志转储审计日志转储开启后,如果您不想将审计日志转储到OBS中,您可以将审计日志转储关闭。关闭审计日志转储具体操作如下:登录GaussDB(DWS) 管理控制台。在左侧导航栏中,单击“集群管理”。在集群列表中,单击您想要关闭审计日志转储的集群的名称,然后单击“安全设置”。在“审计配置”区域中,关闭审计日志转储开关。单击“应用”。“配置状态”显示为“应用中”,表示系统正在保存配置。等待一段时间后再次刷新“配置状态”,当显示为“已同步”,表示已保存配置并生效。原文链接:https://bbs.huaweicloud.com/blogs/223670【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS)集群管理系列:CM组件介绍(架构和部署形态)
    【摘要】 本文作为 GaussDB (DWS) 集群管理系列的第一篇,简要介绍数据库集群管理(Cluster Manager, 简称 CM)组件的架构和部署形态。CM组件架构CM 组件提供了四种服务 CM Agent, CM Server, OM Monitor, cm_ctl,与各类实例服务组件(CN, DN, GTM 等)一起构成了整个数据库集群系统。cm_ctlCM提供的外部接口工具,通过命令行执行集群的启动、停止、状态查询、主备倒换、备机重建等功能除启动和停止外,主要通过与 CM Server 的消息传递执行命令可在任意节点执行并获取到相同的结果对应 cm_ctl 二进制文件,非常驻服务OM Monitor由系统定时任务拉起负责 CM Agent 的运行状态监控对应 om_monitor 二进制文件,所有节点常驻服务CM Agent由 OM Monitor 拉起负责拉起和停止所在节点的 CN, DN, GTM, CM Server(如果存在);监控实例状态并上报至 CM Server;执行 CM Server 下发的命令等对应 cm_agent 二进制文件,所有节点常驻服务CM Server由 CM Agent 拉起,是整个集群管理组件的大脑负责接收 cm_ctl 发送的命令并下发至 CM Agent;接收并处理 CM Agent 上报的实例状态,下发仲裁指令保证各类故障和异常场景下集群的可用性对应 cm_server 二进制文件,常驻服务CM与各类组件的主备数据同步、倒换、重建等机制高度融合,提供告警、重启、倒换、隔离等手段,赋予数据库实例故障恢复及自愈的高可用(HA)能力,保证数据的可靠性和完整性,最终实现集群对外的业务连续性。典型集群部署形态GaussDB (DWS) 最常见的部署形态见下图。该部署形态的特点是多个 CN 对等在任意 CN 上执行 SQL 语句均可得到相同的结果GTM 主备架构主 GTM 故障后,备 GTM 升主提供服务DN 主备从架构数据通过 shard 的方式存储在多个主 DN 上,并且有两个副本,因此任意单点故障不会导致数据丢失可交叉部署成为安全环CM Server 主备架构主 CM Server 故障后,备 CM Server 升主提供服务一个三节点的部署示例如下。原文链接:https://bbs.huaweicloud.com/blogs/223321【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
总条数:2746 到第 页
上滑加载中