-
OBS导入数据,将样例数据通过OBS导入到集群。数据导入流程:准备数据文件:CSV格式的数据文件。创建OBS存储桶,并将数据文件上传至桶。创建外表,用于引流OBS存储桶中的数据到GaussDB(DWS)集群。启动GaussDB(DWS)并创建数据库表后,将OBS上的数据导入到表中。 步骤1:上传数据到OBS 准备数据文件 GaussDB(DWS)支持将OBS上的TEXT、CSV、ORC和CARBONDATA格式的数据导入到集群中。提前准备一个数据文件。 OBS上传数据到将上面准备的3个CSV格式的数据源文件存储到OBS桶中。步骤2:外表字段说明步骤3:执行数据导入若出现以下类似信息,说明数据导入成功。执行SELECT命令查询目标表product_info,查看从OBS导入到GaussDB(DWS)中的查询结果显示如中所示的数据,表示导入成功。创建外表 CREATE FOREIGN TABLE date_dim_in_csv3(d_date_sk integer,d_date_id char(16),d_date date,d_month_seq integer,d_week_seq integer,d_quarter_seq integer,d_year integer,d_dow integer,d_moy integer,d_dom integer,d_qoy integer,d_fy_year integer,d_fy_quarter_seq integer,d_fy_week_seq integer,d_day_name char(9) ,d_quarter_name char(6),d_holiday char(1),d_weekend char(1),d_following_holiday char(1),d_first_dom integer,d_last_dom integer,d_same_day_ly integer,d_same_day_lq integer,d_current_day char(1),d_current_week char(1),d_current_month char(1),d_current_quarter char(1),d_current_year char(1)) SERVER gsmpp_server OPTIONS(location 'gsobs://obs-data.obs.ctyun.cn/data/date_dim.dat' ,FORMAT 'TEXT' ,DELIMITER '|', encoding 'utf8',access_key '$access_key ',secret_access_key '$secret_access_key ');在GaussDB(DWS)数据库中,创建一个名为catalog_page_scv的表,用于存储从OBS导入的数据。DROP TABLE IF EXISTS catalog_page_scv;CREATE TABLE catalog_page_scv(d_date_sk INT,d_date_id char(16),d_date date,d_month_seq INT,d_week_seq INT,d_quarter_seq INT,d_year INT,d_dow INT,d_moy INT,d_dom INT,d_qoy INT,d_fy_year INT,d_fy_quarter_seq INT,d_fy_week_seq INT,d_day_name char(9),d_quarter_name char(6),d_holiday char(1),d_weekend char(1),d_following_holiday char(1),d_first_dom INT,d_last_dom INT,d_same_day_ly INT,d_same_day_lq INT,d_current_day char(1),d_current_week char(1),d_current_month char(1),d_current_quarter char(1),d_current_year char(1));执行INSERT命令,通过外表date_dim_in_csv3将OBS上的数据导入到目标表catalog_page_scv 中:insert into catalog_page_scv select * from date_dim_in_csv3;SERVER:无需修改,即固定设为gsmpp_server。LOCATION:OBS路径由“obs://”、桶名和文件路径组成,即为:obs://<bucket_name>/<file_path>FORMAT此教程中待入库的为CSV格式的数据,故设为CSV。如果是其他格式,请对应替换。DELIMITER此教程中数据源文件中的数据是以“,”分隔的。ENCODING此教程中数据源文件编码格式为UTF-8。HEADER此参数用于指定数据文件是否包含标题行。该参数只针对CSV格式的数据文件有效。准备数据文件中的数据文件第一行不是标题行(即表头),故设为“false”。ACCESS_KEY和SECRET_ACCESS_KEY用户访问OBS的AK和SK,请根据实际替换。获取访问密钥,请登录管理控制台,将鼠标移至右上角的用户名,单击“我的凭证”,然后在左侧导航树单击“访问密钥”。在访问密钥页面,可以查看已有的访问密钥ID(即AK),如果要同时获取AK和SK,可以单击“新增访问密钥”创建并下载访问密钥。FILL_MISSING_FIELDS当数据导入时,数据源文件中一行的最后一个字段缺失的处理方式。默认为false/off。本教程中设为“true”。IGNORE_EXTRA_DATA数据源文件中的字段比外表定义列数多时,是否忽略多出的列。默认为false/off。本教程中设为“true”。READ ONLY外表的语法定义通用于从OBS导入数据到GaussDB(DWS)集群和从集群导出数据到OBS。数据导入集群时,请将外表设为READ ONLY;导出时,请设为WRITE ONLY。LOG INTO指定记录导入过程中数据格式错误信息的错误表。只需指定表名,无需预先创建。GaussDB(DWS)在执行创建外表语句时会自动创建该表,并在删除外表时对其自动删除。PER NODE REJECT LIMIT指定本次数据导入过程中每个DN实例上允许出现的数据格式错误的数量,如果有一个DN实例上的错误数量大于设定值,本次导入失败,报错退出。本教程设置为“unlimited”,即接受导入过程中所有数据格式错误。true/on:表示最后一个字段缺失时,把最后一个字段的值设置为NULL,不报错。false/off:表示最后一个字段缺失时,做如下报错提示:missing data for column "tt"。例如,源数据文件product_info2.csv中第2条记录的最后一个字段段“product_comment_content”缺失。当FILL_MISSING_FIELDS设为false/offtrue/on:数据源文件中字段比外表定义列数多,则忽略行尾多出来的列。不报错false/off:若数据源文件中字段比外表定义列数多,做如下报错提示:extra data after last expected column。例如,源数据文件product_info2.csv中第3条记录比外表定义列数多。当IGNORE_EXTRA_DATA设为false/off时,导入数据时错误表中会有类连接GaussDB(DWS)数据库。创建外表。传到OBS上的三个CSV格式的数据文件,为后续将数据引流至GaussDB(DWS)普通表中做准备。DROP FOREIGN TABLE IF EXISTS product_info_ext;CREATE FOREIGN TABLE product_info_ext( product_price integer not null, product_id char(30) not null, product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) ) SERVER gsmpp_server OPTIONS(LOCATION 'obs://mybucket/input_data/product_info | obs://mybucket02/input_data/product_info',FORMAT 'CSV' ,DELIMITER ',',ENCODING 'utf8',HEADER 'false',ACCESS_KEY 'access_key_value_to_be_replaced',SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced',FILL_MISSING_FIELDS 'true',IGNORE_EXTRA_DATA 'true')READ ONLY LOG INTO product_info_err PER NODE REJECT LIMIT 'unlimited';返回如下信息表示创建成功:CREATE FOREIGN TABLE外表中相关参数的设置说明如下:登录OBS管理控制台。单击“服务列表”,选择“对象存储服务”,打开OBS管理控制台页面。创建桶。如何创建OBS桶。新建文件夹。上传文件//认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全原文链接:https://bbs.huaweicloud.com/blogs/242254【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
【摘要】 GaussDB(DWS)除了支持标准的POSIX正则表达式句法,还拥有一些特殊句法和选项,这些你可了解?本文便为你讲解这些特殊句法和选项。概述正则表达式(Regular Expression,简称RE),通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式使用比较灵活,功能强大,因此经常被用到进行文本的搜索和替换中,帮助开发人员快速进行批量文本查询和处理。比如常用的linux的grep命令,许多程序设计语言比如Perl、Tcl也都支持正则表达式进行字符串操作。GaussDB(DWS)支持的正则表达式POSIX 1003.2中定义的正则表达式RE有两种形式:扩展RE或ERE(大致为egrep的RE),和基本RE或BRE(大致为ed的RE),GaussDB(DWS)都支持这两种形式,并实现了在编程语言(如Perl和Tcl)中广泛使用而POSIX标准中未包含的一些扩展。使用这些非POSIX扩展的RE在本文中称为高级RE或ARE。ARE几乎是ERE的超集,但是BRE有几种符号不相容性(而且是有限的)。GaussDB(DWS)的正则表达式的主要句法和在其他程序语言中支持的句法功能相同,此文不再赘述。本文中对GaussDB(DWS)拥有的特殊形式和句法进行说明。GuassDB(DWS)支持的正则表达式函数GaussDB(DWS)提供了支持POSIX正则表达式的函数,如表1所示。表1 GaussDB(DWS)中的正则表达式函数函数返回类型描述参数说明regexp_replace(string text, pattern text, replacement text [, flags text])Text提供了将匹配POSIX正则表达式模式的子串替换为新文本的功能string:待处理的源字符串pattern:一个正则表达式REreplacement:用此字符串替换原字符串中匹配的部分flags:可选参数,具体取值参见表2regexp_matches(string text, pattern text [, flags text])setof text[]返回一个文本数组,该数组由匹配一个POSIX正则表达式模式得到的所有被捕获子串构成regexp_split_to_table(string text, pattern text [, flags text])setof text把一个POSIX正则表达式模式当作一个定界符来分离一个串regexp_split_to_array(string text, pattern text [, flags text ])text[]和regexp_split_to_table类似,是一个正则表达式分离函数,不过它的结果以一个text数组的形式返回从表1中看到,GuassDB(DWS)支持的正则表达式函数都有一个可选的flags参数,该参数的可选项及其含义是什么呢?下面将展开进行详细举例说明。GaussDB(DWS)正则表达式函数的flags参数详解表2中列举了表1中flags参数的所有可选项。表2 GaussDB(DWS)正则表达式函数的flags参数的选项说明选项描述bRE是一个BRE,表示按照BRE匹配模式的规则进行匹配c大小写敏感匹配 (是一个可被覆盖的操作符类型)g表示替换每一个匹配的子字符串而不仅仅是第一个。默认仅替换第一个匹配的子字符串i大小写不敏感匹配(是一个可被覆盖的操作符类型)m和选项n同义n换行敏感匹配,此选项生效时,换行符影响元字符(.、^、$和[^)的匹配p部分换行敏感匹配,此选项生效时,换行符影响元字符(.和[^)的匹配。部分是相对选项n而言qRE被认为是加双引号的文本字符串,所有字符都是普通字符s非换行敏感匹配(默认),与n相对t紧凑语法(默认)w反部分换行敏感匹配,此选项生效时,换行符影响元字符(^和$)的匹配。部分是相对选项n而言x扩展语法表2中给出的flags参数选项描述,非常简洁,理解起来比较困难。下面通过一些示例,来直观帮助理解上面这些flags参数选项的含义。g选项示例1-1:未指定’g‘选项,仅对第一个匹配项进行替换示例1-2:指定’g‘选项,对所有匹配项进行替换c 和 i 选项示例2-1:默认情况下,进行大小写敏感匹配示例2-2:显示指定进行大小写敏感匹配示例2-3:显示指定进行大小写不敏感匹配 n[或m]、s、p、w选项对元字符点(.)的影响示例3-1:指定选项n时,元字符点(.)不匹配换行符示例3-2:指定选项s时,元字符点(.)匹配换行符示例3-3:指定选项p时,元字符点(.)不匹配换行符示例4-4:指定选项w时,元字符点(.)匹配换行符n[或m]、s、p、w选项对元字符^、$的影响示例5-1:指定选项n时,元字符点^、$匹配行首和行尾示例5-2:指定选项s时,元字符点^、$不匹配行首和行尾示例5-3:指定选项p时,元字符点^、$不匹配行首和行尾示例5-4:指定选项w时,元字符点^、$匹配第一个行首匹配的行到最后一个行尾匹配的行 n[或m]、s、p、w选项对元字符 [^ 的影响示例6-1:指定选项n时,换行符不匹配被[^排除的字符,所有行尾的换行符未被替换为M示例6-2:指定选项s时,换行符匹配被[^排除的字符,所有行尾的换行符被替换为M示例6-3:指定选项p时,换行符不匹配被[^排除的字符,所有行尾的换行符被替换为M示例6-4:指定选项w时,换行符匹配被[^排除的字符,所有行尾的换行符被替换为M t 和 x 选项通常情况下,RE语法都是严格的,即RE中的所有字符都是重要的。严格语法是默认的,也可以通过指定选项t表示。示例6-1:在严格语法中,空白字符也是重要的GaussDB(DWS)还有一个扩展语法,通过指定x选项表示。在扩展语法中,RE中的空白字符(在这里,空白是空格、水平制表符、新行、和任何属于space字符类的字符。)将被忽略,以及#和换行符(或RE的结尾)之间的所有字符也将被忽略。这种语法允许对复杂的RE进行分段落和注释。示例6-2:在扩展语法中,RE中的空格被忽略该规则有三个例外:转义字符\后的空白或#被保留示例6-3括号表达式中的空白或#被保留示例6-4空白和注释不能出现多字符符号中。在 ARE 里,方括弧表达式外面,序列(?#ttt) (这里的ttt是任意不包含)的文本)是一个注释,完全被忽略。示例6-5:空格出现在多字符符号中示例6-6:注释出现在多字符符号中当flags中指定了多个有相反含义的选项时,则后出现的选项覆盖前面出现的选项示例7-1:后出现的s选项覆盖了n选项示例7-2:后出现的n选项覆盖了s选项GaussDB(DWS)正则表达式的特殊句法两个特殊的前缀:***: 和***=一个RE可以以两个特殊的前缀中的某一个开头。RE以***:开头RE以***:开头,则剩余的RE被当作一个ARE。(在GaussDB(DWS)中,这通常没有作用,因为RE被假定为ARE;但是,如果正则表达式函数的flags参数指定了ERE或BRE模式,那么它就会起作用。)示例8-1:在BRE匹配模式中(regexp_replace函数的最后一个参数中指定的字母‘b’即表示使用BRE匹配模式),正则表达式中要表示圆括号表达式,需要将圆括号进行转义;同样,表示原子精确次数匹配序列的花括号,也需要进行转义示例8-2:增加***: 前缀后,即使指定了使用BRE匹配模式,也是按照ARE的匹配模式的规则进行匹配RE以***=开头RE以***=开头,则RE的其余部分被认为是一个字面字符串,所有字符都被认为是普通字符。示例9-1:‘|’在ARE匹配模式的正则表达式中是代表或含义的元字符示例9-2:代表或含义的元字符‘|’,在以***=为前缀的正则表达式中,失去其元字符的特殊含义,被看作字符串中的普通字符嵌套选项ARE可以以嵌套选项开头:序列(?xyz) (其中xyz是一个或多个字母字符)指定影响RE其余部分的选项。这些选项覆盖任何先前确定的选项,特别是,它们可以覆盖由正则表达式运算符或正则表达式函数的flags参数隐含的大小写敏感行为。可选择的字母如表2所示中除’g’选项外的其他选项。示例10-1:不含嵌套选项的大小写不敏感匹配示例10-2:嵌套选项中的大小写敏感覆盖flags中的大小写不敏感匹配结语通过上面丰富的示例,深入了解了GaussDB(DWS)正则表达式的特殊句法和flags选项含义,在使用GaussDB(DWS)正则表达式函数时便可以得心应手。原文链接:https://bbs.huaweicloud.com/blogs/242030【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
【摘要】 通过对GaussDB(DWS)执行计划中_REMOTE_XXX_QUERY_相关信息的解读,帮忙用户理解执行计划的含义,提升调优能力。在日常使用GaussDB(DWS)时,打印执行计划是调优的必备手段,大家会经常在执行计划中看到_REMOTE_XXX_QUERY_的字样,很多人翻阅GaussDB(DWS)资料,会发现执行计划中包含_REMOTE_TABLE_QUERY_关键字表示语句不下推,怀疑自己的语句出了问题,无法在分布式架构下发挥极致性能,这个时候不要慌,下面给大家简单介绍一下各种各样的_REMOTE_XXX_QUERY_分别代表的意义。_REMOTE_TABLE_QUERY_执行计划中包含这种信息,确实表示语句不下推,比如如下的例子:postgres=# explain (costs off, verbose on) select mydiv(c1, c2) from t1; QUERY PLAN -------------------------------------------------------------------- id | operation ----+------------------------------------------------- 1 | -> Data Node Scan on t1 "_REMOTE_TABLE_QUERY_"表示语句没有下推,需要把Datanode的数据收取到Coordinator上,语句在Coordinator上执行,在日志中有具体的不下推原因[BACKEND] LOG: SQL can't be shipped, reason: Function mydiv() can not be shipped[BACKEND] STATEMENT: explain (costs off, verbose on) select mydiv(c1, c2) from t1;或者在TOPSQL的系统表gs_wlm_session_info和gs_wlm_session_history中可以找到具体不下推的原因postgres=# select query,warning,query_plan from gs_wlm_session_history;-[ RECORD 1 ]----------------------------------------------------------------------------------------------------query | select mydiv(c1, c2) from t1;warning | SQL is not plan-shipping, reason : "Function mydiv() can not be shipped"query_plan | 1 | Data Node Scan on t1 "_REMOTE_TABLE_QUERY_" (cost=0.00..30.00 rows=120 width=8)信息表示mydiv这个自定义函数是不能下推的,知道了具体原因就可以针对问题进行优化了。另外类似的还有三种类型的不下推关键字,分别是__REMOTE_GROUP_QUERY____REMOTE_LIMIT_QUERY____REMOTE_SORT_QUERY__但是这种计划一般情况下是不会出现的,除非关闭了stream开关enable_stream_operator,具体计划参考如下,在set enable_stream_operator to off;之后打印执行计划会显示这几种信息:postgres=# EXPLAIN (COSTS OFF, VERBOSE ON) SELECT count(*) FROM t1; QUERY PLAN ---------------------------------------------------------- id | operation ----+--------------------------------------------------- 1 | -> Aggregate 2 | -> Data Node Scan on "__REMOTE_GROUP_QUERY__"postgres=# EXPLAIN (COSTS OFF, VERBOSE ON) SELECT * FROM t1 limit 1; QUERY PLAN ---------------------------------------------------------- id | operation ----+--------------------------------------------------- 1 | -> Limit 2 | -> Data Node Scan on "__REMOTE_LIMIT_QUERY__"postgres=# EXPLAIN (COSTS OFF, VERBOSE ON) SELECT * FROM t1 order by 1; QUERY PLAN --------------------------------------------------------- id | operation ----+-------------------------------------------------- 1 | -> Sort 2 | -> Data Node Scan on "__REMOTE_SORT_QUERY__" __REMOTE_FQS_QUERY__执行计划中包含__REMOTE_FQS_QUERY__,表明语句走了FQS(Fast Query Shipping),代表这种场景下,直接下发语句到Datanode执行,而不是在Coordinator上生成执行计划,这种表示该语句无需Datanode间数据交互,例如简单的等值过滤查询,或者是关联列是分布列的关联查询,例如如下的例子:postgres=# EXPLAIN (COSTS OFF, VERBOSE ON) SELECT * FROM t1 where c2=1; QUERY PLAN ----------------------------------------------------------------- id | operation ----+---------------------------------------------- 1 | -> Data Node Scan on "__REMOTE_FQS_QUERY__"postgres=# EXPLAIN (COSTS OFF, VERBOSE ON) SELECT t1.* FROM t1, t2 where t1.c1=t2.c1; QUERY PLAN ----------------------------------------------------------------------------------------- id | operation ----+---------------------------------------------- 1 | -> Data Node Scan on "__REMOTE_FQS_QUERY__"这种执行计划并不代表不下推,而是语句较为简单,无需在Coordinator节点生成执行计划,通过调整enable_fast_query_shipping参数,可以让语句在Coordinator节点生成执行计划下发给Datanode执行,例如上述例子的关联查询,在设置set enable_fast_query_shipping to off;之后重新打印执行计划:postgres=# set enable_fast_query_shipping to off;SETpostgres=# EXPLAIN (COSTS OFF, VERBOSE ON) SELECT t1.* FROM t1, t2 where t1.c1=t2.c1; QUERY PLAN ------------------------------------------------ id | operation ----+------------------------------------ 1 | -> Streaming (type: GATHER) 2 | -> Hash Join (3,4) 3 | -> Seq Scan on public.t1 4 | -> Hash 5 | -> Seq Scan on public.t2带有__REMOTE_FQS_QUERY__信息的执行计划通常是不需要调优的。__REMOTE_LIGHT_QUERY__执行计划中包含__REMOTE_LIGHT_QUERY__,叫做CN轻量化(Light Proxy),表示在FQS(Fast Query Shipping)计划的基础上,该语句直接下发给了单个Datanode,这种计划出现语句可以指向单个Datanode的场景,例如单条的INSERT插入操作,以及过滤条件是分布列可以定向到某个Datanode的查询:keyword=# explain (COSTS OFF, VERBOSE ON) insert into t1 values(1); QUERY PLAN ------------------------------------------------------- id | operation ----+------------------------------------------------ 1 | -> Data Node Scan on "__REMOTE_LIGHT_QUERY__" keyword=# explain (COSTS OFF, VERBOSE ON) select * from t1 where c1=1; QUERY PLAN ------------------------------------------------------- id | operation ----+------------------------------------------------ 1 | -> Data Node Scan on "__REMOTE_LIGHT_QUERY__"CN轻量化(Light Proxy)是一种优化器针对OLTP类型业务的优化操作,以此来达到提升性能的目的,有一点需要注意,想要利用这种优化,必须要保证客户端的client_encoding和数据库的server_encoding保持一致,这种执行计划不需要进行调优。讲到这里,相信大家已经对各种_REMOTE_XXX_QUERY_执行计划代表的含义有了一些了解,希望能够帮助大家更好地解读GaussDB(DWS)的执行计划。原文链接:https://bbs.huaweicloud.com/blogs/242036【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
CMS数据库实例CMS即GaussDB(DWS)集群管理模块(Cluster Manager Server)缩写,是管理和监控分布式系统中各个功能单元和物理资源运行情况,确保整个系统稳定运行的组件。CMS模块分为CMS_Primary和CMS_Standby,作为高可用的一部分,CMS主在故障后,备CMS会自动升为主CMS,避免出现CMS单节点故障。此外,CMS能够对CMAgent上报的集群实例状态做仲裁,判断当前状态是否正常,是否需要修复,并下发指令给CMAgent执行。CMS通信对象集群管理中,CM通信主要分为三个对象,分别为:1、CMA:CMA周期性上报实例GTM,CN,DN状态给CMS,并发送心跳,CMS将仲裁结果下发command给CMA,实现实例重启、主备倒换、failover升主、实例build等操作,其中使用消息类型对各个command进行区分。2、cm_ctl:cm_ctl查询集群状态,做switchover、build、query等操作时,需要与cms通信,查询操作由cms返回相关数据,集群使能操作通过cms进行转发。3、CMS主备间通信:CMS主备间通信涉及到集群HA特性,主要用于同步对集群状态监控的数据,并且作为选主操作时候同步信息。CMS通信的基本方式CMS底层使用TCP/IP协议进行通信,socket的建立以及通信过程中的收发使用内部通信库完成。其中CMS会建立两个socket端口,如下图所示,其中端口号小的与CMA和cm_ctl进行通信,端口号大的与cms进行主备通信,两个socket可以区分开来,实现通信模型上互不干扰。tcp 0 0 192.168.233.17:6850 0.0.0.0:* LISTEN 26087/cm_server tcp 0 0 192.168.226.35:6851 0.0.0.0:* LISTEN 7632/cm_server此外,由于CMS主备通信的连接数有限,但是CMA和cm_ctl的连接数较多,所以会使用不同的通信模型。其中前者使用select模型,后者使用epoll模型+线程池技术。两者都是典型的I/O多路复用技术,即当socket具备读或者写的状态,会触发相应的事件通知,这样多个文件描述符就能够并行的完成相应的工作,提高系统的并发程度。CMS通信的实现1、线程池模型为了提高系统的并发程度和效率,当集群节点数增多,并且在运行过程中需要频繁查询集群状态时候,需要有大量的CMA和cm_ctl对CMS进行访问。CMS为此开辟了专门的线程负责线程池的管理工作,并使用epoll IO多路复用机制。具体线程池接入流程如下图所示:1)cms主线程2)CMS线程池事件处理流程以上流程图可以看出,CMS主线程主要负责分发事件,每个cm_ctl、cma的连接由线程池内线程去完成。2、select方式CMS主备之间由于通信压力不大,只有两个实例之间通讯,所以主要采用select轮询的方式。每一个HA线程周期,从socket中select已经具备通信条件的文件描述符,完成消息的收发,实现命令消息同步和选主消息的发送。原文链接:https://bbs.huaweicloud.com/blogs/241853【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
MapReduce服务(MapReduce Service,简称MRS)是一个基于开源Hadoop生态环境而运行的大数据集群,对外提供大容量数据的存储和分析能力,可解决用户的数据存储和处理需求。用户可以将海量业务数据,存储在MRS的分析集群,即使用Hive/Spark组件保存。Hive/Spark的数据文件则保存在HDFS中。GaussDB(DWS)支持在相同网络中,配置一个GaussDB(DWS)集群连接到一个MRS集群,然后将数据从HDFS中的文件读取到GaussDB(DWS)。从MRS导入数据到集群的流程,大致可以分为5个步骤:第一步: MRS集群上的数据准备第二步:手动创建外部服务器第三步:创建外表第四步:执行数据导入第五步:清除资源1 MRS集群上的数据准备从MRS导入数据到GaussDB(DWS)集群之前,假设您已经完成了以下准备工作:(1)已创建MRS集群。(2)在MRS集群上创建了Hive/Spark ORC表,且表数据已经存储到该表对应的HDFS路径上。如果您已经完成上述准备,则可以跳过本章节。为方便起见,我们将以在MRS集群上创建Hive ORC表作为示例,完成上述准备工作。在MRS集群上创建Spark ORC表的大致流程和SQL语法,同Hive类似,在本文中不再展开描述。1.1 数据文件假设有数据文件product_info.txt,示例数据如下所示:100,XHDK-A-1293-#fJ3,2017-09-01,A,2017 Autumn New Shirt Women,red,M,328,2017-09-04,715,good205,KDKE-B-9947-#kL5,2017-09-01,A,2017 Autumn New Knitwear Women,pink,L,584,2017-09-05,406,very good!300,JODL-X-1937-#pV7,2017-09-01,A,2017 autumn new T-shirt men,red,XL,1245,2017-09-03,502,Bad.310,QQPX-R-3956-#aD8,2017-09-02,B,2017 autumn new jacket women,red,L,411,2017-09-05,436,It's really super nice150,ABEF-C-1820-#mC6,2017-09-03,B,2017 Autumn New Jeans Women,blue,M,1223,2017-09-06,1200,The seller's packaging is exquisite200,BCQP-E-2365-#qE4,2017-09-04,B,2017 autumn new casual pants men,black,L,997,2017-09-10,301,The clothes are of good quality.250,EABE-D-1476-#oB1,2017-09-10,A,2017 autumn new dress women,black,S,841,2017-09-15,299,Follow the store for a long time.108,CDXK-F-1527-#pL2,2017-09-11,A,2017 autumn new dress women,red,M,85,2017-09-14,22,It's really amazing to buy450,MMCE-H-4728-#nP9,2017-09-11,A,2017 autumn new jacket women,white,M,114,2017-09-14,22,Open the package and the clothes have no odor260,OCDA-G-2817-#bD3,2017-09-12,B,2017 autumn new woolen coat women,red,L,2004,2017-09-15,826,Very favorite clothes980,ZKDS-J-5490-#cW4,2017-09-13,B,2017 Autumn New Women's Cotton Clothing,red,M,112,2017-09-16,219,The clothes are small98,FKQB-I-2564-#dA5,2017-09-15,B,2017 autumn new shoes men,green,M,4345,2017-09-18,5473,The clothes are thick and it's better this winter.150,DMQY-K-6579-#eS6,2017-09-21,A,2017 autumn new underwear men,yellow,37,2840,2017-09-25,5831,This price is very cost effective200,GKLW-l-2897-#wQ7,2017-09-22,A,2017 Autumn New Jeans Men,blue,39,5879,2017-09-25,7200,The clothes are very comfortable to wear300,HWEC-L-2531-#xP8,2017-09-23,A,2017 autumn new shoes women,brown,M,403,2017-09-26,607,good100,IQPD-M-3214-#yQ1,2017-09-24,B,2017 Autumn New Wide Leg Pants Women,black,M,3045,2017-09-27,5021,very good.350,LPEC-N-4572-#zX2,2017-09-25,B,2017 Autumn New Underwear Women,red,M,239,2017-09-28,407,The seller's service is very good110,NQAB-O-3768-#sM3,2017-09-26,B,2017 autumn new underwear women,red,S,6089,2017-09-29,7021,The color is very good 210,HWNB-P-7879-#tN4,2017-09-27,B,2017 autumn new underwear women,red,L,3201,2017-09-30,4059,I like it very much and the quality is good.230,JKHU-Q-8865-#uO5,2017-09-29,C,2017 Autumn New Clothes with Chiffon Shirt,black,M,2056,2017-10-02,3842,very good1.1 在MRS集群上创建Hive ORC表(1)创建了MRS集群。(2)登录MRS集群的Hive客户端。(a)登录Master节点(b)执行以下命令切换用户sudo su - omm(c)执行以下命令切换到客户端目录cd /opt/client(d)执行以下命令配置环境变量source bigdata_env(e)如果当前集群已启用Kerberos认证,执行以下命令认证当前用户,当前用户需要具有创建Hive表的权限。配置拥有对应权限的角色。为用户绑定对应角色。如果当前集群未启用Kerberos认证,则无需执行此命令,例如,kinit hiveuser。kinit MRS集群用户(f)执行以下命令启动Hive客户端beeline(3)在Hive中创建数据库demo,执行以下命令创建数据库:CREATE DATABASE demo(4)在数据库demo中新建了一个Hive TEXTFILE类型的表product_info,并将数据文件(product_info.txt)导入到该表对应的HDFS路径中,执行以下命令切换到demo数据库:USE demo;执行以下命令,创建表product_info,表字段按照数据文件中的数据进行定义:DROP TABLE product_info;CREATE TABLE product_info ( product_price int not null, product_id char(30) not null, product_time date, product_level char(10), product_name varchar(200), product_type1 varchar(20), product_type2 char(10), product_monthly_sales_cnt int, product_comment_time date, product_comment_num int, product_comment_content varchar(200) ) row format delimited fields terminated by ',' stored as TEXTFILE;(5)在数据库demo中创建了一个Hive ORC表product_info_orc,执行以下命令,创建Hive ORC表product_info_orc,表字段与上一步创建的表product_info完全一致:DROP TABLE product_info_orc;CREATE TABLE product_info_orc( product_price int not null, product_id char(30) not null, product_time date, product_level char(10), product_name varchar(200), product_type1 varchar(20), product_type2 char(10), product_monthly_sales_cnt int, product_comment_time date, product_comment_num int, product_comment_content varchar(200) ) row format delimited fields terminated by ',' stored as orc;(6)将product_info表的数据插入到Hive ORC表product_info_orc中。insert into product_info_orc select * from product_info;查询表product_info_orcselect * from product_info_orc;2 手动创建外部服务器创建外表语法(CREATE FOREIGN TABLE (SQL on Hadoop or OBS))中,需指定一个与MRS数据源连接相关联的外部服务器。当您通过GaussDB(DWS)管理控制台创建MRS数据源连接时,数据库管理员dbadmin会在默认数据库postgres中自动创建一个外部服务器。因此,如果您希望在默认数据库postgres中创建外表读取MRS数据,可以跳过本章节。如果您希望使用普通用户在自定义数据库中创建外表读取MRS数据,必须先在自定义数据库中手动创建一个外部服务器。本章节将为您介绍,如何使用普通用户在自定义数据库中创建外部服务器。步骤如下:第一步:请确保GaussDB(DWS)集群已创建MRS数据源连接。第二步:创建用户和数据库并授予外表权限第三步:手动创建外部服务器说明:需要注意的是,当您不再需要从该MRS数据源读取数据时,通过GaussDB(DWS)管理控制台删除MRS数据源,仅会删除在默认数据库postgres中自动创建的外部服务器,手动创建的外部服务器需要您手动删除。2.1 创建用户和数据库并授予外表权限以下示例,是新建一个普通用户dbuser并创建一个数据库mydatabase,然后使用管理员用户授予dbuser外表权限。(1)使用数据库管理员通过GaussDB(DWS)提供的数据库客户端连接默认数据库postgres,例如,使用gsql客户端的用户通过如下语句连接数据库,根据界面提示输入密码。gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -r(2)新建一个普通用户,并用它创建一个数据库。新建一个具有创建数据库权限的用户dbuser:CREATE USER dbuser WITH CREATEDB PASSWORD "Bigdata@123";切换为新建的用户SET ROLE dbuser PASSWORD "Bigdata@123";执行以下命令创建数据库:CREATE DATABASE mydatabase;查询数据库:SELECT * FROM pg_database;返回结果中有mydatabase 的信息表示创建成功。(3)使用管理员用户给普通用户赋予创建外部服务器的权限和使用外表的权限。使用数据库管理员用户通过数据库客户端连接新建的数据库。例如,使用gsql客户端的用户可以直接使用如下语句切换为管理员用户去连接新建的数据库,根据提示输入用户密码。\c mydatabase dbadmin;说明:注意,必须先使用管理员用户连接到将要创建外部服务器和使用外表的数据库,再对普通用户进行授权。默认只有系统管理员才可以创建外部服务器,普通用户需要授权才可以创建,执行以下命令授权:GRANT ALL ON FOREIGN DATA WRAPPER hdfs_fdw TO dbuser;其中FOREIGN DATA WRAPPER的名字只能是hdfs_fdw,dbuser为创建SERVER的用户名。执行以下命令赋予用户使用外表的权限。ALTER USER dbuser USEFT;查看用户,返回结果中,dbuser的信息中包含了UseFT权限,表示授权成功:select r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, r.rolconnlimit, r.rolvalidbegin, r.rolvaliduntil, array( select b.rolname from pg_catalog.pg_auth_members m join pg_catalog.pg_roles b on (m.roleid = b.oid) where m.member = r.oid ) as memberof, r.rolreplication, r.rolauditadmin, r.rolsystemadmin, r.roluseft from pg_catalog.pg_roles r order by 1;2.2 手动创建外部服务器(1)使用数据库管理员通过GaussDB(DWS)提供的数据库客户端连接默认数据库postgres。例如:通过gsql客户端登录数据库的用户可以使用以下两种方法中的一种进行连接:(a)如果已经登录了gsql客户端,可以执行以下命令切换数据库和用户,根据提示输入密码:\c postgres dbadmin;(b)如果尚未登录gsql客户端,或者已经登录了gsql客户端执行\q退出gsql后,执行以下命令重新进行连接,根据提示输入密码:gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -r(2)执行以下命令查询自动创建的外部服务器的信息。SELECT * FROM pg_foreign_server;查询结果中,每一行代表一个外部服务器的信息。与MRS数据源连接相关联的外部服务器包含以下信息:(a)srvname值包含“hdfs_server”字样以及MRS集群的ID,此ID与MRS管理控制台的集群列表MRS ID相同。(b)srvoptions字段中的address参数为MRS集群的主备节点的IP地址及端口。您可以根据上述信息找到您所要的外部服务器,并记录下它的srvname和srvoptions的值。(3)切换为即将创建外部服务器的用户去连接其对应的数据库。在本示例中,执行以下命令,使用创建用户和数据库并授予外表权限中创建的普通用户dbuser连接其创建的数据库mydatabase 。\c mydatabase dbuser;(4)创建外部服务器,创建外部服务器的详细语法,请参见CREATE SERVER。示例如下:CREATE SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca FOREIGN DATA WRAPPER HDFS_FDW OPTIONS ( address '192.168.1.245:25000,192.168.1.218:25000', hdfscfgpath '/MRS/8f79ada0-d998-4026-9020-80d6de2692ca', type 'hdfs');(5) 查看外部服务器,返回结果如下所示,表示已经创建成功:SELECT * FROM pg_foreign_server WHERE srvname='hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca';3 创建外表在GaussDB(DWS)数据库中创建一个Hadoop外表,用来访问存储在MRS HDFS文件系统上的Hadoop结构化数据。Hadoop外表是只读的,只能用于查询操作,可直接使用SELECT查询其数据,您可以按照以下步骤创建外表:第一步: 请确保您已经完成前提条件第二步:根据创建外表(CREATE FOREIGN TABLE (SQL on Hadoop or OBS))的语法描述,需要先获取以下信息:第三步:获取MRS数据源的HDFS路径第四步:获取MRS数据源连接的外部服务器信息第五步:创建外表3.1 前提条件已创建MRS集群,并将数据导入Hive/Spark数据库中的ORC表。GaussDB(DWS)集群已创建MRS数据源连接。3.2 获取MRS数据源的HDFS路径有两种方法可以查看:方法一:对于Hive数据,可以登录MRS的Hive客户端,执行以下命令查看表的详细信息,并记录下location参数中的数据存储路径。use <database_name>;desc formatted <table_name>;例如,返回结果中location参数值为“hdfs://hacluster/user/hive/warehouse/demo.db/product_info_orc/”,则记录HDFS路径为“/user/hive/warehouse/demo.db/product_info_orc/”。方法二:按以下步骤获取HDFS路径。(a)登录MRS管理控制台。(b)选择“集群列表 > 现有集群”,单击要查看的集群名称,进入集群基本信息页面。(c)单击“文件管理”,选择“HDFS文件列表”。(d)进入您要导入到GaussDB(DWS)集群的数据的存储目录,并记录其路径。3.3 获取MRS数据源连接的外部服务器信息(1)使用创建外部服务器的用户去连接其对应的数据库。是否使用普通用户在自定义数据库中创建外表,请根据需求进行选择:场景一:是(a)请先确保,您已按照手动创建外部服务器章节中的步骤,创建了普通用户dbuser和它的数据库mydatabase,并在mydatabase中手动创建了一个外部服务器。(b)使用用户dbuser通过GaussDB(DWS)提供的数据库客户端连接数据库mydatabase。(c)如果已经使用gsql客户端连接至数据库,可以直接执行如下命令进行用户和数据库切换,根据界面提示输入密码:\c mydatabase dbuser;场景二:否当您通过GaussDB(DWS)管理控制台创建MRS数据源连接时,数据库管理员dbadmin会在默认数据库postgres中自动创建一个外部服务器。因此,如果使用数据库管理员dbadmin在默认数据库postgres中创建外表,需要通过GaussDB(DWS)提供的数据库客户端工具连接数据库。例如,使用gsql客户端的用户通过如下命令连接数据库,根据界面提示输入密码:gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -r(2)执行以下命令,查看已创建的MRS数据源连接的外部服务器信息。SELECT * FROM pg_foreign_server;查询结果中,每一行代表一个外部服务器的信息。与MRS数据源连接相关联的外部服务器包含以下信息:o srvname值包含“hdfs_server”字样以及MRS集群的ID,此ID与MRS管理控制台的集群列表MRS ID相同。o srvoptions字段中的address参数为MRS集群的主备节点的IP地址及端口。您可以根据上述信息找到您所要的外部服务器,并记录下它的srvname和srvoptions的值。3.4 创建外表当完成获取MRS数据源连接的外部服务器信息和获取MRS数据源的HDFS路径后,就可以创建一个外表,用于读取MRS数据源数据。创建外表的语法格式如下。CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [ { column_name type_name [ { [CONSTRAINT constraint_name] NULL | [CONSTRAINT constraint_name] NOT NULL | column_constraint [...]} ] | table_constraint [, ...]} [, ...] ] ) SERVER dfs_server OPTIONS ( { option_name ' value ' } [, ...] ) DISTRIBUTE BY {ROUNDROBIN | REPLICATION} [ PARTITION BY ( column_name ) [ AUTOMAPPED ] ] ;根据以上信息,创建外表命令如下所示:DROP FOREIGN TABLE IF EXISTS foreign_product_info;CREATE FOREIGN TABLE foreign_product_info( product_price integer not null, product_id char(30) not null, product_time date, product_level char(10), product_name varchar(200), product_type1 varchar(20), product_type2 char(10), product_monthly_sales_cnt integer, product_comment_time date, product_comment_num integer, product_comment_content varchar(200) ) SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca OPTIONS (format 'orc', encoding 'utf8',foldername '/user/hive/warehouse/demo.db/product_info_orc/') DISTRIBUTE BY ROUNDROBIN;4 执行数据导入4.1 直接查询外表查看MRS数据源的数据如果数据量较少,可直接使用SELECT查询外表,即可查看到MRS数据源的数据,执行以下命令,则可以从外表查询数据。SELECT * FROM foreign_product_info;查询结果显示如数据文件中所示的数据,表示导入成功。查询结果的结尾将显示以下信息:(20 rows),通过外表查询到数据后,用户可以将数据插入数据库的普通表。4.2 导入数据后查询数据(1) 在GaussDB(DWS)数据库中,创建导入数据的目标表,用于存储导入的数据。该表的表结构必须与创建外表中创建的外表的表结构保持一致,即字段个数、字段类型要完全一致。例如,创建一个名为product_info的表,示例如下:DROP TABLE IF EXISTS product_info;CREATE TABLE product_info( product_price integer not null, product_id char(30) not null, product_time date, product_level char(10), product_name varchar(200), product_type1 varchar(20), product_type2 char(10), product_monthly_sales_cnt integer, product_comment_time date, product_comment_num integer, product_comment_content varchar(200) ) with (orientation = column,compression=middle) DISTRIBUTE BY HASH (product_id);(2)执行“INSERT INTO .. SELECT ..”命令从外表导入数据到目标表,示例:INSERT INTO product_info SELECT * FROM foreign_product_info;若出现以下类似信息,说明数据导入成功。INSERT 0 20(3)执行SELECT命令,查看从MRS导入到GaussDB(DWS)中的数据。SELECT * FROM product_info;查询结果显示如数据文件中所示的数据,表示导入成功。查询结果的结尾将显示以下信息:(20 rows)5 清除资源当完成本教程的示例后,如果您不再需要使用本示例中创建的资源,您可以删除这些资源,以免资源浪费或占用您的配额。5.1 删除外表和目标表(1)(可选)如果执行了导入数据后查询数据,请执行以下命令,删除目标表。DROP TABLE product_info;(2)执行以下命令,删除外表。DROP FOREIGN TABLE foreign_product_info;5.2 删除手动创建的外部服务器如果执行了手动创建外部服务器,请按照以下步骤删除外部服务器、数据库和用户。(1)使用创建外部服务器的用户通过GaussDB(DWS)提供的数据库客户端连接到外部服务器所在的数据库。例如,使用gsql客户端的用户可以通过以下两种方法中的一种进行连接:(a)如果已经登录了gsql客户端,可以执行以下命令进行切换:\c mydatabase dbuser;(b)如果已经登录了gsql客户端,您也可以执行\q退出gsql后,再执行以下命令重新进行连接:gsql -d mydatabase -h 192.168.2.30 -U dbuser -p 8000 -r(2)删除手动创建的外部服务器。执行以下命令进行删除,详细语法请参见DROP SERVER:DROP SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca;返回以下信息表示删除成功:DROP SERVER查看外部服务器:SELECT * FROM pg_foreign_server WHERE srvname='hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca';返回结果如下所示,表示已经删除成功:srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions---------+----------+--------+---------+------------+--------+------------(0 rows)5.3 删除自定义数据库。通过GaussDB(DWS)提供的数据库客户端连接默认数据库postgres。如果已经登录了gsql客户端,可以直接执行如下命令进行切换:\c postgres执行以下命令,删除自定义数据库:DROP DATABASE mydatabase;返回以下信息表示删除成功:DROP DATABASE1.1 使用管理员用户,删除本示例中创建的普通用户。使用数据库管理员用户通过GaussDB(DWS)提供的数据库客户端连接数据库。如果已经登录了gsql客户端,可以直接执行如下命令进行切换:\c postgres dbadmin执行以下命令回收创建外部服务器的权限:REVOKE ALL ON FOREIGN DATA WRAPPER hdfs_fdw FROM dbuser;其中FOREIGN DATA WRAPPER的名字只能是hdfs_fdw,dbuser为创建SERVER的用户名,执行以下命令删除用户:DROP USER dbuser;可使用\du命令查询用户,确认用户是否已经删除。原文链接:https://bbs.huaweicloud.com/blogs/239961【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
1. 摘要双集群容灾场景下,需要将主集群中的数据备份到备集群。然而,随着主集群数据量的增大,备集群不存在一个单独的大容量磁盘用于存放主集群发来的备份集,或存放备份集的盘符空间不足以存储主集群发来的所有备份文件。但是,容灾场景中仍然要能支持双集群的备份恢复。因此,为了解决磁盘存储空间限制的问题,提出分盘存储手段,从而实现备集群备份文件分散存储的目的。2. 分盘存储原理在双集群容灾设计中,主集群的角色是只做备份,备集群的角色是只做恢复。为了实现主备数据的同步,需要将备份集以.rch的格式进行数据拷贝。如上图所示,在优化前,主集群会将压缩在roachbackup中的数据全部scp到备集群的roachbackup中,这样的存储方式,会对备集群磁盘空间造成非常大的负担。在优化后,主集群会将压缩数据scp到备集群实例目录中的roachbackup文件夹,然后通过软链接的方式,备份目录中不同的DN和CN链接到了roachbackup文件夹。由于CN和DN分布在不同的磁盘上,同时软连接使得roach看到的路径和以前一样,这样就实现了数据分盘存放的目的。3. 分盘存储步骤第一步:在备集群CN和DN实例目录下创建文件夹roachbackup,主集群根据config.ini创建备集群的media目录下的目录链接:比如/data1/roach3/mediadata/roach/20210129_181026/ecs-env-2998/dn_6001_6002为一个符号链接,此符号链接可以指向备集群roachbackup目录/data1/ha_install_3/data1/roachbackup/20210129_091422/master1目录。其中,master1子目录为archive/data/data_colstore,分别代表着日志/行存数据/列存数据第二步: 备集群恢复前clean集群时,跳过各实例目录的roachbackup文件夹。第三步:在备份目录和实例目录不同的backupkey文件夹下,有不同的节点目录,在节点目录下有cn和dn目录,将备份目录下的cn和dn软连接到实例目录。第四步:只有全量备份和全量恢复时必须这样做,增量备份恢复可选。按照现在的设计逻辑,全量和增量备份都建立了软链接。第五步:恢复完成后,备集群删除创建的符号链接、各实例目录下的roachbackup文件夹,即恢复即删。对于主集群roachbackup目录,边传输数据,边删除数据,即传输即删。4. 分盘存储结果如上图所示,对于cn和dn目录,都通过软连接方式连接到了roachbackup对应的data_cn,master1,dummy1。通过软连接方式,roach在scp时,以为是传输到了一个磁盘上,但实际上写到了软连接对应的其他盘上,这样的话,数据也就实现了存放在不同磁盘上的目的。5. 软连接含义分盘存储中,实现的基础就是软连接的建立。那么,软连接是什么意思呢?软链接有着自己的inode号以及用户数据块。只不过用户数据块中存放的内容是另一文件的路径名的指向。如上图所示,在备集群恢复dn_6001_6002数据时,实际上是去/data1/ha_install_3/data1/roachbackup/20210129_091422/master1目录中去读取真正的数据,从而完成数据访问,最终实现备集群备份集的恢复功能。6. 结论随着数据仓库业务的发展以及客户数据量的增大,这就要求双集群容灾需要不断的迭代,深入挖掘客户需求是研发的第一性原则。双集群容灾任务存在很多的策略,如分盘存储,生命周期清理,断点续备份和断点续恢复,主备切换。继往开来,双集群新的特性仍需开发,如自动化测试工具、过程监控工具和云化等。未来可期,实现产品生态丰富的目的始终是研发的第一生产力。原文链接:https://bbs.huaweicloud.com/blogs/239963【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
【摘要】 GaussDB作为分布式集群,在单实例或单节点故障后能够正常提供服务,采用主备从架构模式,设计failover机制在主机故障后能够及时让备机升主接管业务保证可以正常对外提供服务。备机升主背景主机故障后,由cm_server下发failover消息,备机备机收到failover指令后启动升主流程,此时实例状态一直处于Promoting状态:连接从备,同步数据,不需要与主机进行交互,数据同步完之后做redo然后升主成功接管业务。触发场景 cm_server仲裁自动触发failover切换流程备机升主常见问题场景一:与从备连接失败【问题描述】查看集群状态实例6045处于pending need repair 6046实例处于standby promoting【问题分析】查看dn6046日志报错如下:查看从备3024日志报错FATAL: number of requested standby connections exceeds max_wal_senders (currently 4):由于从备wal_sender槽位满导致无法正常建联。【修复方案】常见于651版本1)kill 从备释放wal_sender资源待从备实例被重新拉起后观察是否能够正常升主2)若方法一未能让备机正常升主可强制让原主实例升主注意做强制升主操作时必须确定对应实例之前是主实例,请联系华为工程师进行操作手动停止promoting实例后执行以下命令kill -9 pid;sleep 4; gs_ctl notify -M primary -D 原主实例路径场景二:与从备同步数据异常无法升主【问题描述】集群状态不可用,dn6019处于down starting,dn6020处于 standby promoting状态【问题分析】查看dn6020日志提示与从备存在日志分叉:FATAL: invalid crc on secondary standby, has xlog, standby promote failed【修复方案】在从备实例目录下pg_xlog文件删除该xlog文件(将该文件移到其他路径)注意该方式可能造成数据丢失,是一种有损恢复方式,操作前必须与客户达成一致。注意:与从备同步数据太多会导致升主较慢。场景三:redo慢导致升主不成功此场景参考实例redo场景。 https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=75275附:GaussDB(DWS)高可用之数据复制GaussDB(DWS)高可用之备机重建GaussDB(DWS)高可用之主备从HA技术原文链接:https://bbs.huaweicloud.com/blogs/239867【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
GaussDB(DWS) 在公有云中集成了的数据库智能监控运维服务(DMS),提供了针对数据库的多维度的监控服务。采集监控原理DMS会在每一个GaussDB(DWS)节点自动部署采集服务,采集服务会将数据上报并缓存,并对原始采集的指标信息进行二次加工,以前台页面提供给用户可视化的展示方式,并提供了openAPI调用,方便用户通过接口调用获取DMS的数据,方便对接用户已有的监控系统指标项DMS监控针对GaussDB(DWS)集群,根据主机,集群,DB,实例,表五个维度进行数据采集。监控页1. 集群概览集群概览 - 资源整体消耗率集群可用性异常检测:集群只读、集群不可连接异常检测;集群规模监控:节点数,CN数量,数据库数量集群资源消耗情况:内存使用率,磁盘使用率,CPU使用率,磁盘I/O几个指标2. 主机资源监控主机监控可以提供 CPU/MEM/IO/网络等主机资源监控主机监控-概览主机监控CPU使用率主机监控 CPU使用率,可以获取CPU使用的整体和明细信息,分别计算了用户占用和系统占用已经空闲和I/O等待占比主机监控内存使用率主机监控概览-内存使用率,可以获取内存的使用率和内存总量,可用,已用和可用交换等信息主机监控-磁盘主机监控-磁盘,可以查询磁盘容量,磁盘使用率,磁盘读写速率,磁盘I/O使用率主机监控-网络主机监控-网络,支持查看网卡状态,网卡速度,接受和发送包数,丢包数,方便定位主机网络问题3. 数据库监控数据库监控数据库监控中提供了:名称,使用量,活跃会话数,活跃应用数,活跃查询数,全表扫描返回行数,索引查询返回行数4. 会话监控会话监控会话监控提供了:针对会话的ID,用户,用时,应用,SQL数,SQL用时,客户端IP,连接CN已经会话状态指标,并提供了终止会话接口,用来对超时会话执行终止5. SQL诊断SQL 诊断SQL诊断-详情SQL诊断提供了用户SQL分析,会对用户实际跑的SQL提供优化建议。GaussDB(DWS) DMS数据库智能监控运维服务会在2021 Q1上线公有云,请关注以下平台获取更多GaussDB(DWS)相关信息。原文链接:https://bbs.huaweicloud.com/blogs/239848【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
通过数据接入服务(Data Ingestion Service,简称DIS),可以将实时数据从DIS导入到GaussDB(DWS) 集群的数据库中。在这种场景下,DIS通道里的流式数据存储在DIS中,并周期性导入GaussDB(DWS) 中。导入GaussDB(DWS) 前数据临时存储在OBS,待转储GaussDB(DWS) 完成后删除OBS上的临时存储数据。从DIS导入数据到GaussDB(DWS) 的流程如下:1. 创建GaussDB(DWS) 集群、数据库和数据表2. 开通DIS通道,接入实时数据3. 在GaussDB(DWS) 数据库中查看从DIS导入的数据创建GaussDB(DWS) 集群、数据库和数据表1. 创建GaussDB(DWS) 集群。如果您已经有GaussDB(DWS) 集群了,也可以跳过这一步。例如,创建一个名为"dws-demo"的GaussDB(DWS) 集群。2. 使用SQL客户端连接GaussDB(DWS) 集群,选择其中一种方式连接集群。3. 在SQL客户端中,执行SQL语句,创建数据库、数据表和数据库模式(即schema)。参考如下参数完成数据库对象的创建: 数据库用户:用户名为“joe”, 密码为“Bigdata@123”。 数据库:“db_tpcds”。 数据库模式:“myschema”。如果您选择不创建数据库模式,默认情况下,新的数据库对象是创建在“public”模式下的。数据表:“mytable”。创建数据表时,请根据实际的源数据设计表结构。表的字段及其字段类型要和源数据一一对应。开通DIS通道,接入实时数据1. 登录DIS管理控制台,开通DIS通道。开通DIS通道的详细步骤,请参见开通DIS通道。从DIS导入数据到GaussDB(DWS) 的场景,对DIS通道的要求如下: 区域:必须选择与GaussDB(DWS) 集群相同的区域。目前区域仅支持“华北-北京四”。 源数据类型:只支持“CSV”。在DIS管理控制台,为刚购买的接入通道添加转储任务,“转储服务类型”选择“GaussDB(DWS) ”,将通道数据转储至GaussDB(DWS) 服务。添加转储任务时,GaussDB(DWS) 相关参数可按照创建GaussDB(DWS) 集群、数据库和数据表步骤中的情况进行填写。说明如下:转储服务类型:选择“GaussDB(DWS) ”。通道里的流式数据存储在DIS中,并周期性导入GaussDB(DWS) 中。导入GaussDB(DWS) 前数据临时存储在OBS,待转储GaussDB(DWS) 完成后删除OBS上的临时存储数据。 GaussDB(DWS) 集群:存储该通道数据的GaussDB(DWS) 集群名称。例如:“dws-demo ”。 GaussDB(DWS) 数据库:该通道数据的GaussDB(DWS) 数据库名称。例如:“db_tpcds”。 数据库模式:存储该通道数据的GaussDB(DWS) 数据库模式(即schema)。例如:“myschema ”。 GaussDB(DWS) 数据表:该通道数据的GaussDB(DWS) 数据库模式下的数据表。例如:“mytable”。 数据分隔符:用户数据的字段分隔符,根据此分隔符分隔用户数据插入GaussDB(DWS) 数据表的相应列。用户名:待转储的GaussDB(DWS) 目标数据库的用户名,该数据库用户需要有“GaussDB(DWS) 数据表”的读写权限。例如:“joe”。 密码:“用户名”参数所指定用户的密码。准备DIS应用开发环境,发送实时数据到DIS。在GaussDB(DWS) 数据库中查看从DIS导入的数据1. 使用SQL客户端连接GaussDB(DWS) 集群中已导入DIS数据的数据库。2. 在SQL客户端中执行查询命令,查看从DIS导入GaussDB(DWS) 的数据。命令示例如下,其中table_name请替换为DIS通道转储至GaussDB(DWS) 的目标数据表名。SELECT * FROM table_name;原文链接:https://bbs.huaweicloud.com/blogs/239204【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
为什么要进行数据备份? 数据库灾备能力是评价数据库的重要指标之一。GaussDB(DWS)支持线上、线下双集群容灾。支持物理异构、逻辑同构的两套集群进行周期性容灾,满足客户多样化使用需求。 能力介绍: 主容灾能力:生产集群在线周期性备份、灾备集群周期性恢复。根据客户不同需求,灵活设置数据备份恢复周期,有效错开业务高峰,灵活备份恢复。备份恢复期间一次备份恢复故障不影响整个备份恢复流程,能够快速识别,重新拉起任务,数据不丢失。 主备切换能力:生产集群故障,支持灾备集群备升主,快速替代主集群业务。容灾信息配置: 容灾配置文件可以配置容灾任务生产集群的备份文件存储路径、周期性备份全量备份周期、增量备份周期;灾备集群备份文件存储路径、周期性恢复全量恢复周期、增量恢复周期;根据容灾配置文件拉起容灾任务。 生产集群备份任务拉起: 容灾主要通过Gaussdb A内核工具SyncDataToStby.py拉起; 命令:python $GPHOME/script/SyncDataToStby.py -t backup --config-file /data/config/backupRestore.ini灾备集群恢复任务拉起: 命令:python $GPHOME/script/SyncDataToStby.py -t restore --config-file /data/config/backupRestore.ini备升主场景: 生产集群故障,灾备集群升主。 命令:python $GPHOME/script/SyncDataToStby.py -t restore --config-file /data/config/backupRestore.ini –switchover-config /data/config/backupRestore_switch.ini 备集群备升主过程,通知主集群做最后一次增量备份,追平数据,等待备集群恢复完成所有数据,主备切换才会成功。云上环境,主备切换成功后自动以新的主备关系拉起容灾。原文链接:https://bbs.huaweicloud.com/blogs/238797【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
LVS(Linux Virtual Server)作为中国最早出现的自由软件项目之一,在Linux内核中实现了基于IP的四层数据请求负载均衡调度方案。相比Nginx等七层负载均衡方案,LVS处理流程更少,效率更高,更适合大型企业集群使用,目前LVS已经成为Linux官方标准内核模块的一部分。LVS工作过程如下所示,客户端连接LVS,发送请求,LVS通过下发请求给不同的服务器,实现负载均衡。LVS又称LVS Director,因此根据上图实例不同,在LVS中,包含以下术语:CIP(Client IP)、DIP(Director IP)、RIP(Real Server IP)。根据内部的实现原理,LVS包含多种模式:NAT模式、DR模式、TUN模式。NAT模式通过通过修改客户端入站目的地址为RIP将数据包传输至服务器,出站时LVS Director修改数据包地址为CIP将数据包传输至客户端。DR模式通过修改入站数据包的目的MAC地址,将数据包传输至服务器,出站时不经过LVS,数据包由服务器直接返回给客户端。TUN模式即隧道模式,指不修改数据包内容,而是为数据包封装包头(IP头)的方式转发数据,出入站路径和DR模式相同。修改数据包的方法,主要是基于内核netfilter框架和iptables机制实现的。netfilter框架可以理解为内核处理数据包时,在IP层预留的几个数据快照点,如下图绿色节点所示。每一个快照点对应数据包在IP层的一个处理阶段,在数据包经过这些点时,可以通过注册HOOK函数对数据包进行操作。也可以通过iptables工具对数据包的行为进行自定义(丢弃、继续传输等)。数据一定是经由上层传输的,例如通过http、TCP、UDP协议等下发至下层,TCP协议需要建立连接,netfitler实现TCP建连时有两种场景和方案:实现客户端到服务器的透明传输(包含建连),通俗点讲,就是客户端的目的IP地址实际上还是RIP,但是LVS可以代替服务器做应答,并转发数据给服务器,该场景下TCP建连可以视作客户端直接到服务器的一次三次握手。这种场景显然不能达到负载均衡的目的,而是较为适合长时延端到端传输。实现客户端请求向不同服务器转发,建连需要经历两个阶段:一是客户端和LVS建连、LVS再和服务器建连,可以理解为两个三次握手。显然这种场景可以实现LVS的负载均衡目的,但是建连过程变的复杂。为解决建连复杂问题,目前LVS在客户端连接请求发起之前,就和服务器建立很多空连接(仅三次握手),对于数据库集群服务器,此时无法收到startuppackets报文,就会不断打印日志:[BACKEND] WARNING: could not receive data from client, remote nodename linux*****, detail:none.[BACKEND] LOG: incomplete startup packet上述日志中,incomplete startup packet表明现象,could not receive data from client表明该现象的具体原因为没有收到数据。从PG官方论坛的讨论中,该日志是无害的。如果我们理解LVS和Gaussdb相关原理,就可以避免疑惑,少走弯路。原文链接:https://bbs.huaweicloud.com/blogs/238621【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
【摘要】 GaussDB(DWS)数仓产品内部使用对象标识符(oid)来保存对象之间的引用关系,这使得视图在定义时就绑定了其依赖的基表的oid。如果要删除字段或整个表,就需要连同其关联的视图一起使用cascade关键字删除,表修改完成后再重建各级视图,这就给用户的使用增加了很大的工作量。为了解决这一问题,GaussDB(DWS) 在8.1.0版本实现了视图的解耦,而8.1.1版本在此基础上又实现了自动刷新。1. 背景简介 GaussDB(DWS)数仓产品内部使用对象标识符(oid)来保存对象之间的引用关系,这使得视图在定义的时候就绑定了其依赖的数据库对象的oid,而不管其名称怎么改变,都不会改变这层依赖关系。如果要对基表进行一些字段修改,会因为与视图字段存在强绑定而报错,如果要删除某个表字段或整个表,就需要连同其关联的视图一起使用cascade关键字删除,表字段删除完成或表重建后再顺序重建各级视图,这就给用户的使用增加了很大的工作量,相对于某些市场主流数仓产品存在明显的易用性差异。为了解决这一问题,GaussDB(DWS) 在8.1.0版本实现了视图的解耦,使得存在视图依赖的基表或其他数据库对象(视图、同义词、函数、表字段)可以单独删除,而其上关联的依赖视图依然存在,而在基表重建后,可以通过ALTER VIEW view_name REBUILD命令重建依赖关系。而8.1.1版本在此基础上又实现了自动重建,可以无感知自动重建依赖关系。2. 场景介绍 如上图所示,以drop table table_1为例,支持其单独解耦删除,在重建该表后,对其上关联的视图view_1做一次ALTER VIEW view_1 REBUILD操作,可以自动将其上所有的视图重建依赖关系,其重建顺序为:view_1 -> view_2 -> view_3 -> view_4 -> view_5 -> view_6 -> view_7,或者为:view_1 -> view_4 -> view_5 -> view_7 -> view_2 -> view_3 -> view_6,对于存在多重依赖的view_6,不会重复重建。即使各级视图可能归属不同的用户所有,也会由于重建视图所具有的较高权限保证其顺利执行。完成该操作后各级视图可以正常查询,对同样依赖于table_1的其他路径的视图,也需要做同样的操作。而在即将发布的GaussDB(DWS) 8.1.1版本,在table_1重建后,查询任意节点的视图,都可以自动刷新由其通往该表路径上的所有视图,从而得到正确的结果。3. 使用方法 为了查询视图的依赖关系,在8.1.0版本上实现了两个系统视图:GS_VIEW_DEPENDENCY和GS_VIEW_INVALID,前者可以查询当前用户可见的所有视图的依赖关系,其实现机制参考本部门博文:递归查询视图依赖。后者用来查询当前用户可见的所有的不可用视图。其效果如下:dws=# SELECT * FROM GS_VIEW_DEPENDENCY order by 1; objname | refobjname | path ---------+------------+--------------------------------------- view_1 | table_1 | table_1 view_1 | table_2 | table_2 view_2 | view_1 | table_1 -> view_1 view_2 | view_1 | table_2 -> view_1 view_3 | view_2 | table_2 -> view_1 -> view_2 view_3 | view_2 | table_1 -> view_1 -> view_2 view_4 | view_1 | table_1 -> view_1 view_4 | view_1 | table_2 -> view_1 view_5 | view_4 | table_1 -> view_1 -> view_4 view_5 | view_4 | table_2 -> view_1 -> view_4 view_6 | view_3 | table_2 -> view_1 -> view_2 -> view_3 view_6 | view_5 | table_2 -> view_1 -> view_4 -> view_5 view_6 | view_5 | table_1 -> view_1 -> view_4 -> view_5 view_6 | view_3 | table_1 -> view_1 -> view_2 -> view_3 view_7 | view_5 | table_1 -> view_1 -> view_4 -> view_5 view_7 | view_5 | table_2 -> view_1 -> view_4 -> view_5(16 rows)如图1所示对table_1做删除操作,其关联的所有视图都变为不可用,8.1.1版本通过查询GS_VIEW_INVALID视图可以查看其定义,便于查找失效原因。dws=# DROP TABLE table_1;DROP TABLEdws=# SELECT * FROM GS_VIEW_INVALID order by 1; objid | objname | def -------+---------+------------------------------------------------------------------------------------------- 16463 | view_1 | Invalid view: VIEW "public"."view_1" + | | AS SELECT * FROM public.table_1, public.table_2; 16467 | view_2 | Invalid view: VIEW "public"."view_2" + | | AS SELECT * FROM public.view_1; 16471 | view_3 | Invalid view: VIEW "public"."view_3" + | | AS SELECT * FROM public.view_2; 16475 | view_4 | Invalid view: VIEW "public"."view_4" + | | AS SELECT * FROM public.view_1; 16479 | view_5 | Invalid view: VIEW "public"."view_5" + | | AS SELECT * FROM public.view_4; 16483 | view_6 | Invalid view: VIEW "public"."view_6" + | | ("col1","col2") AS SELECT a.a AS col1, b.b AS col2 FROM public.view_5 a, public.view_3 b; 16487 | view_7 | Invalid view: VIEW "public"."view_7" + | | AS SELECT * FROM public.view_5;(7 rows)3.1 自动与手动重建 重建table_1,尽量保证其包含视图所引用的全部字段,名称必须匹配,数据类型可做符合一定约束的修改,之后查询任意视图,可以正常出结果。如果要使其他视图在查询前也恢复可用,可使用REBUILD命令在合适位置(因为view_1已经可用,这里是view_4最合适)执行,将其他视图恢复为可用。 字段数据类型修改的约束主要为仅可做大类范围内的适当转换(如数值之间,字符串之间,时间之间等),跨类型转换如integer转varchar会因为内部强制转换而产生存储格式不匹配的风险。dws=# create table table_1(a int, b int);NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default.HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.CREATE TABLEdws=# select * from view_5; a | b | c | d ---+---+---+---(0 rows)dws=# SELECT * FROM GS_VIEW_INVALID ORDER BY 1; objid | objname | def -------+---------+------------------------------------------------------------------------------------------- 16483 | view_4 | Invalid view: VIEW "public"."view_4" + | | AS SELECT * FROM public.view_1; 16487 | view_5 | Invalid view: VIEW "public"."view_5" + | | AS SELECT * FROM public.view_4; 16491 | view_6 | Invalid view: VIEW "public"."view_6" + | | ("col1","col2") AS SELECT a.a AS col1, b.b AS col2 FROM public.view_5 a, public.view_3 b; 16495 | view_7 | Invalid view: VIEW "public"."view_7" + | | AS SELECT * FROM public.view_5;(4 rows)dws=# ALTER VIEW view_4 REBUILD;ALTER VIEWdws=# SELECT * FROM GS_VIEW_INVALID ORDER BY 1; objid | objname | def -------+---------+-----(0 rows)3.2 导入导出 在使用gs_dump进行数据库导出操作时,如果存在不可用视图,会给出提示,并在导出文件中以注释的形式保存不可用视图的定义,便于恢复基表时提取视图定义并重建。./gs_dump -p 30001 dws -f ../dump1.sql gs_dump[port='30001'][dws][2021-01-20 11:22:31]: The total objects number is 368. gs_dump[port='30001'][dws][2021-01-20 11:22:31]: NOTICE: VIEW "public.view_1" is invalid and will be dumped as comment gs_dump[port='30001'][dws][2021-01-20 11:22:31]: NOTICE: VIEW "public.view_2" is invalid and will be dumped as comment gs_dump[port='30001'][dws][2021-01-20 11:22:31]: NOTICE: VIEW "public.view_3" is invalid and will be dumped as comment gs_dump[port='30001'][dws][2021-01-20 11:22:31]: NOTICE: VIEW "public.view_4" is invalid and will be dumped as comment gs_dump[port='30001'][dws][2021-01-20 11:22:31]: NOTICE: VIEW "public.view_5" is invalid and will be dumped as comment gs_dump[port='30001'][dws][2021-01-20 11:22:31]: NOTICE: VIEW "public.view_6" is invalid and will be dumped as comment gs_dump[port='30001'][dws][2021-01-20 11:22:31]: NOTICE: VIEW "public.view_7" is invalid and will be dumped as comment gs_dump[port='30001'][dws][2021-01-20 11:22:31]: [100.00%] 368 objects have been dumped. gs_dump[port='30001'][dws][2021-01-20 11:22:31]: dump database dws successfully gs_dump[port='30001'][dws][2021-01-20 11:22:31]: total time: 427 ms---- Name: view_1; Type: VIEW; Schema: public; Owner: postgresql--/* CREATE VIEW "public"."view_1" AS SELECT * FROM public.table_1, public.table_2; */---- Name: view_2; Type: VIEW; Schema: public; Owner: postgresql--/* CREATE VIEW "public"."view_2" AS SELECT * FROM public.view_1; */---- Name: view_3; Type: VIEW; Schema: public; Owner: postgresql--/* CREATE VIEW "public"."view_3" AS SELECT * FROM public.view_2; */4. 总结 这一功能使用VIEW_INDEPENDENT参数控制行为,在参数打开的情况下,可以单独修改删除任意节点的表、函数或视图,关闭时依然保持视图的强关联模式。 最后,欢迎大家使用该功能,并对其提出各种评测意见和建议。原文链接:https://bbs.huaweicloud.com/blogs/238425【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
【摘要】 在创建行存表的时候,可以将数值类型长度不变的、非null的列连续写在前面,其他的列放置表定义后面。这样,查询行存表数据的时候,前面部分的列数据访问性能是较高的。列顺序对表访问有什么影响?设计一个对比测试,来看看列顺序对于行存表的查询访问性能有什么影响。以最常见的lineitem表为基础,调整列顺序创建多个变种表,然后直接对比select相同列数据的时间。首先,创建原生的lineitem表并导入数据。CREATE TABLE LINEITEM( L_ORDERKEY BIGINT , L_PARTKEY BIGINT , L_SUPPKEY BIGINT , L_LINENUMBER BIGINT , L_QUANTITY DECIMAL(15,2) , L_EXTENDEDPRICE DECIMAL(15,2) , L_DISCOUNT DECIMAL(15,2) , L_TAX DECIMAL(15,2) , L_RETURNFLAG CHAR(1) , L_LINESTATUS CHAR(1) , L_SHIPDATE DATE , L_COMMITDATE DATE , L_RECEIPTDATE DATE , L_SHIPINSTRUCT CHAR(25) , L_SHIPMODE CHAR(10) , L_COMMENT VARCHAR(44)) ;copy LINEITEM from '/data/lineitem_10X.dat' with (delimiter '|', encoding 'utf8');postgres=# select count(*) from lineitem ; count---------- 12002430(1 row)Time: 3095.779 ms调整列顺序创建新表lineitem2, 所有整数类型、时间类型的列连续靠前,所有字符串、decimal类型的列连续靠后放置。 表定义以及导入数据如下create table lineitem2 (L_ORDERKEY BIGINT ,L_PARTKEY BIGINT ,L_SUPPKEY BIGINT ,L_LINENUMBER BIGINT , L_SHIPDATE DATE ,L_COMMITDATE DATE ,L_RECEIPTDATE DATE ,L_QUANTITY DECIMAL(15,2) ,L_EXTENDEDPRICE DECIMAL(15,2) ,L_DISCOUNT DECIMAL(15,2) ,L_TAX DECIMAL(15,2) ,L_RETURNFLAG CHAR(1) ,L_LINESTATUS CHAR(1) ,L_SHIPINSTRUCT CHAR(25) ,L_SHIPMODE CHAR(10) ,L_COMMENT VARCHAR(44) );insert into lineitem2 select L_ORDERKEY, L_PARTKEY, L_SUPPKEY, L_LINENUMBER, L_SHIPDATE, L_COMMITDATE, L_RECEIPTDATE, L_QUANTITY, L_EXTENDEDPRICE, L_DISCOUNT, L_TAX, L_RETURNFLAG, L_LINESTATUS, L_SHIPINSTRUCT, L_SHIPMODE, L_COMMENT from lineitem ;调整列顺序创建新表lineitem3,所有字符串、decimal类型的列连续靠前放置,所有整数类型、时间类型的列连续靠后放置。 表定义以及导入数据如下create table lineitem3(L_QUANTITY DECIMAL(15,2) ,L_EXTENDEDPRICE DECIMAL(15,2) ,L_DISCOUNT DECIMAL(15,2) ,L_TAX DECIMAL(15,2) ,L_RETURNFLAG CHAR(1) ,L_LINESTATUS CHAR(1) ,L_SHIPINSTRUCT CHAR(25) ,L_SHIPMODE CHAR(10) ,L_COMMENT VARCHAR(44),L_ORDERKEY BIGINT ,L_PARTKEY BIGINT ,L_SUPPKEY BIGINT ,L_LINENUMBER BIGINT , L_SHIPDATE DATE ,L_COMMITDATE DATE ,L_RECEIPTDATE DATE );insert into lineitem3 select L_QUANTITY, L_EXTENDEDPRICE, L_DISCOUNT, L_TAX, L_RETURNFLAG, L_LINESTATUS, L_SHIPINSTRUCT, L_SHIPMODE, L_COMMENT, L_ORDERKEY, L_PARTKEY, L_SUPPKEY, L_LINENUMBER, L_SHIPDATE, L_COMMITDATE, L_RECEIPTDATE from lineitem ;对比测试一下SQL语句 select L_ORDERKEY , L_PARTKEY , L_SUPPKEY , L_LINENUMBER , L_SHIPDATE , L_COMMITDATE , L_RECEIPTDATE from 的执行效率。 为了消除输出结果的影响,我们在语句前面加上explain performance。lineitem2表的查询语句以及执行结果如下:explain performance select L_ORDERKEY , L_PARTKEY , L_SUPPKEY , L_LINENUMBER , L_SHIPDATE , L_COMMITDATE , L_RECEIPTDATE from lineitem2;lineitem3表的查询语句以及执行结果如下:explain performance select L_ORDERKEY , L_PARTKEY , L_SUPPKEY , L_LINENUMBER , L_SHIPDATE , L_COMMITDATE , L_RECEIPTDATE from lineitem3;可以看到,列顺序不同,行存表查询访问的效率差别很大。那么,影响行存表查询访问效率的因素有哪些呢? 这得从行存表所支持的数据类型和记录结构说起。数据类型GaussDB(DWS)提供给用户层的数据类型是比较丰富的。一个数据类型主要涉及的属性包括了:类型名称;类型长度;是否为值传递;对齐字节。当然还有其他的属性,可以通过\d pg_type命令来查看的,这里主要关心我们所关注的、与记录结构相关的几个属性。常见的数据类型有布尔类型、字节类型、字符类型、名字、整数类型、字符串类型、OID类型等;这在typname一列可以看到。typlen表示了数据类型的长度信息。列为正值,表示实际数据类型的长度; 列为负数则表示变长类型,可选值有-1和-2.布尔类型和字符类型,它的每一个数值占用1个字节。int2这类short int类的整数,它的每一个数值占用着2个字节。int4类的整数,它的每一人数值占用着4个字节。bigint/int8这种大整数则占用着8字节大小。name类型用来记录对象的名称,使用的是固定的64字节(当然末尾0字符)。-1表示的是变长数据,主要包括了其他定长数据类型和字符串数据类型、超长数据类型。-2表示的是C字符串类型,尾0结束的字符串。typbyval是布尔属性,用于表示这些数据类型进行赋值操作、比较操作的时候,是否可以直接用整数类型的= == != >= <= > <这些操作符;这些类型基本都是整数数据,1/2/4/8这四种字节的整数。对于其他的非值传递数据类型,则必须有相应的比较函数和赋值函数。tpyalign表示数据类型的字节对齐方式。c表示单字节对齐方式;s表示双字节对齐;i表示四字节对齐;d表示8字节对齐。所有的数据类型的对齐方式就这么四种。下面截取了常见的一些数据类型以及它的主要属性。那么这种变长的数据类型在磁盘上应该怎么存储呢?简单来讲,主要有两种存储格式,1字节头,后面是数据部分4字节头,后面是数据部分无论是哪种数据存储格式,头部含有较为重要的信息,包括需要区别字节头长度、是否经过了LZ压缩等信息。记录结构上面介绍了数据类型的基本重要知识。在记录结构中,各个列的排列将会遵守对应的数据类型的要求,包括对齐方式,然后依序放置数据即可。以上面的lineitem2表为例,其结构大体如下:第一个较长是记录的整体结构,第二个图是对user data数据部分的具体表示。在对记录访问的时候,为了加速记录的访问,使用了一个cached offset的信息,它表示了对应列在记录中的偏移位置是不会随着数据的变化而变化的。也正是因为这一点,这个cached offset也仅对表定义中、前面连续的、定长的列是有效的;一旦出现一个变长的数据列,必然会影响后续列访问的偏移位置,后面列的访问强依赖于前面变长数据的实际长度;当然,还有一个特性是会影响cached offset的,那就是null,如果列属性中出现了可为null的约束,那么null 值映射图也是会影响到cache offset的;仅有非null的约束、在所有记录上共有的特征,这才能够利用上cached offset加速特性。总结在创建行存表的时候,可以将数值类型长度不变的、非null的列连续写在前面,其他的列放置表定义后面。这样,查询行存表数据的时候,前面部分的列数据访问性能是较高的。原文链接:https://bbs.huaweicloud.com/blogs/238443【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
【摘要】 介绍HDFS上数据生成,方便SQL ON HADOOP的模测。Sql ON Anywhere之数据篇1 概述 当前用于大数据处理的引擎组件种类繁多,且各自提供了丰富的接口供用户使用。但对传统数据库用户来说,SQL语言依然是最熟悉和方便的一种接口。如果能在一个客户端中使用SQL语句操作不同的大数据组件,将极大提升使用各种大数据组件的效率。GaussDB(DWS)支持SQL on Anywhere,基于GaussDB(DWS)可以操作OBS、Hadoop、Oracle、Spark和other GaussDB(DWS),构筑起统一的大数据计算平台。主要包括基于文件系统(HDFS和OBS,狭义的SQL On Anywhere)和其他异构数据库的交互(ORACLE、SPARK和Other GaussDB)。基于文件系统的访问主要通过Foreign Table或者ELK机制的跨集群访问数据,与其他异构数据库主要通过EC+ODBC的方式访问。SQL on Anywhere相关的介绍分几期介绍,此篇主要介绍基于HADOOP的数据生成、下载和上传,方便读写的模测。目前支持的格式主要是txt、csv、parquet、orc。2 HDFS上数据上传下载(1)安装hdfs客户端source /opt/hadoopclient/bigdata_envkinit hdfsPassword for hdfs@HADOOP.COM:(输入密码)(2)查看数据hdfs dfs -ls /user/hive/warehouse/(3)拷贝HDFS数据hdfs dfs -cp /user/hive/warehouse/mppdb/region /user/hive/warehouse/hdfsdata(4)get数据到本地hdfs dfs -get /user/hive/warehouse/mppdb/region /data1(5)上传数据至HDFShdfs dfs -put /data1/region /user/hive/warehouse/mppdb/region3 TXT/CSV数据生成 TXT/CSV格式可以通过第三方工具或者自己写程序构造,上传至hadoop或者在借助Hive生成,Hive生成类似parquet数据成功,在parquet章节介绍。4 orc格式数据生成4.1借助hdfs外表导出功能生成orc数据(1)创建一张行存表region,并插入数据(2)创建一张同结构的hdfs写外表CREATE SERVER hdfs_server FOREIGN DATA WRAPPER HDFS_FDW OPTIONS (address 'xx, hdfscfgpath 'xx', type 'HDFS') ;CREATE FOREIGN TABLE ft_wo_region( like region)SERVER hdfs_serverOPTIONS( FORMAT 'orc', encoding 'utf8', FOLDERNAME '/user/hive/warehouse/mppdb/regin_orc/')WRITE ONLY;(3)导出orc数据INSERT INTO ft_wo_regin SELECT * FROM region;(4)orc数据存储于HDFS的/user/hive/warehouse/mppdb/regin_orc目录下4.2通过Hive生成orc数据生成步骤参考parquet数据生成。5 parquet格式数据生成5.1生成少量的数据在Hive上创建parquet的表,手动插入数据,生成的数据存储于HDFS(1)创建parquet表drop table pt_region;create table pt region( R_REGIONKEY INT, R_NAME string, R_COMMENT string)stored as parquet;(2)插入数据INSERT INTO pt_region VALUES (1,’gaoxin’,’city’);(3)数据存在于HDFS /user/hive/warehouse/pt_region5.2 利用INSERT SELTCT其它格式表生成大量的数据(1)将text数据put到hive上hdfs dfs –put /mnt/data/customer_address /user/hive/warehouse/(2)hive上创建text表(source /opt/hadoopclient/bigdata_env; kinit hdfs;beeline登录hive)create table txt_customer_address( ca_address_sk int , ca_address_id char(16) , ca_street_number char(10) , ca_street_name varchar(60) , ca_street_type char(15) , ca_suite_number char(10) , ca_city varchar(60) , ca_county varchar(30) , ca_state char(2) , ca_zip char(10) , ca_country varchar(20) , ca_gmt_offset decimal(5,2) , ca_location_type char(20) )row format delimited fields terminated by ',' stored as textfile ;(3)load数据load data inpath '/user/hive/warehouse/customer_address' into table txt_customer_address;(4)创建parquet格式表drop table pt_customer_address;create table pt_customer_address( ca_address_sk int , ca_address_id char(16) , ca_street_number char(10) , ca_street_name varchar(60) , ca_street_type char(15) , ca_suite_number char(10) , ca_city varchar(60) , ca_county varchar(30) , ca_state char(2) , ca_zip char(10) , ca_country varchar(20) , ca_gmt_offset decimal(5,2) , ca_location_type char(20) )stored as parquet;(5)通过insert parquet表 select from text表的方式导入数据insert into pt_customer_address select * from txt_customer_address;(6)在hdfs上查看该parquet格式的表数据hdfs dfs -ls /user/hive/warehouse/pt_customer_address5.3带分区的parquet数据生成(1)hive上创建orc表,并load数据drop table orc_web_site;create table orc_web_site( web_site_sk int , web_site_id char(16) , web_rec_start_date timestamp , web_rec_end_date timestamp , web_name varchar(50) , web_open_date_sk int , web_close_date_sk int , web_class varchar(50) , web_manager varchar(40) , web_mkt_id int , web_mkt_class varchar(50) , web_mkt_desc varchar(100) , web_market_manager varchar(40) , web_company_id int , web_company_name char(50) , web_street_number char(10) , web_street_name varchar(60) , web_street_type char(15) , web_suite_number char(10) , web_city varchar(60) , web_county varchar(30) , web_state char(2) , web_zip char(10) , web_country varchar(20) , web_gmt_offset decimal(5,2) , web_tax_percentage decimal(5,2) )stored as orc;load data inpath '/user/hive/warehouse/hdfs/public.orc_web_site' into table orc_web_site;(2)创建parquet分区表,web_rec_start_date列为分区表(hive上分区列也是也是表的一列,不能在create table()中重复创建)drop table pt_web_site;create table pt_web_site( web_site_sk int , web_site_id char(16) , web_rec_end_date timestamp , web_name varchar(50) , web_open_date_sk int , web_close_date_sk int , web_class varchar(50) , web_manager varchar(40) , web_mkt_id int , web_mkt_class varchar(50) , web_mkt_desc varchar(100) , web_market_manager varchar(40) , web_company_id int , web_company_name char(50) , web_street_number char(10) , web_street_name varchar(60) , web_street_type char(15) , web_suite_number char(10) , web_city varchar(60) , web_county varchar(30) , web_state char(2) , web_zip char(10) , web_country varchar(20) , web_gmt_offset decimal(5,2) , web_tax_percentage decimal(5,2) )PARTITIONED BY(web_rec_start_date timestamp)stored as parquet;(3)静态分区导入方式,适合分区列distinct值少量的,比如该分区列只有2个值1997-08-16 00:00:001999-08-17 00:00:00导入方式如下,insert pt_table PARTITION (web_rec_start_date='1997-08-16 00:00:00') select指定目标列where web_rec_start_date='1997-08-16 00:00:00'INSERT OVERWRITE TABLE pt_web_site PARTITION (web_rec_start_date='1997-08-16 00:00:00') select web_site_sk , web_site_id ,web_rec_end_date,web_name , web_open_date_sk , web_close_date_sk ,web_class,web_manager ,web_mkt_id,web_mkt_class,web_mkt_desc,web_market_manager ,web_company_id ,web_company_name , web_street_number ,web_street_name ,web_street_type ,web_suite_number ,web_city ,web_county ,web_state , web_zip , web_country ,web_gmt_offset ,web_tax_percentage FROM orc_web_site where web_rec_start_date='1997-08-16 00:00:00';INSERT OVERWRITE TABLE pt_web_site PARTITION (web_rec_start_date='1999-08-17 00:00:00') select web_site_sk , web_site_id ,web_rec_end_date,web_name , web_open_date_sk , web_close_date_sk ,web_class,web_manager ,web_mkt_id,web_mkt_class,web_mkt_desc,web_market_manager ,web_company_id ,web_company_name , web_street_number ,web_street_name ,web_street_type ,web_suite_number ,web_city ,web_county ,web_state , web_zip , web_country ,web_gmt_offset ,web_tax_percentage FROM orc_web_site where web_rec_start_date='1999-08-17 00:00:00';(4)通过动态分区方式导入Hive上设置参数:set hive.exec.dynamic.partition.mode=nostrick;否则主分区不允许动态分区INSERT OVERWRITE TABLE pt_web_site PARTITION (web_rec_start_date) select web_site_sk , web_site_id ,web_rec_end_date,web_name , web_open_date_sk , web_close_date_sk ,web_class,web_manager ,web_mkt_id,web_mkt_class,web_mkt_desc,web_market_manager ,web_company_id ,web_company_name , web_street_number ,web_street_name ,web_street_type ,web_suite_number ,web_city ,web_county ,web_state , web_zip , web_country ,web_gmt_offset ,web_tax_percentage,web_rec_start_date FROM orc_web_site ;(5)将hive数据get到本地hdfs dfs -get /user/hive/warehouse/pt_customer_address /mnt/data原文链接:https://bbs.huaweicloud.com/blogs/237984【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
加解密函数 用户可以使用加密函数对表中数据使用指定密钥加密存储为密文 加密 gs_encrypt_aes128(encryptstr,keystr) 描述:以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。keystr的长度范围为1~16字节。支持的加密数据类型:目前数据库支持的数值类型,字符类型,二进制类型中的RAW,日期/时间类型中的DATE、TIMESTAMP、SMALLDATETIME。 返回值类型:text 返回值长度:至少为92字节,不超过 4*[(Len+68)/3] 字节,其中Len为加密前数据长度(单位为字节)。示例:postgres=# SELECT gs_encrypt_aes128('MPPDB','1234'); gs_encrypt_aes128-------------------------------------------------------------------------------------gwditQLQG8NhFw4OuoKhhQJoXojhFlYkjeG0aYdSCtLCnIUgkNwvYI04KbuhmcGZp8jWizBdR1vU9CspjuzI0lbz12A=(1 row) 解密 gs_decrypt_aes128(decryptstr,keystr) 描述:以keystr为密钥对decrypt字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。keystr不得为空。 返回值类型:text 示例:postgres=# SELECT gs_decrypt_aes128('gwditQLQG8NhFw4OuoKhhQJoXojhFlYkjeG0aYdSCtLCnIUgkNwvYI04KbuhmcGZp8jWizBdR1vU9CspjuzI0lbz12A=','1234'); gs_decrypt_aes128 ------------------- MPPDB (1 row)用户可将表中一列都进行加密,在使用时再进行解密。原文链接:https://bbs.huaweicloud.com/blogs/237983【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签