• [SQL] GaussDB(DWS)表权限案例集锦
    【摘要】 GaussDB(DWS)赋权案例集锦(持续更新...)。1. 假设当前有两个用户tom和jerry,如果想要用户jerry能够对当前tom创建的所有表以及将来创建的表都有查询权限,如何处理:-- 将用户tom下的同名schema权限赋给jerry grant usage on schema tom to jerry;-- 将用户tom已经创建的表的select权限赋给jerry grant select on all tables in schema tom to jerry;-- 将用户tom未来在同名schema下创建的表的select权限赋给jerry alter default privileges for user tom in schema tom grant select on tables to jerry;2. 如何查看某张表当前的权限情况pg_class中relacl字段表示当前的访问权限,可以从该字段查询当前哪些用户对该表有访问权限,该字段回显结果为:    rolename=xxxx/yyyy    --表示rolename对该表有xxxx权限,且权限来自yyyy    =xxxx/yyyy                  -- 表示public对该表有xxxx权限,且权限来自yyyypg_class该字段介绍可参考DWS帮助文档:https://support.huaweicloud.com/devg-dws/dws_04_0449.html#ZH-CN_TOPIC_0161912628__zh-cn_topic_0085032747_zh-cn_topic_0059778035_td89f8f6cc98f4a11a08b3c45d852a6cc例如:postgres=> select relname,relowner,relacl from pg_class where relname = 'tom_t1';  relname | relowner | relacl  ---------+----------+--------  tom_t1  |    25184 | (1 row)如果relacl字段为空,说明只有管理员账户和该表的创建者对该用户有查询权限;postgres=> select relname,relowner,relacl from pg_class where relname = 'tom_t1';  relname | relowner |             relacl              ---------+----------+--------------------------------  tom_t1  |    25184 | {tom=arwdDxt/tom,jerry=ar/tom}(1 row)本例中,relacl字段的含义是,用户tom对该表有全部权限,且权限来自tom;用户jerry对该表有select和insert权限,且该权限来自tom。其中,a表示insert权限,r表示select权限。其他权限参考以下表格:3. 某张表执行过 grant select on table t1 to public 导致所有用户对该表有读权限,如何针对某个用户回收权限场景构造:假设当前有两个普通用户use1和use2,当前数据库下有两张表t1和t2, 执行:grant select on table t1 to public;用户use1和use2对该表有访问权限,并且新建用户use3后,新用户use3对该表也有访问权限,且执行revoke select on table t1 from use3无效:test=# test=# revoke select on table t1 from use3;REVOKEtest=# \c - use3Password for user use3:  Non-SSL connection (SSL connection is recommended when requiring high-security)You are now connected to database "test" as user "use3".test=> test=> select * from t1;  a  ---(0 rows)test=> test=> select relname, relacl from pg_class where relname = 't1';  relname |                    relacl                      ---------+-----------------------------------------------  t1      | {liukunpeng=arwdDxt/liukunpeng,=r/liukunpeng}(1 row)这是因为之前执行过 grant select on table t1 to public 这条sql,该sql中关键字public表示该权限要赋予给所有角色,包括以后创建的角色,所以新用户use3对该表也有访问权限。public可以看做是一个隐含定义好的组,它总是包含所有角色。任何角色或用户都将拥有通过GRANT直接赋予的权限和所属组的权限,再加上public的权限。因此,执行完revoke select on table t1 from use3之后,虽然use3用户没有了该表的访问权限(通过该表的relacl字段也可以看到,参考第二个案例的链接权限说明),但是他仍然有public的权限,所以仍能访问该表。解决方法:需要revoke回public的权限,然后对use3用户的权限单独管控。但是由于revoke回public的权限后可能导致原来能访问该表的用户(use1和use2)无法访问该表,影响现网业务,因此需要先对这些用户执行grant赋予相应权限,然后revoke回public的权限。test=# --查看所有用户test=# select * from pg_user where usesysid >= 16384;  usename | usesysid | usecreatedb | usesuper | usecatupd | userepl |  passwd  | valbegin | valuntil |   respool    | parent | spacelimit | useconfig | nodegroup | tempspacelimit | spillspacelimit  ---------+----------+-------------+----------+-----------+---------+----------+----------+----------+--------------+--------+------------+-----------+-----------+----------------+-----------------  jack    |    16408 | f           | f        | f         | f       | ******** |          |          | default_pool |      0 |            |           |           |                |   tom     |    16412 | f           | f        | f         | f       | ******** |          |          | default_pool |      0 |            |           |           |                |   use1    |    16437 | f           | f        | f         | f       | ******** |          |          | default_pool |      0 |            |           |           |                |   use2    |    16441 | f           | f        | f         | f       | ******** |          |          | default_pool |      0 |            |           |           |                |   use3    |    16448 | f           | f        | f         | f       | ******** |          |          | default_pool |      0 |            |           |           |                | (5 rows)test=# --对原用户执行granttest=# grant select on table t1 to jack,tom,use1,use2;GRANTtest=# --回收public的权限test=# revoke select on table t1 from public;test=# \c - use3Password for user use3:  Non-SSL connection (SSL connection is recommended when requiring high-security)You are now connected to database "test" as user "use3".test=> select * from t1;ERROR:  permission denied for relation t1可以看到,执行上述操作后,新用户use3的权限已收到管控,原用户use1和use2仍能访问该表,问题解决。原文链接:https://bbs.huaweicloud.com/blogs/223991【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [测试] GaussDB(DWS)负载管理核心技术解密四: 工作负载计划解密
    工作负载计划的需求来源于客户,客户有多种业务,期望每个时间段的主导业务能分配更多的资源,以支撑业务更好的运行。客户明确希望我们能够提供一种提前配置好各个时间段各个队列的资源配比,到点自动切换各队列资源配比或根据实际情况手动切换的功能,并能够导入导出这种配置以便测试环境测好的配置可以应用到生产环境或者其他集群环境。工作负载计划概览1.1 添加工作负载计划1.2 修改阶段1.3 查看计划执行日志1.4 手动切换计划阶段工作负载计划是多个工作负载队列的自由组合,通过配置负载队列来配置资源池保证系统资源的可控。配置资源池之后能强制用户 发送的请求所消耗的CPU,内存不能超过限制,限制了资源使用量,隔离了失控查询对系统的影响,我们资源管理在一个多用户 高并发的环境控制不同的工作负载对内存CPU 磁盘空间作业个数,使得系统能得到可预测性的控制和保证,减少资源抢占引起的超时等待,防止资源耗尽,资源使用更合理。内存方面:集群有一个CN会作为中心协调节点(CCN),用于收集和调度作业执行。查询语句到不同的CN之后,由优化器估算作业大小,由CCN进行控制作业释放下发,以及何时唤醒需要运行的作业。设置工作负载队列内存大小,来限制所消耗内存可以保证用户使用不超过负载管理的限制;另外由于linux系统会保护一些系统进程而将其他进程kill 释放资源,这是操作系统的OOM机制,我们负载管理可以自动控制作业使用的内存,保证数据库避免OOM,保护数据库集群可以正常运行;CPU方面:管控在一个机器上运行多个可能消耗大量资源的程序我们不希望出现某个程序占据了所有的资源导致程序无法正常运行,或者造成系统假死无法维护。在这里我们使用了原生的Cgroup的机制。负载管理提供了一种可以按照权重比率弹性分配CPU时间资源的手段:CPU繁忙的时候保证每个资源池的作业能拿到相对设置CPU大小比例的CPU,CPU空闲时保证CPU的利用率到100%,并且保证CPU的资源隔离;磁盘管控方面:通过限制用户的使用空间大小来保证集群用户作业的可执行性,执行作业超过空间设置,会取消作业,并且程序会定期对用户空间进行修正,保证页面拿到的用户监控使用磁盘空间大小的准确;工作负载计划基于工作负载队列对数据仓库作业进行管控,可以让有更好的客户体验,可以灵活定制业务的资源如何去管控 ,实现系统负载的均衡,避免业务争取资源,实现所有作业的和谐共处,达到资源利用最优;原文链接:https://bbs.huaweicloud.com/blogs/222915【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS)云端运维系列第八期:服务权限控制(RBAC,细粒度)
    在公有云上,云服务的身份认证和访问控制能力都是有IAM服务来提供的,当前IAM权限的框架主要为云上的租户提供与服务管理面的统一的权限管控,针对云服务租户面的权限管理是有云服务自身来实现的,本文主要讲述华为云管理面权限控制的两个基本模型,以及介绍GaussDB(DWS)当前已经满足的几种管控面权限管理能力。IAM的RBAC权限管理模型RBAC(Role-Based Access Control)指基于角色的访问控制。通俗一点讲,就是先定义某个角色能做某些事(role),再将这个角色授予某个人(授权)。当人做这些事的时候校验他的凭证(Token)里面是否携带了对应的角色,如果有对应角色,则允许他做;否则拒绝(鉴权)。公有云定义了一部分全局内置的系统角色(RBAC),每个云服务上线,需要对接这部分系统内置角色,保证其在华为云上的统一权限控制逻辑。全局内置的系统角色主要包括:角色名操作权限控制备注te_admin(Tenant Administrator)租户admin权限,可访问和操作租户范围可访问资源的所有API。可以访问除IAM外所有云服务的资源,包括增、删、改、查等操作。readonly(Tenant Guest)租户只读权限,拥有租户范围内所有对象的查询类权限。华为云早期服务均支持RBAC模型的授权/鉴权。例如DWS的dws_adm,来表示允许调用自己服务的所有API。IAM也设计了secu_admin角色,来表示拥有该角色的用户,可以调用IAM的客户面接口。当前华为将RBAC相关权限称为"系统角色",系统角色由服务定义好,上线时向IAM注册系统角色数据,RBAC对应的系统角色只能由服务导入,不支持用户自定义。DWS服务目前在华为云上线的系统角色有:DWS Administrator,该权限表示允许调用DWS服务涉及到的所有API。由于DWS为高阶服务,所以为了DWS的所有操作,则必须添加使用IaaS层云服务的权限,DWS Administrator在权限定义时,增加了Server Administrator权限的依赖和Tenant Guest权限的依赖。DWS Database Access,该权限表示允许调用自己服务的所有API,别的服务的API没有权限。IAM的ABAC(细粒度)权限管理模型ABAC(Attribute Base Access Control)指基于属性的权限控制。指设定一个访问控制策略,只有满足策略中的各个属性时,才允许做什么事。例如可以在策略中指定条件、资源、操作来表示在满足指定条件时,允许/拒绝对指定的资源执行对应的操作。鉴权时,用户需要满足对应的条件,才会拥有权限。所有用于约束的规则(操作、资源、条件)都统称为属性。因为RBAC的R(角色)通常是某类权限的合集,并且仅通过token中的role字段判断是否具有权限,不能满足部分高阶客户的业务场景:如只允许调用用某一个API或者操作某一个资源。在此背景下,IAM推出了ABAC授权/鉴权框架。当前华为将ABAC相关权限称为"策略",系统策略由服务定义好,上线时向IAM注册系统策略数据。当系统策略不满足客户业务诉求时,客户可以创建自定义策略,来指定权限。当前公有云上的RBAC权限模型会逐渐被细粒度权限管理模型取代。下面主要介绍细粒度授权的基本设计:描述权限的四要素效力(Effect):取值Allow或Deny,表示满足资源、操作、条件三个要素时,是允许还是拒绝执行操作资源(Resource):指定用户可以操作哪些云资源,可以指定到某一个具体的云资源操作(Action):云服务面向客户提供的最小能力对应的权限。需要云服务根据自身提供的云资源和操作云资源的的API设计。通常一个action仅允许调用一个API。限制条件(Condition\Attribute):通常是资源、操作之外,还需要根据用户或者资源的其他属性做一些约束。如用户名以allowUser开头,或请求源IP在某个IP段内等。当前dws尚未支持改要素的权限控制。{     "Version": "1.1",                           ----策略版本号,1.1表示支持ABAC方式鉴权     "Statement": [                              ----权限数组,数组中的每一个权限独立进行一次鉴权         {                                "Action": [                         ----操作数组,表示被授予的原子操作,当Effect时Allow时,可以调用云服务action对应API;Deny时,拒绝调用。                 "dws:Cluster:resize"            ----单个action,<云服务CSBI缩写>:<云资源类型>:<对云资源的操作>             ],             "Resource": [                       ----资源数组                 "DWS:*:*:cluster:dws*"          ----当Effect时Allow时,可以访问云服务的资源;Deny时,拒绝访问云服务的资源。鉴权时,云服务需要传入用户当前访问的资源。取值支持"*"号通配,这句的含义为:设置权限在dws服务的cluster资源已dws字符开头命名的资源             ],             "Effect": "Deny"                    ----资源、操作、条件都匹配成功后,允许/拒绝请求         }     ] }授权模型IAM多项目授权:在IAM,使用用户组、委托等把策略授予到某一个Project(Region)上。权限绑定关系:<用户组,项目,策略>或<委托,项目,策略>。企业项目授权:在EPS,企业项目管理中,将策略加入企业项目的用户组中。权限绑定关系:<用户组/用户,企业项目,策略>使用DWS在华为云上定义两个系统策略,分别是DWS FullAccess(数据仓库所有权限),DWS ReadOnlyAccess(数据仓库服务只读权限),如果系统策略不满足授权要求,管理员用户(secu_admin)可以创建自定义策略,并通过给用户组授予自定义策略来进行精细的访问控制,自定义策略是对系统策略的扩展和补充。目前华为云支持可视化视图和JSON视图创建自定义策略,以下面的例子来介绍可视化视图创建自定义策略的步骤。例:当前用户只有查看数据仓库服务中以“dws”字符开头命名的资源,并且有对该资源有重启和重置密码的权限。注意:由于权限设置要支持到原子级别,dws服务中页面操作和openapi操作分别为两个接口,若没有特意的说明,请两类操作均添加。首先使用租户登录华为云控制台,并且进入IAM服务;在左侧导航窗格中,单击“权限”>“创建自定义策略”;选择项目级服务,策略配置方式选择可视化视图;在“策略内容”下配置策略选择“允许”。选择“云服务”为数据仓库服务;选择“操作”,根据需求勾选产品权限                "dws:cluster:getDetail"                            获取集群详情                "dws:openAPICluster:getDetail",            openAPI获取集群详情                "dws:cluster:list","                                   获取集群列表                "dws:openAPICluster:list",                      openAPI获取集群列表                "dws:cluster:restart",                               重启集群                "dws:openAPICluster:restart",                openAPI重启集群                "dws:cluster:resetPassword",                 给集群重置密码                "dws:openAPICluster:resetPassword"   openAPI为集群重置密码选择资源类型,如选择“特定类型”可以点击“通过资源路径指定”来指定需要授权的资源,路径填写dws*可以使用Json视图查看策略内容为{    "Version": "1.1",    "Statement": [        {            "Effect": "Allow",            "Action": [                "dws:cluster:getDetail",                "dws:openAPICluster:getDetail",                "dws:cluster:list",                "dws:openAPICluster:list",                "dws:cluster:restart",                "dws:openAPICluster:resetPassword",                "dws:cluster:resetPassword",                "dws:openAPICluster:restart"            ],            "Resource": [                "dws:*:*:cluster:dws*"            ]        }    ]}创建用户组给用户组进行权限配置创建用户,将用户加入到刚才进行权限配置的用户组中。使用新建用户重新登录华为云控制台,进行后续操作。原文链接:https://bbs.huaweicloud.com/blogs/220441【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS)运维管理系列基础篇三:数据仓库之变形金刚(集群resize原理介绍)
    摘要数据仓库,往往意味着海量的数据,超大的集群,就像一个超大的金刚。一旦数据仓库搭建完成,集群迁移、集群规模扩展、集群架构调整需要花费很大的代价,对上层应用业务的影响周期也比较长。DWS提供了集群resize的功能。支持集群规模的scale out,也支持硬件规格的scale up,同时支持集群拓扑结构的重组。就如同使数仓这个金刚可以变形了。那让我们一起来看看他是如何变形的吧!背景介绍先简单介绍数据仓库几个概念:Scale Out(也就是Scale horizontally)横向扩展,向外扩展:Scale out代表分布式计算的能力,通过在原有系统上增加节点来扩展存储能力和计算能力。对于数仓来说就是扩展集群规模。为了不出现木桶效应,要求新扩的机器硬件配置和老集群一致。Scale Up(也就是Scale vertically)纵向扩展,向上扩展:Scale up代表以主机或机箱式为主的扩展CPU或内存存储的能力。通过在原有系统上提升硬件配置(如磁盘、内存、CPU、网卡等),来提升存储能力和计算能力。对于数仓来说就是升级硬件配置,升级有些硬件配置可能需要升级操作系统。DWS逻辑拓扑结构:这个图大家在之前的博文中应该见过,本次从resize的角度介绍下。DWS的组件从功能角度可分为功能组件和数据组件。数据组件:提供数据处理的组件,如DN节点,目前DWS均衡部署,每个机器上的DN数目一般相同。功能组件:提供特定功能的组件,如GTM提供全局事务处理,CN处理业务接入,CM处理集群管理,WLM处理负载均衡。这些组件一般数量固定,在集群安装时按照特定规则部署在集群的某些机器上。随着集群规模的调整,初始的配置可能已经不是最优配置了。因此存在调整集群拓扑结构来调优的诉求。Redshift的cluster resize解决方案如下,包括原地resize和快照恢复到异构集群方式resizeresize原理介绍resize基于多nodegroup和数据重分布实现,同时提供了横向扩展和纵向扩展的能力,resize期间老集群只支持只读业务。典型resize流程示意图如下老集群同网络内,新建一个独立的集群,新集群的拓扑结构和硬件配置可以和老集群完全不同。新老集群融合成一个大集群,并做老集群到新集群的数据重分布。数据重分布期间,新集群对外不可见,老集群对外提供业务。数据重分布完成,新老集群分裂,此时新老集群的各自的数据是完全相同的,用户可以运行业务,对比新老集群的性能。集群resize的完整流程图如下集群resize的数据重分布逻辑数据重分布的核心思想是把1个nodegroup的数据select insert into到1个新的nodegroup上。Scale-out扩容的数据重分布新的nodegroup是包含老的nodegroup的,而集群resize的新的nodegroup和老的nodegroup的DN是完全没有交集的。如下:使用场景6.5.1版本交付的需求,主要给DWS使用,支撑DWS从小规格节点Scale-up为更大规格的节点。主要场景为XX客户POC使用低配xlarge规格,切换生产时想使用大规格高配12xlarge集群。且通过不重装集群、不导出/导入数据方式直接切换。扩展场景:新建集群的集群规模新增或者减少。新建集群的硬件配置可以高配或者低配。新建集群的功能组件的的配置(数量,位置)可以变更。规格约束及演进方向resize的耗时依赖于老集群的IO read(可能瓶颈),新集群的IO write和新老节点间的网络IO。公式为:max(老集群单raid数据量/IO read速率,  新集群单raid数据量/IO write速率,  总数据量/老节点数/发送速率,  总数据量/新节点数/接收速率)新集群单raid数据量 = 总数据量/新集群节点数/raid组数   --假设无明显数据倾斜。集群resize过程中集群存在业务秒级闪断。集群resize过程中提供只读服务,后续版本提供在线能力。结语集群resize提供一键式集群的扩容和迁移的能力。来解决数仓使用过程中规格调整,规模扩展,拓扑变更的诉求。原文链接:https://bbs.huaweicloud.com/blogs/219087【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS)资源监控系列一:作业级别的监控(TopSQL)
    【摘要】 实时TopSQL,历史TopSQL。总体介绍GaussDB(DWS)资源监控的作业级别监控,分为实时级别监控(实时TopSQL)与历史级别监控(历史TopSQL)。实时TopSQL可以完成对于运行中的SQL进行资源监控,其可以通过查询gs_wlm_sesssion_statistics查询得到。历史TopSQL可以对运行结束之后的SQL进行监控其可以通过查询gs_wlm_session_history得到相应的资源消耗信息。如图1所示,在设置enable_resource_track为on,resource_track_level为query的时候,当该SQL的执行代价大于设定的resource_track_cost的时候,就可以在实时TopSQL中查到相应的SQL执行信息,当该SQL执行结束之后对于其执行时间大于resource_track_duration的SQL即可以在历史TopSQL中查询到。在设置enable_resource_record为on的时候,每过三分钟会将gs_wlm_session_history中的数据落盘存到gs_wlm_session_info中。对于存入到gs_wlm_session_info中的数据可以通过设定topsql_rentention_time对其中的数据进行老化处理。图1TopSQL功能总体关系图实时TopSQL系统提供了query级别和算子级别的资源监控实时视图用来查询实时TopSQL。资源监控实时视图记录了查询作业运行时的资源使用情况(包括内存、下盘、CPU时间和IO等)以及性能告警信息,这里相关的视图如图3.1所示。图2实时TopSQL相关的视图对于实时TopSQL而言,其中的资源数据的更新在这个SQL执行的过程中每10s会更新收集一次。历史TopSQL系统提供了query级别和算子级别的资源监控历史视图来查询历史TopSQL。资源监控历史视图记录了查询作业运行结束时的资源使用情况(包括内存、下盘、CPU时间、IO等)和运行状态信息(包括报错、终止、异常等)以及性能告警信息。但对于由于FATAL、PANIC错误导致查询异常结束时,状态信息列只显示aborted,无法记录详细的异常信息。这里需要开启参考手册开启相应的GUC参数。这里相关的视图与表如图4.1所示。图3历史TopSQL相关的视图与表这里以query当前CN查询为例说一下这个整体的流程,当作业执行完之后就会从实时static那个视图里存储到gs_wlm_session_history这个视图当中,默认三分钟之后数据就会转存到gs_wlm_session_info这个表中,存到数据库当中。在这里需要注意的是gs_wlm_session_history是一个视图,而gs_wlm_session_info是一个实际的表。另外在配置相关的GUC时,要注意有可能会配置的hash表大小过小导致数据存储不下的情况。对于TopSQL能够支持记录的规格请详见对应版本手册中的描述。原文链接:https://bbs.huaweicloud.com/blogs/215673【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS)云端运维系列第七期:数据库维护(VACUUM,ANALYZE,倾斜检查)
    【摘要】 VACUUM回收表或B-Tree索引中已经删除的行所占据的存储空间。 ANAL用于收集与数据库中普通表内容相关的统计信息,统计结果存储在系统表PG_STATISTIC下。执行计划生成器会使用这些统计数据,以确定最有效的执行计划。 数据倾斜会造成查询表性能下降。VACUUM功能描述     VACUUM回收表或B-Tree索引中已经删除的行所占据的存储空间。在一般的数据库操作里,那些已经DELETE的行并没有从它们所属的表中物理删除;在完成VACUUM之前它们仍然存在。因此有必要周期地运行VACUUM,特别是在经常更新的表上。注意事项如果没有参数,VACUUM处理当前数据库里用户拥有相应权限的每个表。如果参数指定了一个表,VACUUM只处理指定的那个表。要对一个表进行VACUUM操作,通常用户必须是表的所有者或系统管理员。数据库的所有者允许对数据库中除了共享目录以外的所有表进行VACUUM操作(该限制意味着只有系统管理员才能真正对一个数据库进行VACUUM操作)。VACUUM命令会跳过那些用户没有权限的表进行垃圾回收操作。VACUUM不能在事务块内执行。建议生产数据库经常清理(至少每晚一次),以保证不断地删除失效的行。尤其是在增删了大量记录之后,对受影响的表执行VACUUM ANALYZE命令是一个很好的习惯。这样将更新系统目录为最近的更改,并且允许查询优化器在规划用户查询时有更好的选择。不建议日常使用FULL选项,但是可以在特殊情况下使用。例如在用户删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用。VACUUM FULL通常要比单纯的VACUUM收缩更多的表尺寸。FULL选项并不清理索引,所以推荐周期性的运行REINDEX命令。实际上,首先删除所有索引,再运行VACUUM FULL命令,最后重建索引通常是更快的选择。如果执行此命令后所占用物理空间无变化(未减少),请确认是否有其他活跃事务(删除数据事务开始之前开始的事务,并在VACUUM FULL执行前未结束)存在,如果有等其他活跃事务退出进行重试。VACUUM会导致I/O流量的大幅增加,这可能会影响其他活动会话的性能。因此,有时候会建议使用基于开销的VACUUM延迟特性。如果指定了VERBOSE选项,VACUUM将打印处理过程中的信息,以表明当前正在处理的表。各种有关当前表的统计信息也会打印出来。但是对于列存表执行VACUUM操作,指定了VERBOSE选项,无信息输出。当含有带括号的选项列表时,选项可以以任何顺序写入。如果没有括号,则选项必须按语法显示的顺序给出。VACUUM和VACUUM FULL时,会根据参数vacuum_defer_cleanup_age延迟清理行存表记录,即不会立即清理刚刚删除的元组。VACUUM ANALYZE先执行一个VACUUM操作,然后给每个选定的表执行一个ANALYZE。对于日常维护脚本而言,这是一个很方便的组合。简单的VACUUM(不带FULL选项)只是简单地回收空间并且令其可以再次使用。这种形式的命令可以和对表的普通读写并发操作,因为没有请求排他锁。VACUUM FULL执行更广泛的处理,包括跨块移动行,以便把表压缩到最少的磁盘块数目里。这种形式要慢许多并且在处理的时候需要在表上施加一个排他锁。VACUUM列存表内部执行的操作包括三个:迁移delta表中的数据到主表、VACUUM主表的delta表、VACUUM主表的desc表。该操作不会回收delta表的存储空间,如果要回收delta表的冗余存储空间,需要对该列存表执行VACUUM DELTAMERGE。如果有长查询访问系统表,此时执行VACUUM FULL,长查询可能会阻塞VACUUM FULL连接访问系统表,导致连接超时报错。语法格式回收空间并更新统计信息,对关键字顺序无要求。VACUUM [ ( { FULL | FREEZE | VERBOSE | {ANALYZE | ANALYSE }} [,...] ) ]     [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ];仅回收空间,不更新统计信息。VACUUM [ FULL [COMPACT] ] [ FREEZE ] [ VERBOSE ] [ table_name ] [ PARTITION ( partition_name ) ];回收空间并更新统计信息,且对关键字顺序有要求。VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] { ANALYZE | ANALYSE } [ VERBOSE ]      [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ];针对HDFS表和列存表,将delta table中的数据转移到主表存储。VACUUM DELTAMERGE [ table_name ];针对HDFS表,删除HDFS表在HDFS存储上的空值分区目录。VACUUM HDFSDIRECTORY [ table_name ];参数说明FULL选择“FULL”清理,这样可以恢复更多的空间,但是需要耗时更多,并且在表上施加了排他锁。FULL选项还可以带有COMPACT参数,该参数只针对HDFS表,指定该参数的VACUUM FULL操作性能要好于未指定该参数的VACUUM FULL操作。COMPACT和PARTITION参数不能同时使用。说明:使用FULL参数会导致统计信息丢失,如果需要收集统计信息,请在VACUUM FULL语句中加上analyze关键字。FREEZE       指定FREEZE相当于执行VACUUM时将vacuum_freeze_min_age参数设为0。VERBOSE为每个表打印一份详细的清理工作报告。ANALYZE | ANALYSE更新用于优化器的统计信息,以决定执行查询的最有效方法。table_name要清理的表的名称(可以有模式修饰)。取值范围:要清理的表的名称。缺省时为当前数据库中的所有表。column_name要分析的具体的字段名称。取值范围:要分析的具体的字段名称。缺省时为所有字段。PARTITIONHDFS表不支持PARTITION参数,COMPACT和PARTITION参数不能同时使用。partition_name要清理的表的分区名称。缺省时为所有分区。DELTAMERGE只针对HDFS表和列存表,将HDFS表或者列存表的delta table中的数据转移到主表存储上。对HDFS表而言,当delta表中数据量小于六万行,则不作迁移,只有在大于或者等于六万行数据时,将delta表中所有数据迁移到HDFS上,并通过truncate清理delta表的存储空间。对列存表而言,此操作受enable_delta_store和参数说明中的deltarow_threshold控制。说明:为了检查列存delta表中的信息(HDFS表的delta表数据可以通过explain analyze查到),提供下述DFX函数,用于获取某个列存表的delta表中数据存储情况:pgxc_get_delta_info(TEXT),传入参数为列存表名,搜集并显示各个节点上的对应delta表信息,包括当前存活tuple数量、表大小、使用的最大block ID。get_delta_info(TEXT),传入参数为列存表名,汇总pgxc_get_delta_info得到的结果,返回其delta表整体的当前存活tuple数量、表大小、使用的最大block ID。HDFSDIRECTORY只针对HDFS表,删除HDFS表在HDFS存储上表目录下的空值分区目录。示例--在表tpcds.reason上创建索引CREATE UNIQUE INDEX ds_reason_index1 ON tpcds.reason(r_reason_sk);--对带索引的表tpcds.reason执行VACUUM操作。VACUUM (VERBOSE, ANALYZE) tpcds.reason;--删除索引DROP INDEX ds_reason_index1 CASCADE;DROP TABLE tpcds.reason;ANALYZE功能描述用于收集与数据库中普通表内容相关的统计信息,统计结果存储在系统表PG_STATISTIC下。执行计划生成器会使用这些统计数据,以确定最有效的执行计划。如果没有指定参数,ANALYZE会分析当前数据库中的每个表和分区表。同时也可以通过指定table_name、column和partition_name参数把分析限定在特定的表、列或分区表中。ANALYZE|ANALYSE VERIFY用于检测数据库中普通表(行存表、列存表)的数据文件是否损坏,目前此命令暂不支持HDFS表注意事项由于现版本ANALYZE非临时表是一个多事务的行为,因此ANALYZE非临时表不能在一个匿名块、事务块、函数或存储过程内被执行,且当ANALYZE与部分DML语句,例如ALTER TABLE,DROP TABLE,UPDATE等并发时,可能会引发ANALYZE流程报错,报错信息例如找不到目标列,对于这种情况,只需要再次ANALYZE收集统计信息即可。现版本支持存储过程中ANALYZE临时表,不支持统计信息回滚操作。ANALYZE VERIFY 操作处理的大多为异常场景检测需要使用RELEASE版本。ANALYZE VERIFY 场景不触发远程读,因此远程读参数不生效。对于关键系统表出现错误被系统检测出页面损坏时,将直接报错不再继续检测。语法格式收集表的统计信息。{ ANALYZE | ANALYSE } [ VERBOSE ]     [ table_name [ ( column_name [, ...] ) ] ];收集分区表的统计信息。{ ANALYZE | ANALYSE } [ VERBOSE ]     [ table_name [ ( column_name [, ...] ) ] ]     PARTITION ( patrition_name ) ;说明:普通分区表目前支持针对某个分区的统计信息的语法,但功能上不支持针对某个分区的统计信息收集。收集外表的统计信息。{ ANALYZE | ANALYSE } [ VERBOSE ]     { foreign_table_name | FOREIGN TABLES };收集多列统计信息{ANALYZE | ANALYSE} [ VERBOSE ]     table_name (( column_1_name, column_2_name [, ...] ));说明:收集多列统计信息时,请设置GUC参数default_statistics_target为负数,以使用百分比采样方式。每组多列统计信息最多支持32列。不支持收集多列统计信息的表:系统表、HDFS外表复制表。检测当前库的数据文件检测当前库的数据文件{ANALYZE | ANALYSE} VERIFY {FAST|COMPLETE};说明:支持对全库进行操作,由于涉及的表较多,建议以重定向保存结果gsql -d database -p port -f "verify.sql"> verify_warning.txt 2>&1。不支持HDFS表(内表和外表),不支持临时表和unlog表。对外提示NOTICE只核对外可见的表,内部表的检测会包含在它所依赖的外部表,不对外显示和呈现。此命令的处理可容错ERROR级别的处理。由于debug版本的Assert可能会导致core无法继续执行命令,建议在release模式下操作。对于全库操作时,当关键系统表出现损坏则直接报错,不再继续执行。检测表和索引的数据文件{ANALYZE | ANALYSE} VERIFY {FAST|COMPLETE} table_name|index_name [CASCADE];说明:支持对普通表的操作和索引表的操作,但不支持对索引表index使用CASCADE操作。原因是由于CASCADE模式用于处理主表的所有索引表,当单独对索引表进行检测时,无需使用CASCADE模式。不支持HDFS表(内表和外表),不支持临时表和unlog表。对于主表的检测会同步检测主表的内部表,例如toast表、cudesc表等。当提示索引表损坏时,建议使用reindex命令进行重建索引操作。检测表分区的数据文件检测表和索引的数据文件说明:支持对表的单独分区进行检测操作,但不支持对索引表index使用CASCADE操作。不支持HDFS表(内表和外表),不支持临时表和unlog表.参数说明VERBOSE启用显示进度信息。说明:如果指定了VERBOSE,ANALYZE发出进度信息,表明目前正在处理的表。各种有关表的统计信息也会打印出来。table_name需要分析的特定表的表名(可能会带模式名),如果省略,将对数据库中的所有表(非外部表)进行分析。对于ANALYZE收集统计信息,目前仅支持行存表、列存表、HDFS表、ORC格式的OBS外表、CARBONDATA格式的OBS外表、协同分析的外表。取值范围:已有的表名。column_name,column_1_name,column_2_name需要分析特定列的列名,默认为所有列。取值范围:已有的列名。partition_name如果table为分区表,在关键字PARTITION后面指定分区名partition_name表示分析该分区表的统计信息。目前语法上支持分区表做ANALYZE,但功能实现上暂不支持对指定分区统计信息的分析。取值范围:表的某一个分区名。foreign_table_name需要分析的特定表的表名(可能会带模式名),该表的数据存放于HDFS分布式文件系统中。取值范围:已有的表名。FOREIGN TABLES分析所有当前用户权限下,数据位于HDFS分布式文件系统中的HDFS外表。index_name需要分析的特定索引表的表名(可能会带模式名)。取值范围:已有的表名。FAST|COMPLETE对于行存表,FAST模式下主要对于行存表的CRC和page header进行校验,如果校验失败则会告警; 而COMPLETE模式下,则主要对行存表的指针、tuple进行解析校验。 对于列存表,FAST模式下主要对于列存表的CRC和magic进行校验,如果校验失败则会告警; 而COMPLETE模式下,则主要对列存表的CU进行解析校验。CASCADECASCADE模式下会对当前表的所有索引进行检测处理。示例--- 创建表。--- 创建分区表。--- 使用ANALYZE语句更新统计信息。--- 使用ANALYZE VERBOSE语句更新统计信息,并输出表的相关信息。说明:若环境若有故障,需查看CN的log。--- 删除表。 倾斜检查操作场景数据倾斜会造成查询表性能下降。对于记录数超过千万条的表,建议在执行全量数据导入前,先导入部分数据,以进行数据倾斜检查和调整分布列,避免导入大量数据后发现数据倾斜,调整成本高。背景信息GaussDB(DWS)是采用Shared-nothing架构的MPP(Massive Parallel Processor,大规模并发处理)系统,采用水平分布的方式,将业务数据表的元组按合适的分布策略分散存储在所有的DN。当前产品支持复制(Replication)和散列(Hash)两种用户表分布策略。Replication方式:在每一个DN上存储一份全量表数据。对于数据量比较小的表建议采取Replication分布策略。Hash方式:采用这种分布方式,需要为用户表指定一个分布列(distribute key)。当插入一条记录时,系统会根据分布列的值进行hash运算后,将数据存储在对应的DN中。对于数据量比较大的表建议采取Hash分布策略。对于Hash分布策略,如果分布列选择不当,可能导致数据倾斜。因此在采用Hash分布策略之后会对用户表的数据进行数据倾斜性检查,以确保数据在各个DN上是均匀分布的。一般情况下分布列都是选择键值重复度小,数据分布比较均匀的列。操作步骤1. 分析数据源特征,选择若干个键值重复度小,数据分布比较均匀的备选分布列。2. 从步骤1中选择一个备选分布列创建目标表。CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name      ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]     | table_constraint    | LIKE source_table [ like_option [...] ] }     [, ... ])    [ WITH ( {storage_parameter = value} [, ... ] ) ]     [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]     [ COMPRESS | NOCOMPRESS ]    [ TABLESPACE tablespace_name ]     [ DISTRIBUTE BY { REPLICATION                      | { HASH ( column_name [,...] ) } } ];3. 参照前面章节中的办法向目标表中导入小批量数据。对于单个数据源文件,在导入时,可通过均匀切割,导入部分切割后的数据源文件来验证数据倾斜性。4. 检验数据倾斜性。命令中的table_name ,请填入实际的目标表名。SELECT a.count,b.node_name FROM (SELECT count(*) AS count,xc_node_id FROM table_name GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;5. 若各DN上数据分布差小于10%,表明数据分布均衡,选择的分布列合适。请清理已导入小批量数据,导入全量数据,以完成数据迁移。若各DN上数据分布差大于等于10%,表明数据分布倾斜,请从步骤1的备选分布列中删除该列,删除目标表,并重复步骤2 、步骤3 、步骤4 和步骤5。6. (可选)如果上述步骤不能选出适合的分布列,需要从备选分布列选择多个列的组合作为分布列来完成数据迁移。示例对目标表staffs选择合适的分布列。1. 分析表staffs的数据源特征,选择数据重复度低且分布均匀的备选分布列staff_ID、FIRST_NAME和LAST_NAME。2. 先选择staff_ID作为分布列,创建目标表staffs。CREATE TABLE staffs(   staff_ID       NUMBER(6) not null,   FIRST_NAME     VARCHAR2(20),   LAST_NAME      VARCHAR2(25),   EMAIL          VARCHAR2(25),   PHONE_NUMBER   VARCHAR2(20),   HIRE_DATE      DATE,   employment_ID  VARCHAR2(10),   SALARY         NUMBER(8,2),   COMMISSION_PCT NUMBER(2,2),   MANAGER_ID     NUMBER(6),   section_ID     NUMBER(4))   DISTRIBUTE BY hash(staff_ID);3. 向目标表staffs中导入部分数据。根据以下查询所得,集群环境中主DN数为8个,则建议导入的记录数为80000条。SELECT count(*) FROM pgxc_node where node_type='D';  count  -------      8(1 row)4. 校验以staff_ID为分布列的目标表staffs的数据倾斜性。SELECT a.count,b.node_name FROM (select count(*) as count,xc_node_id FROM staffs GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;count | node_name------+-----------11010 | datanode410000 | datanode312001 | datanode2 8995 | datanode110000 | datanode5 7999 | datanode6 9995 | datanode710000 | datanode8(8 rows)5. 根据上一步骤查询所得,各DN上数据分布差大于10%,数据分布倾斜。所以从步骤1的备选分布列中删除该列,并删除目标表staffs。DROP TABLE staffs;6. 尝试选择staff_ID、FIRST_NAME和LAST_NAME的组合作为分布列,创建目标表staffs。CREATE TABLE staffs(     staff_ID       NUMBER(6) not null,   FIRST_NAME     VARCHAR2(20),   LAST_NAME      VARCHAR2(25),   EMAIL          VARCHAR2(25),   PHONE_NUMBER   VARCHAR2(20),   HIRE_DATE      DATE,   employment_ID  VARCHAR2(10),   SALARY         NUMBER(8,2),   COMMISSION_PCT NUMBER(2,2),   MANAGER_ID     NUMBER(6),   section_ID     NUMBER(4)) DISTRIBUTE BY hash(staff_ID,FIRST_NAME,LAST_NAME);7. 校验以staff_ID、FIRST_NAME和LAST_NAME的组合为分布列的目标表staffs的数据倾斜性。SELECT a.count,b.node_name FROM (select count(*) as count,xc_node_id FROM staffs GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;count | node_name------+-----------10010 | datanode410000 | datanode310001 | datanode2 9995 | datanode110000 | datanode5 9999 | datanode6 9995 | datanode710000 | datanode8(8 rows)8. 根据上一步骤查询所得,各DN上数据分布差小于10%,数据分布均衡,选择的分布列合适。9. 清理已导入小批量数据。TRUNCATE TABLE staffs;10. 导入全量数据,以完成数据迁移原文链接:https://bbs.huaweicloud.com/blogs/215618【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [测试] GaussDB(DWS)流式数据入库实践一:Python接口
    【摘要】 psycopg2接口实现GaussDB(DWS)流式数据入库。GaussDB(DWS)尚未宣称支持psycopg2开源Python接口,但实际上研发内部测试框架一直在使用Python接口,并没有功能问题,经过系统性测试和多平台验证即可对外支持。GaussDB(DWS)数据入库方式主要有三种:INSERT/COPY/FDW,三者性能INSERT最差,FDW(gds外表/obs外表)性能最好,但在很多客户场景下都是流式数据,不额外落盘,需要直接入库,这种场景下可以采用copy方式入库,Python接口同样支持copy_from接口,示例程序如下,实际应用中可以通过StringIO来进行数据的缓存,本次举例只是给出copy_from的使用指导:#!/usr/bin/env python # -*- coding: UTF-8 -*-import sysimport psycopg2import os def copy_from_file(conn, table):     """     Here we are going to load the csv file       and use copy_from() to copy it to the table    """     tmp_df = "./tpcds_1x/store_sales.dat"     f = open(tmp_df, 'r')     cursor = conn.cursor()     try:         cursor.copy_from(f, table, sep=",")         conn.commit()     except (Exception, psycopg2.DatabaseError) as error:         print("Error: %s" % error)         conn.rollback()         cursor.close()         return 1     print("copy_from_file() done")     cursor.close()     #-----------------------------------------------# Main code #-----------------------------------------------conn = psycopg2.connect(host='x.x.x.x', port='8000', database='postgres', user='jack', password='Gauss_234')conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)copy_from_file(conn, 'store_sales')conn.close() # close the connection原文链接:https://bbs.huaweicloud.com/blogs/215107【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [测试] GaussDB(DWS)基础实践:MRS数据导入DWS
    前提:已有同一VPC下MRS、DWS集群1、创建好MRS数据源后,进入MRS数据源详情页面,可以看到节点信息,2、 点击Master1,设置安全组(在安全组中设置any规则);绑定弹性IP3.1 从Master1绑定的EIP,远程登录到Master1节点或者可以用MobaXterm工具连接MRS绑定的EIP:常见错误 :Eip能ping通,但是ssh linux@EIP登录失败 可以采用私有秘钥登录登录到节点上后,依次执行:切换root:sudo -s;cd /opt/client;source bigdata_env;kinit admin查看是否是安全模式:进入MRS数据源详情页面查看Kerberos认证状态,若是关闭则为普通模式,否则是安全模式。3.2 进入hive数据库 创建表并写入数据beelineeg:create table lxn01 (id int,name char(10))stored as orc;MRS数据存储格式:orcinsert into lxn01 values(1,'dwejfwe');  3.3 退出数据库(!q或者ctr+Z),执行命令hdfs dfs -ls /user/hive/warehouse/lxn01,查看该路径下是否有所创建的表,后面创建外表时会用到该路径(/user/hive/warehouse/lxn01)显示数据,数据文件00000 4 登录到DWS的数据库上(创建ECS)可以在前台页面上直接下载客户端redHat,然后将下载的压缩包拖至工具上,在sftp tab上,然后进入相应的目录下,执行tar –xvf dws_client_redhat_x64.tar.gz 解压缩客户端。 source gsql_env.sh  (<---进入到解压后的客户端路径下执行)gsql -d postgres -h 集群内网访问地址 -U 管理员用户 -p 数据仓库端口 _W 集群密码192.168.1.23gsql -d postgres -h 192.168.1.23 -U dbadmin -p 8000 -W Bigdata_2014此处的集群内网地址可以在前台页面查看创建MRS数据源的集群的内网地址及端口, 查看已创建的MRS数据源连接:select srvname,srvoptions from pg_foreign_server;  创建外表:create foreign table TABLE_NAME(COLUMN_NAME1             COLUMN_TYPE1               ,COLUMN_NAME2             COLUMN_TYPE2               ) server FOREIGN_SERVER_NAMEOPTIONS (format 'orc', foldername 'FILE_PATH') distribute by roundrobin;create foreign table lxn04 (id int,name char(10)) server hdfs_server_b1809755_b17b_49ba_bc46_d1f789055949 OPTIONS (format 'orc', foldername '/user/hive/warehouse/lxn01') distribute by roundrobin; 如果执行select srvname,srvoptions from pg_foreign_server;  没有hdfs_server_****** ,则该集群没有创建MRS数据源。FOREIGN_SERVER_NAME  :'FILE_PATH' :步骤7中的路径Select * from 外表  ------ 可以从外表查询数据再新建DWS自己的表:create table lxn06(id int,name char(10));将MRS数据导入到DWS:insert into lxn06(DWS数据库上建的表) select * from lxn_foreign(DWS数据库上建的外表);  insert into lxn06 select * from lxn04;原文链接:https://bbs.huaweicloud.com/blogs/215105【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [存储] GaussDB(DWS)的容灾应该如何设计
    本文接 [数据仓库]双集群系统方案探讨 展开讨论一下GaussDB(DWS)的容灾应该如何设计。对于方案探讨中涉及到几种形态,从数仓内核的角度去分析一下各个方案的问题: 日志同步技术: 列存数据不记日志无法通过日志来同步支持列存xlog后会导致导入性能劣化,xlog数据量大,同时会影响日志同步效率 备份增量同步技术:无法达到 RPO = 0备集群只能读,无法支持写操作 逻辑数据同步技术:列存数据需要支持逻辑解码,需要从列存XLog的方向进行演进分布式事务,DDL等处理难度较大 备份/恢复不能马上提供服务,RTO时间较长需要较大空间保存备份集GaussDB(DWS) 当前在备份增量同步和备份/恢复两个方向进行演进,他们都是基于备份/恢复工具Roach(详情参见Roach备份恢复GaussDB(DWS))备份/恢复备份/恢复的原理图如下,在各个结点将实例备份到相应的介质上,并从介质上恢复到新集群或老集群中。详细的功能不在此处展开描述,大家可以参考(详情参见Roach备份恢复GaussDB(DWS)) 来了解细节。对于实现容灾要求,需要解决的问题大体分三类:快速的备份恢复高性能备份、恢复操作保证在较短的时间内将数据迁移到另一个集群,对于RPO/RTO要求不大的系统来说实现和使用非常简单。备份恢复在集群可用的情况下即可进行,不受单点故障的影响备份恢复在集群可用的情况下就可以进行,集群只需要保证有可用副本就可以持续的进行备份,并且可以正常恢复。备份集的可靠性备份集需要存储在可靠的存储上,类似 OBS/NBU, 由于磁盘故障率相对比较高,类似备份集保存在磁盘上是非可靠的方案。双集群备份增量同步技术当前GaussDB(DWS)使用在备份/恢复的双集群架构来实现容灾,将生产集群的数据使用增量的方式同步到容灾的集群。在这种架构下需要解决如下问题: 减少RPO备份恢复无法达到与流式的同步方式的RPO, 做不到RPO=0的程度。 备集群的可用性问题备集群支持持续读/写备集群是物理恢复的方式,无法支持写的操作的;但是在恢复过程中是可以支持持续读的,当前在恢复过程中需要停集群后将备份集中文件覆盖。备集群集群恢复失败可回退到一致性状态在恢复过程中会出结点故障,备份集损坏等等问题,会造成当前的恢复过程无法执行过去,此时需要回退到恢复前的状态,保证备集群的可用性。备集群恢复不受单点故障影响对于备集群来说,也会出现各种单点故障的情况,实例故障,结点故障,CN剔除等情况下,仍然可以把集群恢复成可用的状态。备集群支持备份备集群可以支持备份,用于扩展一些其它功能,实现类似多AZ,异地的容灾。   3. 备份集管理        1. 备份集生命周期管理            容灾是实现数据同步的功能,并非一个备份恢复场景,并不需要保存大量备份集以及周期的去做全量备份,因此需要有一个机制实现备份集及时清理,保证占用资源可按。        2. 备份集的可靠性            在容灾过程中,同样考虑备份集的可靠性,防止备份集损坏情况,可以通过可靠的介质来保存备份集,又能保证可靠的读写性能。        3. 持续增量数据同步            保持持续的增量备份,类似升级前后,扩容前后,都要保持增量备份来保证同步的性能。这里隐含着一个显而易见的原因,如果全量备份的话,备份时间长,并且恢复进会将集群清空,此时容灾集群不可用,这个严重影响可用性。可以说避免全量备份是基于Roach的双集群容灾一个重要工作。   4. 双集群切换及Failover        1. 快速切换             双集群的应用场景中,类似滚动升级,故障演练,此时需要切换两个集群,切换时要保证快速将两边数据拉平,尽快提供服务并保证可用性。        2. Failover及之后的加回操作            由于RPO != 0,所以在生产集群无法提供服务时,容灾集群在Failover操作后会提供读写服务,此时会有一部分数据丢失,并在两个集群的数据产生了“分叉”,那么在生产集群恢复后,加回之后中要将“分叉”的数据进行回退,以保证两边数据一致。   5. 异构的支持       此处异构是指逻辑结构DN数量一致,而CN数、结点数可以不相同的情况,众所周知是由于当前方案是物理备份方式,因此如果DN数量发生变化,无法从物理层进行重分布操作。以上说明的几点都是基于可靠性的角度来分析,还有一个重要的因素是基于数仓的数据量和集群规模,不论备份/恢复方案还是在此基础上的双集群备份增量同步的方案,对于网络带宽,介质的读写性能有较高的要求,因此需要根据集群规模和数据增量来选择合适的组网方式和介质。原文链接:https://bbs.huaweicloud.com/blogs/213157【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [SQL] GaussDB(DWS)性能调优系列实战篇五:十八般武艺之路径干预
    【摘要】 路径生成是表关联方式确定的主要阶段,本文介绍了几个影响路径生成的要素:cost_param, scan方式,join方式,stream方式,并从原理上分析如何干预路径的生成。从另外一个角度看,即路径生成,是从这些底层的选择开始,从行数的估算、到scan的选择、再到join方式以及stream的选择,构成一条简单路径,然后多条路径根据代价选择,再逐层关联更多的表,最终形成一个完整的执行路径。一、cost模型选择顾名思义,cost_param是控制cost相关的一个参数。在了解cost_param之前,先回顾一下选择率的概念,GaussDB优化器中的选择率是指,当一个表有一个过滤或关联条件时,通过该条件能被选中的行数占总行数的比例,是介于0~1之间的一个实数。选择率在优化器中是一个重要的概念,主要应用于行数和distinct值的估算,行数和distinct值是计划生成中的基本要素。首先,我们来看带有过滤条件的基表行数如何估算。如果一个表只有一个过滤条件,那么以选择率乘以表的行数,即可得到过滤完的行数;如果有多个过滤条件,那么就需要算出一个综合的选择率,如何计算?方式有二:一是通过多列统计信息直接计算,二是通过组合单列的选择率。那么组合的方式就由参数cost_param决定了,具体地,取值描述适用场景cost_param = 0选择率按乘积方式组合完全不相关场景cost_param & 2 != 0取最小的选择率作为综合选择率完全相关场景举一个例子,TPC-H 1x的part表,过滤条件是:p_brand = 'Brand#45' and p_container = 'WRAP CASE',查看不同cost_param下的过滤后行数。(1)cost_param=0(2)cost_param=2从估算出的行数(E-rows)和实际的行数(A-rows)对比可以看出,cost_param=0的不相关模型适合part表的p_brand和p_container列。其次,Join的行数怎么估算的呢?原理跟过滤条件的行数估算是类似的,如果没有多列统计信息可以使用,则也需要单独计算每个条件的选择率,然后计算出综合选择率,得出行数。例如 TPC-H 1x lineitem和orders关联,关联条件是:l_orderkey = o_orderkey and o_custkey = l_suppkey,不同cost_param的执行情况如下:(1)cost_param=0(2)cost_param=2此例中,Join的列之间也适合完全相关模型,这与l_orderkey和l_suppkey的分布是吻合的。由于TPC-H的模型接近完全不相关模型,因此cost_param=0模型可以较好的描述场景,实际应用中,用户可以根据具体业务场景来调整模型,行数估算的准确性是计划生成的重要保证,在调优中检查估算的最直接的地方。GaussDB会在后续版本中新增更多的模型供业务需求选择。二、Scan方式的选择GaussDB中扫描方式主要分顺序扫描和索引扫描,每种扫描方式都对应若干扫描算子,顺序扫描在行列存中对应的扫描算子分别是Seq Scan和CStore Scan算子(下面我们讨论中不加区分)。这些扫描算子大部分都可以通过开关来进行调控,例如Seq Scan,如果设置enable_seqscan=off,则表示不会优先选择Seq Scan,而不是一定不会选。扫描方式的选择,很大程度上决定了获取基表数据的路径。我们以如下的例子来说明:select l_orderkey, o_custkey from lineitem, orders where l_orderkey = o_orderkey;lineitem分布键是l_orderkey,并且在l_orderkey上有index,orders分布键是o_orderkey。默认情况下,Scan的方式如下:两个表都是顺序扫描的路径,关联方式选择了Hash Join。如果把Seq Scan关掉(enable_seqscan=off),计划如下:lineitem的扫描变成了Index Only Scan(因为l_orderkey的类型是int),而在orders表上仍然选择Seq Scan(因为没有其他路径),同时关联方式也变为了Nest Loop,因为Hash Join需要全表扫描数据(lineitem的Seq Scan已经被关掉了)。优化器的选择方式我们从代价(E-costs)一栏中也可以看出。再把Index Only Scan关掉,看看计划如何变化:扫描路径都变为了Seq Scan,而且Seq Scan的代价都很大。此时既然都走了Seq Scan,为什么不选Hash Join呢,把Nest Loop关掉,看看Hash Join计划的代价:从代价上看出Hash Join的总代价比Nest Loop的小,但优化器没有选择Hash Join,这是因为优化器比较路径代价时,会比较Startup和Total代价,即启动代价和总代价,综合考虑,E-costs栏中显示的是总代价。把explain_perf_mode设置为normal,查看原Nest Loop的启动代价:红框中的两个cost,分别是启动代价和总代价,在看Hash Join的cost,明显Hash Join的启动代价比Nest Loop的大很多(启动代价代表了输出第一条数据的代价),优化器在比较路径时,综合了这两个代价,最终推荐了Nest Loop的路径。从上面的例子可以看出,扫描路径的调控,可以改变路径生成,合理的搭配是生成最优计划的前提,默认情况下,GaussDB优化器可以根据现有的路径选择(如上面的lineitem有两条扫描路径,orders只有一条扫描路径),最后确定出最优的一条。两条路径代价比较时,总代价不是唯一要素,但总代价越小,一般也会越容易被选中。三、关联方式的选择GaussDB优化器中表关联的主要方式有:Nest Loop,Hash Join和Merge Join,分别可以通过enable_nestloop、enable_hashjoin、enable_mergejoin进行控制,这种控制也不是绝对的,可以理解为是否优先选择。大部分场景下,三种路径的代价关系:Hash Join < Merge Join < Nest Loop。我们以一个简单的关联示例说明,store_returns和store_sales是TPC-DS 1x中两个表,SQL如下:select count(*) from store_returns, store_sales where sr_customer_sk = ss_customer_sk;默认情况下,优化器推荐Hash Join路径,计划如下:如果把Hash Join关掉,则优化器选择了Merge Join路径:如果再把Merge Join路径关掉,可能就会选择Nest Loop路径。关联方式的控制开关一般用于调优或规避问题,但具体是否能够起作用要看具体的语句,除了当前关联方式,还有没有其他方式。实际场景中,一个语句中关联的算子较多,一般很难用参数enable_hashjoin或enable_nestloop或enable_mergejoin来控制某两个表的Join方式,GaussDB中更细致的语句级别的调优手段是Plan Hint,感兴趣的读者可以参考产品手册。四、Stream方式的选择Stream算子是GaussDB分布式执行的关键算子之一,主要起到网络传输的作用,概要介绍可以参考:GaussDB(DWS)性能调优系列实战篇一:十八般武艺之总体调优策略。Stream算子由参数enable_stream_operator控制,如果关掉Stream算子,则可能导致生成不下推的计划,例如:因为lineitem表关联的键l_partkey不是lineitem的分布键,需要添加Stream算子,但Stream功能被禁,于是只能生成不下推计划。GaussDB计划中常见的主要Stream算子包括Redistribute、Broadcast和Gather。Gather一般是分布式计划中,CN用于收集DN的数据进行最后的处理,除非最后收集的行数非常多,这个算子涉及性能问题一般较少。Redistribute和Broadcast一是对“互补”的算子,前者用于重分布,后者用于广播,生成计划时,优化器会根据代价大小来选择。当Join Key没有包含表的分布键的时候,一般会添加Redistribute路径,能选择Redistribute路径理论上也可选择Broadcast路径,最终选择哪条路径要看优化器估算的代价是多少。这两个算子可以通过参数enable_redistribute和enable_broadcast进行控制。在SMP开启的情况下,当并行度(dop)大于1时,一般还会有Local Redistribute、Split Redistribute、Local Broadcast和Split Broadcast;当倾斜优化开启时,还有PART REDISTRIBUTE PART ROUNDROBIN、PART_REDISTRIBUTE_PART_BROADCAST、PART_REDISTERIBUTE_PART_LOCAL等等,这些也是Stream算子,主要就是重分布、广播、RoundRobin的一些扩展形式,这里我们不一一介绍了,感兴趣的读者可以参考GaussDB DWS 产品手册。我们考虑两个表的简单关联,store_sales和sr_tbl,它们的分布键分别是ss_item_sk 和sr_returned_date_sk,Join 条件是store_sales.ss_customer_sk =sr_tbl. sr_customer_sk,执行结果如下:由于两个表的分布键都不是Join Key,因此走Hash Join路径的话需要有一个表做Broadcast或者两个表都做Redistribute,但是store_sales表比较大(E-rows显示28.7亿行),而sr_tbl表行数估算比较少(E-rows显示100行),优化器认为适合做Broadcast。于是最终选择了一边Broadcast的计划。对于这个计划,由于sr_tbl表统计信息不准确(如果是中间结果集,则表示中间结果集估算不准),一种调优的方法是,将sr_tbl的表统计信息重新收集准确一些(如果sr_tbl是中间结果集,则无法收集),另一种方法是让sr_tbl走Redistribute路径,而后者我们又有两种方式来实现,一是用Plan Hint,即在生成计划时,告诉优化器走Redistribute路径,二是把Broadcast关掉。禁用Broadcast后,执行计划如下:本列中,开启了SMP自适应,即优化器会根据系统资源和当前Active SQL数量来自行决定并行度(dop),如果Redistribute和Broadcast选择不当,则可能导致(1)Broadcast计划会出现下盘(2)两个计划的并行度不一样,最终执行时间可能会差异比较大。对于Stream方式的控制,一般的调优方式有Plan Hint、GUC参数、改善统计信息或估算信息。Plan Hint的详细介绍可以参考产品手册或者:GaussDB(DWS)性能调优系列实战篇六:十八般武艺Plan hint运用。五、结束语本文介绍的cost_param属于cost底层参数,建议对数据特征和使用场景比较熟悉的DBA慎重使用。Scan、Join、Stream调控的基本依据也是代价,代价一般体现在执行耗时上,调优时可从Performance中识别出性能的瓶颈点,分析选择的算子是否与代价匹配。另外,除了本文介绍的Session级别的控制参数外,还有基表、中间结果的行数,也可以通过Plan Hint进行语句级别的调控,感兴趣读者可通过GaussDB DWS产品文档进一步了解。原文链接:https://bbs.huaweicloud.com/blogs/212459【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS)云端运维系列第六期:参数调整(参数组,单集群参数调整)
    为了方便您配置数据库参数,GaussDB(DWS) 提供了参数模板的功能,参数模板中包含了一些常用的数据库参数。您可以直接在GaussDB(DWS) 管理控制台上管理参数模板,将参数模板应用到集群后,可以直接在集群的“参数修改”页面中修改参数。一、参数模板概述     参数模板是一组适用于数据仓库的参数,模板中的参数都设置了默认值,这些参数包括会话超时时间、日期和时间格式等。通过调整参数值,可以使数据库更好地适配实际业务。在创建集群时,您可以为集群指定一个参数模板,模板中的参数将被应用于该GaussDB(DWS) 集群中的所有数据库,如果您未指定参数模板,系统将为集群应用默认的参数模板。当集群创建成功后,您可以在集群“参数修改”页面修改参数,也可以在参数模板管理页面,选择其他参数模板或者创建新的参数模板重新应用到对应的集群。     GaussDB(DWS) 为每个版本的数据仓库预置了一个默认参数模板,默认参数模板不支持删除和修改。如果用户想要修改参数模板中的参数值,可以创建一个自定义参数模板,自定义参数模板中的参数值允许被修改。自定义参数模板被应用到集群后,它与集群并无关联关系,之后,如果您修改了该自定义模板中的参数值,其修改并不会同步到集群,您需要重新将该参数模板应用到集群,才能使修改后的参数值应用到集群。同样的,如果您在集群详情页面修改参数,其修改也不会同步到参数模板。参数说明     参数配置如图所示:      其中,各个参数的具体含义及配置方法如下表所示:    参数名称参数描述默认值session_timeoutSession闲置超时时间,单位为秒,0表示关闭超时限制。取值范围:0 ~ 86400。600datestyle设置日期和时间值的显示格式。ISO,MDYfailed_login_attempts输入密码错误的次数达到该参数所设置的值时,帐户将会被自动锁定。配置为0时表示不限制密码输入错误的次数。取值范围:0 ~ 1000。10timezone设置显示和解释时间类型数值时使用的时区。UTClog_timezone设置服务器写日志文件时使用的时区。UTCenable_resource_record设置是否开启资源记录功能。当SQL语句实际执行时间大于resource_track_duration参数值(默认为60s,可自行设置)时,监控信息将会归档。此功能开启后会引起存储空间膨胀及轻微性能影响,不用时请关闭。说明:归档:监控信息保存在history视图,归档在info表。归档时间为三分钟,归档后history视图中的记录会被清除。history视图GS_WLM_SESSION_HISTORY,对应存入info表GS_WLM_SESSION_INFO。history视图GS_WLM_OPERATOR_HISTORY,对应存入info表GS_WLM_OPERATOR_INFO。offresource_track_cost设置对语句进行资源监控的最小执行代价。值为-1或者执行语句代价小于10时,不进行资源监控。值大于等于0时,执行语句的代价大于等于10并且超过这个参数的设定值就会进行资源监控。SQL语句的预估执行代价可通过执行SQL命令Explain进行查询。此参数在集群版本1.5.0或以上有效。100000resource_track_duration设置当前会话资源监控实时视图中记录的语句执行结束后进行归档的最小执行时间。值为0时,资源监控实时视图中记录的所有语句都会进行历史信息归档。值大于0时,资源监控实时视图中记录的语句的执行时间超过设定值就会进行历史信息归档。60password_effect_time设置帐户密码的有效时间,临近或超过有效期系统会提示用户修改密码。取值范围为0 ~999,单位为天。设置为0表示不开启有效期限制功能。此参数在集群版本1.5.0或以上有效。90update_lockwait_timeout该参数控制并发更新同一行时单个锁的最长等待时间。当申请的锁等待时间超过设定值时,系统会报错。0表示不等待,有锁时直接报错。默认值120000,单位为毫秒。此参数在集群版本1.5.0或以上有效。120000二、创建参数模板  如果默认参数模板中的参数值无法满足业务,用户可以创建自定义参数模板,并修改其中的参数值,从而更好地适配业务。  创建参数模板操作步骤如下:登录GaussDB(DWS) 管理控制台。在左侧导航栏中,单击“参数模板管理”。单击“创建参数模板”,然后设置以下参数。· “数据库引擎”:选择一个数据库引擎。· “数据库版本”:选择一个数据库版本。· “参数模板名”:填写新参数模板的名称。   参数模板名称长度为4~64个字符,必须以字母开头,不区分大小写,可以包含字母、数字、中划线或者下划线,不能包含其他的特殊字符。· “描述”:填写新参数模板的描述信息。此参数为可选参数。三、应用参数模板到集群  集群创建成功后,用户可以为集群应用一个新的参数模板,将参数模板中所有参数的值应用到对应的集群中。  应用参数模板的操作步骤如下:登录GaussDB(DWS) 管理控制台。在左侧导航栏中,单击“参数模板管理”。选择一个目标参数模板,在“操作”列中单击“应用”。在“参数模板应用”对话框,选择目标集群。单击“确定”。     如果重新应用的参数模板与集群原来的参数取值不同,系统会弹窗显示两组参数值的对比。四、删除参数模板  对于多余或者不再使用的参数模板,用户可以将其删除,但是不支持删除默认参数模板。成功删除的参数模板无法恢复,请用户谨慎操作。登录GaussDB(DWS) 管理控制台。在左侧导航栏中,单击“参数模板管理”。在待删除的参数模板右侧操作列,单击“删除”。在弹出的对话框,单击“是”。原文链接:https://bbs.huaweicloud.com/blogs/212712【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS) 运维接口集成简介
    【摘要】某些场景下,客户可能会需要将GaussDB(DWS)集群的运维功能集成到自己的平台上方便进行统一运维管理,此时客户可以通过GaussDB(DWS)提供的标准REST API进行和GaussDB(DWS)的管理平台对接。1. 使用场景         一般情况下,客户可以在GaussDB(DWS)的管理平台对集群进行运维管理,如创建、删除、扩容、重启集群等操作,同时这些运维接口已标准REST协议对外开放,客户如果有自己的统一运维管理平台,如有需要可以将这些运维操作对接到自己的统一管理平台。2. 对接流程        首先客户需要使用登录GaussDB(DWS)管理平台的用户名密码从IAM服务获取token,然后在请求中携带获取的token调用GaussDB(DWS)提供的REST API接口,如下图    3. 示例        接下来,我们以Spring框架中的RestTemplate作为REST客户端,以HCS 8.0.2环境为例进行接口调用的详细步骤演示。        1). 从HCS的lld配置中获取IAM服务的endpoint,如:iam-cache-proxy.hcs.com:26336,根据《华为云Stack8.0.2数据仓库服务用户指南》5.6.6章节中的方式获取dws服务的endpoint,如:dws.cn-global-1.hcs.com;        2). 构造获取token的请求体并发送请求获取token        String body = String.format("{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":{\"user\":{\"name\":\"%s\",\"password\":\"%s\",\"domain\":{\"name\":\"%s\"}}}},\"scope\":{\"project\":{\"name\":\"%s\"}}}}", appProperties.getMo_user_name(), appProperties.getMo_user_pass(), appProperties.getMo_user_domain_name(), appProperties.getMo_user_project_name());        ResponseEntity<String> responseEntity = restTemplate.exchange("https://iam-cache-proxy.eihcs.com:26335/v3/auth/tokens", HttpMethod.POST, httpEntity, String.class);        String token=responseEntity.getHeaders().getFirst("X-Subject-Token");        3). 通过GaussDB(DWS)的REST运维接口查询集群列表        HttpHeaders headers = new HttpHeaders();        headers.setContentType(MediaType.APPLICATION_JSON);        headers.set("X-Auth-Token", token);        HttpEntity<String> httpEntity = new HttpEntity<>(headers);        ResponseEntity<String> responseEntity = restTemplate.exchange("https://dws.cn-global-1.eihcs.com/v1.0/${project_id}/clusters",        HttpMethod.GET, httpEntity, String.class);        String clusters=responseEntity.getBody();        GaussDB(DWS)当前已支持的开放API以及API的详细说明请参考《华为云Stack8.0.2数据仓库服务用户指南》第5章节“接口参考”。原文链接:https://bbs.huaweicloud.com/blogs/210852【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS)云端运维系列第三期:集群监控
    数据仓库服务与华为云监控服务(Cloud Eye)无缝集成。用户可以平台实时查看集群和实例的各项指标。通过监控集群和实例运行时的各项指标,用户可以识别出数据库集群状态异常的时间段,然后在数据库日志中,分析可能存在问题的活动,从而优化数据库性能。查看集群监控信息    1.登录DWS数据库服务,在左侧导航栏中选择“集群管理”。    2.单击待监控集群名称,进入查看监控指标,打开云监控管理控制台。  3.云监控支持查看数据仓库服务中数据仓库集群的监控信息,支持查看集群中各个节点各项监控信息。用户可以根据需要,选择指定的监控指标名称以及时间范围,从而显示监控指标的性能曲线。 查看实例监控信息    1.登录云监控服务,在左侧导航栏中选择“云服务监控>数据仓库服务”。    2.在选择数据仓库节点,单击待监控实例名称,进入查看监控指标。多节点间的监控指标对比    1.  在云监控管理控制台的左侧导航栏中,单击“总览 > 监控面板”。    2.  在“监控面板”页面,单击“创建监控面板”,在弹出对话框中,输入“名称”后,单击“确定”。    3.  在“监控面板”页面,单击右上角的“添加监控视图”。    4.  在弹出的“添加监控视图”窗口中,配置标题和监控项。    配置数据存储  云监控各监控指标数据的保留期限为两天,超过保留周期后数据将被删除。如果需要永久存储,需要您开通对象存储服务(OBS),将监控指标数据数据可以同步保存至OBS。创建告警规则    通过设置GaussDB(DWS) 的告警规则,用户可以自定义监控目标和通知策略,及时了解GaussDB(DWS) 运行状态,从而起到预警作用。设置GaussDB(DWS) 的告警规则包括设置告警规则名称、监控对象、监控指标、告警阈值、监控周期和是否发送通知等参数。        1.  登录GaussDB(DWS) 管理控制台。        2.  在左侧导航栏中选择“集群管理”。        3.  在指定集群所在行的“操作”列中,单击“查看监控指标”,进入云监控管理控制台,查看数据仓库服务监控信息。             确认待查看“监控信息”的集群状态必须为“可用”,否则不能进行创建告警操作。        4.  在云监控管理控制台的左侧导航树上,选择“告警 > 告警规则”。        5.  在“告警规则”界面,单击右上方“创建告警规则”。        6.  在“创建告警规则”界面,根据界面提示配置参数。             a.  配置规则名称和描述。             b.  配置告警内容,根据界面提示配置参数。 原文链接:https://bbs.huaweicloud.com/blogs/204386【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS)云端运维系列第四期:集群安全(SSL连接,三权分立)
    SSL连接GaussDB(DWS) 支持SSL认证方式的连接,以加密GaussDB(DWS) 客户端与数据库之间传输的数据。SSL连接方式的安全性高于普通模式,集群默认开启SSL功能允许来自客户端的SSL连接或非SSL连接,从安全性考虑,建议用户在客户端使用SSL连接方式。如果要强制使用SSL连接,需要为集群开启“服务器端是否强制使用SSL连接”。DWS支持SSL通道加密和证书认证两种方式进行客户端与服务器端的通信。您可以通过服务器端是否强制使用SSL连接进行设置。开关打开,即只能通过SSL方式连接。开关关闭,即两种方式均可。默认关闭。在集群的“安全设置”页面可以设置是否开启“服务器端是否强制使用SSL连接”。【说明】 修改安全配置参数并保存生效可能需要重启集群,将导致集群暂时不可用。实时数仓暂不支持SSL连接。 实时数仓暂不支持MRS数据源连接。 修改集群安全配置必须同时满足以下两个条件:集群状态为“可用”或“低性能”。任务信息不能处于“创建快照中”、“节点扩容”、“配置中”或“重启中”。设置SSL连接登录GaussDB(DWS) 管理控制台。在左侧导航树中,单击“集群管理”。在集群列表中,单击指定集群的名称,然后单击“安全设置”。默认显示“配置状态”为“已同步”,表示页面显示的是数据库当前最新结果。在“SSL连接”区域中,单击“服务器端是否强制使用SSL连接”的设置开关进行设置,建议开启。:开启,表示服务器端强制要求SSL连接。:关闭,表示服务器端对是否通过SSL连接不作强制要求,默认为关闭。  说明:  如果使用GaussDB(DWS) 提供的gsql客户端或ODBC驱动,GaussDB(DWS) 支持的SSL协议为TLSv1.2。  如果使用GaussDB(DWS) 提供的JDBC驱动,支持的SSL协议有SSLv3、TLSv1、TLSv1.1、TLSv1.2。客户端与数据库之间实际使用何种SSL协议,依赖客户端使用的JDK(Java Development Kit)版本,一般JDK支持多个SSL协议。5.    单击“应用”。系统将自动应用保存SSL连接设置,在“安全设置”页面,“配置状态”显示“应用中”。当“配置状态”显示为“已同步”,表示配置已保存生效。客户端和服务端SSL连接参数组合情况  客户端最终是否使用SSL加密连接方式、是否验证服务器证书,取决于客户端参数sslmode与服务器端(即GaussDB(DWS) 集群侧)参数ssl、require_ssl。参数说明如下:ssl(服务器)ssl参数表示是否开启SSL功能。on表示开启,off表示关闭。对于集群版本高于1.3.1(包括1.3.1)的集群,默认为on,不支持在GaussDB(DWS) 管理控制台上设置。对于集群版本低于1.3.1的集群,默认为on。ssl参数可通过GaussDB(DWS) 管理控制台上集群的“安全设置”页面中的“SSL连接”进行设置。require_ssl(服务器) require_ssl参数是设置服务器端是否强制要求SSL连接,该参数只有当ssl为on时才有效。on表示服务器端强制要求SSL连接。off表示服务器端对是否通过SSL连接不作强制要求。对于集群版本高于1.3.1(包括1.3.1)的集群,默认为off。require_ssl参数可通过GaussDB(DWS) 管理控制台上集群的“安全设置”页面中的“服务器端是否强制使用SSL连接”进行设置。对于集群版本低于1.3.1的集群,默认为off,不支持在GaussDB(DWS) 管理控制台上设置。 sslmode(客户端)可在SQL客户端工具中进行设置。在gsql命令行客户端中,为“PGSSLMODE”参数。在Data Studio客户端中,为“SSL模式”参数。客户端参数sslmode与服务器端参数ssl、require_ssl配置组合结果如下:表1 客户端与服务器端SSL参数组合结果ssl(服务器)sslmode(客户端)require_ssl(服务器)结果ondisableon由于服务器端要求使用 SSL,但客户端针对该连接禁用了 SSL,因此无法建立连接。disableoff连接未加密。allowon连接经过加密。allowoff连接未加密。preferon连接经过加密。preferoff连接经过加密。requireon连接经过加密。requireoff连接经过加密。verify-caon连接经过加密,且验证了服务器证书。verify-caoff连接经过加密,且验证了服务器证书。offdisableon连接未加密。disableoff连接未加密。allowon连接未加密。allowoff连接未加密。preferon连接未加密。preferoff连接未加密。requireon由于客户端要求使用 SSL,但服务器端禁用了 SSL,因此无法建立连接。requireoff由于客户端要求使用 SSL,但服务器端禁用了 SSL,因此无法建立连接。verify-caon由于客户端要求使用 SSL,但服务器端禁用了 SSL,因此无法建立连接。verify-caoff由于客户端要求使用 SSL,但服务器端禁用了 SSL,因此无法建立连接。下载SSL证书GaussDB(DWS) 支持SSL标准协议(TLS 1.2),SSL协议是安全性更高的协议标准,它们加入了数字签名和数字证书来实现客户端和服务器的双向身份验证,保证了通信双方更加安全的数据传输。为支持SSL连接方式,GaussDB(DWS) 已经从CA认证中心申请到正式的服务器、客户端的证书和密钥(假设服务器的私钥为server.key,证书为server.crt,客户端的私钥为client.key,证书为client.crt,CA根证书名称为cacert.pem。)。GaussDB(DWS) 集群(即服务器端)默认已开启SSL功能允许来自客户端的SSL连接或非SSL连接,并且,GaussDB(DWS) 服务器端的证书、私钥以及根证书已经默认配置完成。如果客户端或JDBC/ODBC应用程序要使用SSL连接方式,用户必须在客户端或应用程序代码中配置相关的SSL连接参数。GaussDB(DWS) 管理控制台提供了客户端所需的SSL证书,该SSL证书包含了客户端所需的默认证书、私钥、根证书以及私钥密码加密文件。请将该SSL证书下载到客户端所在的主机上,然后在客户端中指定证书所在的路径。说明:使用默认的证书可能存在安全风险,为了提高系统安全性,强烈建议用户定期更换证书以避免被破解的风险。如果需要更换证书,请联系客服。步骤:登录GaussDB(DWS) 管理控制台。在左侧导航栏中,单击“连接管理”。 在“下载驱动程序”区域,单击“这里”下载SSL证书文件。三权分立介绍为了保护用户的数据安全,DWS支持使用不同类型的用户分别控制不同权限的三权分立模式。开启此模式后,用户划分为:系统管理员、安全管理员、审计管理员和普通用户,其中三类管理员用户权限彼此分离。默认权限机制和系统管理员两节的描述基于的是集群创建之初的默认情况。从前面的介绍可以看出,默认情况下拥有SYSADMIN属性的系统管理员,具备系统最高权限。在实际业务管理中,为了避免系统管理员拥有过度集中的权利带来高风险,可以设置三权分立,将系统管理员的权限分立给安全管理员和审计管理员。三权分立后,系统管理员将不再具有CREATEROLE属性(安全管理员)和AUDITADMIN属性(审计管理员)能力。即不再拥有创建角色和用户的权限,并不再拥有查看和维护数据库审计日志的权限。关于CREATEROLE属性和AUDITADMIN属性的更多信息请参考CREATE ROLE。三权分立后,系统管理员只会对自己作为所有者的对象有权限。三权分立的设置办法请参考设置三权分立部分。三权分立前的权限详情及三权分立后的权限变化,请分别参见表1和表2。表1 默认的用户权限对象名称系统管理员安全管理员审计管理员普通用户表空间对表空间有创建、修改、删除、访问、分配操作的权限。不具有对表空间进行创建、修改、删除、分配的权限,访问需要被赋权。表对所有表有所有的权限。仅对自己的表有所有的权限,对其他用户的表无权限。索引可以在所有的表上建立索引。仅可以在自己的表上建立索引。模式对所有模式有所有的权限。仅对自己的模式有所有的权限,对其他用户的模式无权限。函数对所有的函数有所有的权限。仅对自己的函数有所有的权限,对其他用户放在public这个公共模式下的函数有调用的权限,对其他用户放在其他模式下的函数无权限。自定义视图对所有的视图有所有的权限。仅对自己的视图有所有的权限,对其他用户的视图无权限。系统表和系统视图可以查看所有系统表和视图。只可以查看部分系统表和视图。详细请参见系统表和系统视图。 表2 三权分立较非三权分立权限变化说明对象名称系统管理员安全管理员审计管理员普通用户表空间无变化无变化。表权限缩小。只对自己的表有所有权限,对其他用户放在属于各自模式下的表无权限。无变化。索引权限缩小。只可以在自己的表上建立索引。无变化。模式权限缩小。只对自己的模式有所有的权限,对其他用户的模式无权限。无变化。函数权限缩小。只对自己的函数有所有的权限,对其他用户放在属于各自模式下的函数无权限。无变化。自定义视图权限缩小。只对自己的视图及其他用户放在public模式下的视图有所有的权限,对其他用户放在属于各自模式下的视图无权限。无变化。系统表和系统视图无变化。无变化。无变化。无权查看任何系统表和视图。设置三权分立操作场景        默认情况下,创建GaussDB(DWS) 集群时指定的管理员用户属于数据库的系统管理员,能够创建其他用户和查看数据库的审计日志,即权限不分立,三权分立模式为关闭。        为了保护集群数据的安全,GaussDB(DWS) 支持对集群设置三权分立,使用不同类型的用户分别控制不同权限的模式。        默认的权限模型和开启三权分立后的权限模型,请参见《数据仓库服务数据库开发指南》的三权分立章节。对系统影响修改安全配置参数并保存生效可能需要重启集群,将导致集群暂时不可用。前提条件:修改集群安全配置必须同时满足以下两个条件:集群状态为“可用”或“低性能”。任务信息不能处于“创建快照中”、“节点扩容”、“配置中”或“重启中”。操作步骤1.      登录GaussDB(DWS) 管理控制台。2.      在左侧导航树中,单击“集群管理”。3.      在集群列表中,单击指定集群的名称,然后单击“安全设置”。4.      默认显示“配置状态”为“已同步”,表示页面显示的是数据库当前最新结果。5.      在“安全设置”页面,设置三权分立 表示开启三权分立模式。开启“三权分立”后,分别设置“安全管理员”和“审计管理员”的用户名和密码,系统将会创建这两个用户。使用这两个用户可以连接数据库并执行数据库的相关操作    表示关闭三权分立模式。默认为关闭状态。图1 安全配置表1 安全配置参数说明参数名参数解释样例值安全管理员用户命名要求如下:l  只能由小写字母、数字或下划线组成。l  必须以小写字母或下划线开头。l  长度为6~64个字符。l  用户名不能为GaussDB(DWS) 数据库的关键字。GaussDB(DWS) 数据库的关键字,具体请参见《数据仓库服务数据库开发指南》中关键字章节。security_admin密码密码复杂度要求如下:l  密码长度为8~32个字符。l  不能与用户名或倒序的用户名相同。l  密码至少包含大写字母、小写字母、数字和特殊字符四类中的三类,其中可输入的特殊字符为:~!@#%^&*()-_=+|[{}];:,<.>/?l  弱口令检查。Dws_2018!确认密码再次输入安全管理员密码。-审计管理员用户命名要求如下:l  只能由小写字母、数字或下划线组成。l  必须以小写字母或下划线开头。l  长度为6~64个字符。l  用户名不能为GaussDB(DWS) 数据库的关键字。GaussDB(DWS) 数据库的关键字,具体请参见《数据仓库服务数据库开发指南》中关键字章节。audit_admin密码密码复杂度要求如下:l  密码长度为8~32个字符。l  不能与用户名或倒序的用户名相同。l  密码至少包含大写字母、小写字母、数字和特殊字符四类中的三类,其中可输入的特殊字符为:~!@#%^&*()-_=+|[{}];:,<.>/?l  弱口令检查。Dws_2018!确认密码再次输入审计管理员密码。-6.      单击“应用”。7.      在弹出的“保存配置”窗口中,选择是否勾选“立即重启集群”,然后单击“是”。如果勾选“立即重启集群”,系统将保存“安全设置”页面的配置并立即重启集群,集群重启成功后安全设置将立即生效。如果不勾选“立即重启集群”,系统将只保存“安全设置”页面的配置。稍后,用户需要手动重启集群才能使安全设置生效。安全设置完成后,在“安全设置”页面,“配置状态”有如下3种状态:“应用中”:表示系统正在保存配置。“已同步”:表示配置已保存生效。“需重启生效”:表示配置已保存但还未生效。如需生效,需重启集群。原文链接:https://bbs.huaweicloud.com/blogs/205961【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [测试] GaussDB(DWS)自定义函数返回多结果集
    【摘要】 简要描述GaussDB(DWS)自定义函数中多结果集返回的使用方法以及部分案例。在使用GaussDB(DWS)过程中经常会创建自定义函数,总结了多结果集返回的使用方法。1. 建表postgres=> create table test_tb_01(id integer,name varchar);NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'id' as the distribution column by default.HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.CREATE TABLEpostgres=> insert into test_tb_01 values(generate_series(1,5),'aa');INSERT 0 5 2. 返回单列多行·         使用return next variable:create or replace function test_func_01()return setof varcharasout_name varchar;begin    for out_name in select name from test_tb_01 loop       return next out_name;    end loop;end;/ postgres=> select test_func_01(); test_func_01-------------- aa aa aa aa aa(5 rows)·         指定out参数,使用return next:create or replace function test_func_02(out out_name varchar)return setof varcharasv_rec RECORD;begin    for v_rec in select * from test_tb_01 loop       out_name := v_rec.name;       return next;    end loop;end;/ postgres=> select test_func_02(); test_func_02-------------- aa aa aa aa aa(5 rows)·         使用return query:create or replace function test_func_03()return setof varcharasbegin    return query(select name from test_tb_01);end;/ postgres=> select test_func_03(); test_func_03-------------- aa aa aa aa aa(5 rows)3. 返回多列的多行·         使用return next variable:create or replace function test_func_04()RETURN SETOF RECORD asdeclare    v_rec record;begin    for v_rec in select * from test_tb_01 loop       return next v_rec;    end loop;end;/自定义函数test_func_04的调用,需要注意如下问题:postgres=> select test_func_04();ERROR:  Set-valued function called in context that cannot accept a set when init tuple store for RETURN NEXT/RETURN QUERY.CONTEXT:  PL/pgSQL function test_func_04() line 6 at RETURN NEXTreferenced column: test_func_04postgres=> select * from test_func_04();ERROR:  a column definition list is required for functions returning "record"LINE 1: select * from test_func_04();需要使用as子句来处理结果集postgres=> select  * from test_func_04() as t(id integer,name varchar); id | name----+------  1 | aa  2 | aa  3 | aa  4 | aa  5 | aa(5 rows)指定out参数就不会有问题,如下test_func_05所示:·         指定out参数,使用return next:create or replace function test_func_05(out out_id integer,out out_name varchar)return setof record asdeclare    v_rec record;begin    for v_rec in select * from test_tb_01 loop       out_id := v_rec.id;       out_name := v_rec.name;       return next;    end loop;end;/ postgres=> select * from test_func_05(); id | name----+------  1 | aa  2 | aa  3 | aa  4 | aa  5 | aa(5 rows)·         使用return query:create or replace function test_func_06()return setof record asbegin   return query(select id,name from test_tb_01);end;/ postgres=> select * from test_func_06() as t(id integer,name varchar); id | name----+------  1 | aa  2 | aa  3 | aa  4 | aa  5 | aa(5 rows)原文链接:https://bbs.huaweicloud.com/blogs/205964【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
总条数:2746 到第 页
上滑加载中