华为云用户手册

  • default_storage_nodegroup 参数说明:设置当前的默认建表所在的Node Group,目前只适用普通表。 参数类型:USERSET 取值范围:字符串 installation,表示默认建表在安装的Node Group上。 random_node_group,表示默认建表在随机选择的NodeGroup上,该配置8.1.2及以上版本支持,仅用于测试环境。 roach_group,表示默认建表在所有节点上,该值为roach工具预留,不能用于其他场景。 取值为其他字符串,表示默认建表在设置的Node Group上。 默认值:installation
  • 应用示例 查询当前视图,统计OBS读流量和平均读带宽,统计结果按10分钟聚集。 1 2 3 4 5 select * from gs_obs_read_traffic; nodename | hostname | traffic_mb | bandwidth_mb_per_s | reqcount | logtime ----------+------------------+------------------+--------------------+----------+------------------------ dn_1 | rhel_10_90_45_56 | 101.959338188171 | 5.14830159670447 | 23 | 2022-11-26 09:50:00+08 (1 row)
  • GS_BLOCKLIST_QUERY GS_BLOCKLIST_QUERY系统表存储作业黑名单信息和异常信息,该表以unique_sql_id作为唯一索引,进行作业异常信息统计和黑名单记录,可通过与GS_WLM_SESSION_INFO进行关联获取作业的query字段和执行信息。 GaussDB(DWS)同时提供了GS_BLOCKLIST_QUERY视图用于查询作业黑名单和异常信息,该视图可直接显示query字段信息,不过因为该视图与GS_WLM_SESSION_INFO为依赖关系,因此在GS_WLM_SESSION_INFO表较大的情况下,查询可能需要消耗较长的时间。 表1 GS_BLOCKLIST_QUERY字段 名字 类型 引用 描述 unique_sql_id bigint - 基于查询解析树生成的查询唯一ID。 block_list boolean - 查询作业是否属于黑名单。 except_num integer - 查询作业异常次数。 except_time timestamp - 查询作业最近一次异常时间。 此系统表的schema为dbms_om。 此系统表包含唯一索引,使用哈希分布方式分布在DN上,分布列为unique_sql_id。 此系统表仅限在gaussdb数据库中查询,其它数据库中查询会直接报错。 GS_BLOCKLIST_QUERY视图存储在pg_catalog下。 通常对于DML语句,在计算Unique SQL ID的过程中会忽略常量值。但对于DDL、DCL以及设置参数等语句,常量值不可以忽略。因此一个unique_sql_id可能会对应一个或多个查询。 父主题: 系统表
  • 处理数据导入错误 根据获取的错误信息,请对照下表,处理数据导入错误。 表2 处理数据导入错误 错误信息 原因 解决办法 missing data for column "r_reason_desc" 数据源文件中的列数比外表定义的列数少。 对于TEXT格式的数据源文件,由于转义字符(\)导致delimiter(分隔符)错位或者quote(引号字符)错位造成的错误。 示例:目标表存在3列字段,导入的数据如下所示。由于存在转义字符“\”,分隔符“|”被转义为第二个字段的字段值,导致第三个字段值缺失。 BE|Belgium\|1 由于列数少导致的报错,选择下列办法解决: 在数据源文件中,增加列“r_reason_desc”的字段值。 在创建外表时,将参数“fill_missing_fields”设置为“on”。即当导入过程中,若数据源文件中一行数据的最后一个字段缺失,则把最后一个字段的值设置为NULL,不报错。 对由于转义字符导致的错误,需检查报错的行中是否含有转义字符(\)。若存在,建议在创建外表时,将参数“noescaping”(是否不对'\'和后面的字符进行转义)设置为true。 extra data after last expected column 数据源文件中的列数比外表定义的列数多。 在数据源文件中,删除多余的字段值。 在创建外表时,将参数“ignore_extra_data”设置为“on”。即在导入过程中,若数据源文件比外表定义的列数多,则忽略行尾多出来的列。 invalid input syntax for type numeric: "a" 数据类型错误。 在数据源文件中,修改输入字段的数据类型。根据此错误信息,请将输入的数据类型修改为numeric。 null value in column "staff_id" violates not-null constraint 非空约束。 在数据源文件中,增加非空字段信息。根据此错误信息,请增加“staff_id”列的值。 duplicate key value violates unique constraint "reg_id_pk" 唯一约束。 删除数据源文件中重复的行。 通过设置关键字“DISTINCT”,从SELECT结果集中删除重复的行,保证导入的每一行都是唯一的。 1 INSERT INTO reasons SELECT DISTINCT * FROM foreign_tpcds_reasons; value too long for type character varying(16) 字段值长度超过限制。 在数据源文件中,修改字段值长度。根据此错误信息,字段值长度限制为VARCHAR2(16)。
  • 应用示例 在容灾集群上查看备表回放状态: 1 2 3 4 5 SELECT * FROM pg_fine_dr_info; relid | lastcsn | lastxmin | lastxmax | laststarttime | lastendtime -------+---------+----------+----------+-------------------------------+------------------------------- 21132 | 1251610 | 1251609 | 1251611 | 2023-01-04 20:51:58.375136+08 | 2023-01-04 20:51:58.393986+08 (1 row)
  • PG_RLSPOLICY PG_RLSPOLICY系统表存储行级访问控制策略的信息。 表1 PG_RLSPOLICY字段 名称 类型 描述 polname name 行访问控制策略名称。 polrelid oid 行访问控制策略的表OID。 polcmd char 行访问控制策略影响的SQL操作,包括:*(ALL)、r(SELECT)、w(UPDATE)、d(DELETE)。 polpermissive boolean 行访问控制策略的类型。 说明: polpermissive的取值: true表示PERMISSIVE,表示行访问控制策略是宽容性策略。 false表示RESTRICTIVE,表示行访问控制策略是限制性策略。 polroles oid[] 行访问控制策略影响的数据库用户OID。 polqual pg_node_tree 行访问控制策略的SQL条件表达式。 父主题: 系统表
  • PG_TIMEZONE_NAMES PG_TIMEZONE_NAMES视图提供了显示了所有能够被SET TIMEZONE识别的时区名及其缩写、UTC偏移量、是否夏时制。 表1 PG_TIMEZONE_NAMES字段 名称 类型 描述 name text 时区名。 abbrev text 时区名缩写。 utc_offset interval 相对于UTC的偏移量。 is_dst boolean 如果当前正处于夏令时范围则为TRUE,否则为FALSE。 父主题: 系统视图
  • 创建用户 CREATE USER语句用于创建新的GaussDB(DWS)用户。创建新用户后,可以使用该用户连接数据库。 创建普通用户u1,并设置用户拥有CREATEDB属性。 1 CREATE USER u1 WITH CREATEDB PASSWORD '{Password}'; 创建系统管理员mydbadmin,需指定参数SYSADMIN 。 1 CREATE USER mydbadmin sysadmin PASSWORD '{Password}'; 通过视图PG_USER查看已创建的用户。 1 SELECT * FROM pg_user; 要查看用户属性,请查询系统表PG_AUTHID。 1 SELECT * FROM pg_authid;
  • 锁定用户 ALTER USER语句中ACCOUNT LOCK | ACCOUNT UNLOCK参数用于锁定或者解锁用户,被锁定的用户不允许登录。若管理员发现某帐户被盗、非法访问等异常情况,可手动锁定该帐户;当管理员认为帐户恢复正常后,可手动解锁该帐户。 示例: 锁定用户u1: 1 ALTER USER u1 ACCOUNT LOCK; 解锁用户u1: 1 ALTER USER u1 ACCOUNT UNLOCK;
  • 删除用户 DROP USER语句用于删除一个或多个GaussDB(DWS)用户。当确认帐户不再使用,管理员可以删除用户帐户。用户删除后不可恢复。 同时删除多个用户时,用","隔开。 成功删除用户后,该用户的所有权限也会被一同删除。 当删除的用户正处于活动状态时,此会话状态不会立马断开,用户在会话状态断开后才会被完全删除。 DROP USER语句指定CASCADE时,可级联删除依赖用户的表等对象。即删除owner是该用户的对象,并清理掉其他对象对该用户的授权信息。 示例: 删除用户u1: 1 DROP USER u1; 级联删除帐户u2: 1 DROP USER u2 CASCADE;
  • 数据文件 假设有数据文件product_info.txt,示例数据如下所示: 100,XHDK-A-1293-#fJ3,2017-09-01,A,2017 Autumn New Shirt Women,red,M,328,2017-09-04,715,good 205,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 nice 150,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 exquisite 200,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 buy 450,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 odor 260,OCDA-G-2817-#bD3,2017-09-12,B,2017 autumn new woolen coat women,red,L,2004,2017-09-15,826,Very favorite clothes 980,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 small 98,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 effective 200,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 wear 300,HWEC-L-2531-#xP8,2017-09-23,A,2017 autumn new shoes women,brown,M,403,2017-09-26,607,good 100,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 good 110,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 good
  • PG_STAT_XACT_USER_TABLES PG_STAT_XACT_USER_TABLES视图显示命名空间中用户表的事务状态信息。 表1 PG_STAT_XACT_USER_TABLES字段 名称 类型 描述 relid oid 表的OID。 schemaname name 此表的模式名。 relname name 表名。 seq_scan bigint 在该表上启动的顺序扫描数。 seq_tup_read bigint 顺序扫描抓取的活跃行数。 idx_scan bigint 在该表上启动的索引扫描数。 idx_tup_fetch bigint 索引扫描抓取的活跃行数。 n_tup_ins bigint 插入行数。 n_tup_upd bigint 更新行数。 n_tup_del bigint 删除行数。 n_tup_hot_upd bigint 热更新行数(即不需要单独的索引更新)。 父主题: 系统视图
  • 参数 表1 SQLAllocHandle参数 关键字 参数说明 HandleType 由SQLAllocHandle分配的句柄类型。必须为下列值之一: SQL_HANDLE_ENV(环境句柄) SQL_HANDLE_DBC(连接句柄) SQL_HANDLE_STMT(语句句柄) SQL_HANDLE_DESC(描述句柄) 申请句柄顺序为,先申请环境句柄,再申请连接句柄,最后申请语句句柄,后申请的句柄都要依赖它前面申请的句柄。 InputHandle 将要分配的新句柄的类型。 如果HandleType为SQL_HANDLE_ENV,则这个值为SQL_NULL_HANDLE。 如果HandleType为SQL_HANDLE_DBC,则这一定是一个环境句柄。 如果HandleType为SQL_HANDLE_STMT或SQL_HANDLE_DESC,则它一定是一个连接句柄。 OutputHandlePtr 输出参数:一个缓冲区的指针,此缓冲区以新分配的数据结构存放返回的句柄。
  • 注意事项 当分配的句柄并非环境句柄时,如果SQLAllocHandle返回的值为SQL_ERROR,则它会将OutputHandlePtr的值设置为SQL_NULL_HDBC、SQL_NULL_HSTMT或SQL_NULL_HDESC。之后,通过调用带有适当参数的SQLGetDiagRec,其中HandleType和Handle被设置为IntputHandle的值,可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。
  • GS_ALL_CONTROL_GROUP_INFO GS_ALL_CONTROL_GROUP_INFO视图显示数据库内所有的控制组信息。 表1 GS_ALL_CONTROL_GROUP_INFO字段 名称 类型 描述 name text 控制组的名称。 type text 控制组的类型。 gid bigint 控制组ID。 classgid bigint Workload所属Class的控制组ID。 class text Class控制组。 workload text Workload控制组。 shares bigint 控制组分配的CPU资源配额。 limits bigint 控制组分配的CPU资源限额。 wdlevel bigint Workload控制组层级。 cpucores text 控制组使用的CPU核的信息。 父主题: 系统视图
  • 获取源数据的OBS路径并设置读取权限 登录OBS管理控制台。 单击“服务列表”,选择“对象存储服务”,打开OBS管理控制台页面。 获取数据源文件的OBS路径。 数据源文件在上传到OBS桶之后,会生成全局唯一的访问路径。在创建外表时需要指定数据源文件的OBS路径。 如何查看OBS路径,请参见《对象存储服务控制台指南》的通过对象URL访问对象章节。 例如,在本例中,查看到数据文件的OBS路径分别为: https://obs.cn-north-1.myhuaweicloud.com/mybucket/demo.db/product_info_orc/product_info.0 https://obs.cn-north-1.myhuaweicloud.com/mybucket/demo.db/product_info_orc/product_info.1 为用户设置OBS桶的读取权限。 在使用SQL on OBS功能时,执行该功能的用户需要取得数据源文件所在OBS桶的读取权限。通过配置桶的ACL权限,可以将读取权限授予指定的用户帐号。 具体请参见《对象存储服务控制台指南》中的配置桶ACL章节。
  • 操作场景 使用SQL on OBS功能查询OBS数据之前: 已将ORC数据存储在OBS上。 例如,在使用Hive或Spark等组件时创建了ORC表,其表数据已经存储在OBS上的场景。 假设有2个ORC数据文件“product_info.0”和“product_info.1”,其原始数据如原始数据所示,都已经存储在OBS桶“mybucket”的“demo.db/product_info_orc/”目录中。 如果数据文件已经在OBS上了,请执行获取源数据的OBS路径并设置读取权限中的步骤。 本小节以导入ORC格式为例,PARQUET、CARBONDATA、JSON数据的导入方法与ORC格式相似。 该方式同样也支持导入TEXT、CSV格式文件,但由于该方式不支持错误表,因此推荐使用从OBS导入CSV、TEXT数据(方式一)的导入方式。
  • DBA_TAB_COLUMNS DBA_TAB_COLUMNS视图存储关于表和视图的字段的信息。数据库里每个表的每个字段都在DBA_TAB_COLUMNS里有一行。需要有系统管理员权限才可以访问。 名称 类型 描述 owner character varying(64) 表或视图的所有者。 table_name character varying(64) 表名或视图名。 column_name character varying(64) 列名。 data_type character varying(128) 列的数据类型。 column_id integer 创建表或视图时列的序号。 data_length integer 列的字节长度。 comments text 注释。 avg_col_len numeric 列的平均长度(单位字节)。 nullable bpchar 该列是否允许为空,对于主键约束和非空约束,该值为n。 data_precision integer 数据类型的精度,对于numeric数据类型有效,其他类型为NULL。 data_scale integer 小数点右边的位数,对于numeric数据类型有效,其他类型为0。 char_length numeric 列的长度(以字符计),只对varchar,nvarchar2, bpchar,char类型有效。 schema character varying(64) 包含该表或视图的命名空间。 kind text 当前记录所属的种类,如果此列属于表,则此字段显示为table;如果此列属于视图,则此字段显示为view。 父主题: 系统视图
  • 创建外表 当完成创建外部服务器后,在GaussDB(DWS)数据库中创建一个OBS/HDFS只写外表,用来访问存储在OBS/HDFS上的数据。此外表是只写的,只能用于导出操作。 创建外表的语法格式如下,详细的描述请参见CREATE FOREIGN TABLE (SQL on OBS or Hadoop)章节。 1 2 3 4 5 6 7 8 9 10 11 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 ' } [, ...] ) [ {WRITE ONLY }] DISTRIBUTE BY {ROUNDROBIN | REPLICATION} [ PARTITION BY ( column_name ) [ AUTOMAPPED ] ] ; 例如,创建一个名为"product_info_ext_obs"的外表,对语法中的参数按如下描述进行设置: table_name 外表的表名。 表字段定义 column_name:外表中的字段名。 type_name:字段的数据类型。 多个字段用“,”隔开。 SERVER dfs_server 外表的外部服务器名称,这个server必须存在。外表通过设置外部服务器连接OBS/HDFS读取数据。 此处应填写为参照创建外部服务器创建的外部服务器名称。 OPTIONS参数 用于指定外表数据的各类参数,关键参数如下所示。 “format”:表示导出的数据文件格式,支持“orc”格式。 “foldername”:必选参数。外表中数据源文件目录。OBS:数据源文件的OBS路径,此处仅需要填写“/桶名/文件夹目录层级/”。HDFS:HDFS文件系统上的路径。此选项对WRITE ONLY外表为必选项。 “encoding”:外表中数据源文件的编码格式名称,缺省为utf8。 “filesize” 指定WRITE ONLY外表的文件大小,单位为MB。此选项为可选项,不指定该选项默认分布式文件系统配置中文件大小的配置值。此语法仅对WRITE ONLY的外表有效。 取值范围:[1, 1024]的整数。 filesize参数只对ORC格式的WRITE ONLY的HDFS外表有效。 “compression” 指定ORC格式文件的压缩方式,此选项为可选项。 取值范围:zlib,snappy,lz4。缺省值为snappy。 “version” 指定ORC格式的版本号,此选项为可选项。此语法仅对WRITE ONLY的外表有效。 取值范围:目前仅支持0.12。缺省值为0.12。 “dataencoding” 在数据库编码与数据表的数据编码不一致时,该参数用于指定导出数据表的数据编码。比如数据库编码为Latin-1,而导出的数据表中的数据为UTF-8编码。此选项为可选项,如果不指定该选项,默认采用数据库编码。此语法仅对HDFS的WRITE ONLY外表有效。 取值范围:该数据库编码支持转换的数据编码。 dataencoding参数只对ORC格式的WRITE ONLY的HDFS外表有效。 语法中的其他参数 其他参数均为可选参数,用户可以根据自己的需求进行设置,在本例中不需要设置。 根据以上信息,创建外表命令如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 DROP FOREIGN TABLE IF EXISTS product_info_ext_obs; ---建立不包含分区列的OBS外表,表关联的外部服务器为obs_server,表对应的OBS服务上的文件格式为‘orc’,OBS上的数据存储路径为'/mybucket/data/'。 CREATE FOREIGN TABLE product_info_ext_obs ( product_price integer , product_id char(30) , 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 obs_server OPTIONS ( format 'orc', foldername '/mybucket/demo.db/product_info_orc/', compression 'snappy', version '0.12' ) Write Only; 父主题: 导出ORC数据到OBS(方式二)
  • 多表并发导出操作步骤 通过创建的两个外表,将数据库中的两个表分别导出至OBS的桶中。 用户通过管理控制台登录到OBS数据服务器。在OBS数据服务器上,分别创建数据文件存放的两个桶“/input-data1”“/input-data2”,并创建每个桶下面的data目录“/input-data1/data”“/input-data2/data”。 在GaussDB(DWS)数据库上,创建外表tpcds.customer_address_ext1和tpcds.customer_address_ext2分别用于OBS服务器接收导出的数据。 规划OBS与集群处于同一区域,需要导出的表为已存在的表tpcds.customer_address和tpcds.customer_demographics。 其中设置的导出信息如下所示: 由于OBS服务器上的数据源文件存放目录为“/input-data1/data/ ”和/input-data2/data/ ,所以设置tpcds.customer_address_ext1参数“location”为“obs://input-data1/data/ ”,设置tpcds.customer_address_ext2参数“location”为“ obs://input-data2/data/”。 设置的数据格式信息是根据表从GaussDB(DWS)中导出时需要的详细数据格式参数信息指定的,参数设置如下所示: 数据源文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 是否使用加密(encrypt),默认为“off”。 用户获取OBS访问协议对应的AK值(access_key )。(必选) 用户获取OBS访问协议对应的SK值(secret_access_key)。(必选) 用户在创建用户是已经获取了access_key和secret_access_key的密钥,请根据实际密钥替换示例中的内容。 根据以上信息,创建的外表如下所示: 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 CREATE FOREIGN TABLE tpcds.customer_address_ext1 ( ca_address_sk integer , 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) ) SERVER gsmpp_server OPTIONS(LOCATION 'obs://input-data1/data/', FORMAT 'CSV', ENCODING 'utf8', DELIMITER E'\x08', ENCRYPT 'off', ACCESS_KEY 'access_key_value_to_be_replaced', SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced' )Write Only; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 CREATE FOREIGN TABLE tpcds.customer_address_ext2 ( ca_address_sk integer , ca_address_id char(16) , ca_address_name varchar(20) , ca_address_code integer , 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) ) SERVER gsmpp_server OPTIONS(LOCATION 'obs://input_data2/data/', FORMAT 'CSV', ENCODING 'utf8', DELIMITER E'\x08', QUOTE E'\x1b', ENCRYPT 'off', ACCESS_KEY 'access_key_value_to_be_replaced', SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced' )Write Only; 在GaussDB(DWS)数据库上,将数据表 tpcds.customer_address和 tpcds.warehouse并发导出到外表tpcds.customer_address_ext1和tpcds.customer_address_ext2中。 1 INSERT INTO tpcds.customer_address_ext1 SELECT * FROM tpcds.customer_address; 1 INSERT INTO tpcds.customer_address_ext2 SELECT * FROM tpcds.warehouse;
  • 单表导出操作步骤 通过创建外表,将数据库中的单表导出至OBS的两个桶中。 用户通过管理控制台登录到OBS数据服务器。在OBS数据服务器上,分别创建数据文件存放的两个桶“/input-data1”“/input-data2”,并创建每个桶下面的data目录“/input-data1/data”“/input-data2/data”。 在GaussDB(DWS)数据库上,创建外表tpcds.customer_address_ext1和tpcds.customer_address_ext2用于OBS数据服务器接收数据库导出数据。 OBS与集群处于同一区域,需要导出的表为GaussDB(DWS)示例表tpcds.customer_address。 其中设置的导出信息如下所示: 由于OBS数据服务器上的数据源文件存放目录为“/input-data1/data/ ”和/input-data2/data/ ,所以设置tpcds.customer_address_ext1参数“location”为“obs://input-data1/data/ ”,设置tpcds.customer_address_ext2参数“location”为“ obs://input-data2/data/”。 设置的数据格式信息是根据表从数据库导出时需要的详细数据格式参数信息指定的,参数设置如下所示: 数据源文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 是否使用加密(encrypt),默认为“off”。 用户获取OBS访问协议对应的AK值(access_key )。(必选) 用户获取OBS访问协议对应的SK值(secret_access_key)。(必选) 用户在创建用户时已经获取了access_key和secret_access_key的密钥,请根据实际密钥替换示例中的内容。 根据以上信息,创建的外表如下所示: 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 CREATE FOREIGN TABLE tpcds.customer_address_ext1 ( ca_address_sk integer , 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) ) SERVER gsmpp_server OPTIONS(LOCATION 'obs://input-data1/data/', FORMAT 'CSV', ENCODING 'utf8', DELIMITER E'\x08', ENCRYPT 'off', ACCESS_KEY 'access_key_value_to_be_replaced', SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced' )Write Only; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 CREATE FOREIGN TABLE tpcds.customer_address_ext2 ( ca_address_sk integer , 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) ) SERVER gsmpp_server OPTIONS(LOCATION 'obs://input-data2/data/', FORMAT 'CSV', ENCODING 'utf8', DELIMITER E'\x08', ENCRYPT 'off', ACCESS_KEY 'access_key_value_to_be_replaced', SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced' )Write Only; 在GaussDB(DWS)数据库上,将数据表tpcds.customer_address并发导出到外表tpcds.customer_address_ext1和tpcds.customer_address_ext2中。 1 INSERT INTO tpcds.customer_address_ext1 SELECT * FROM tpcds.customer_address; 1 INSERT INTO tpcds.customer_address_ext2 SELECT * FROM tpcds.customer_address; OBS外表在设计上禁止往非空的路径下导出文件,但是在并发场景下会出现同一路径导出文件的情况,此时会发生异常。 异常场景:假如用户使用同一张表的数据并发导出到同一个OBS的外表,在一条SQL语句执行在OBS服务器上没有生成文件时,另一条SQL语句也执行导出,最终执行结果为两条SQL语句均执行成功,产生数据覆盖现象,建议用户在执行OBS外表导出任务时,不要往同一OBS外表并发导出。
  • 应用示例 查看所有发布: 1 2 3 4 5 SELECT * FROM pg_publication; pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate ---------+----------+--------------+-----------+-----------+-----------+------------- mypub | 10 | t | t | t | t | t (1 row)
  • 背景信息 在执行数据导入前,您可以参考以下优秀实践方法进行合理的设计部署,最大化的使用系统资源,以提高数据导入性能。 OBS的数据导入性能,多数场景受限于网络的并发访问速率,因此在OBS服务器上最好部署多个桶,使用多桶并发导入,提高DN数据传输利用率。 并发导入场景,与单表导入相似,至少应保证I/O性能大于网络最大速率。 配置GUC参数“raise_errors_if_no_files”、“partition_mem_batch”和“partition_max_cache_size”,设置导入时是否区分“导入文件记录数为空”和“导入文件不存在”、导入时的缓存个数以及数据缓存区大小。 若导入表存在索引,在数据导入过程中,将增量更新索引信息,影响数据导入性能。建议在执行数据导入前,先删除相关表的索引。在数据导入完成后,再重新创建索引。
  • 示例 创建一个名为product_info的表,示例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 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); 执行以下命令将外表product_info_ext的数据导入到目标表product_info中: 1 INSERT INTO product_info SELECT * FROM product_info_ext;
  • 操作步骤 在GaussDB(DWS)数据库中,创建目标表,用于存储从OBS导入的数据。建表语法请参考CREATE TABLE。 目标表的表结构和OBS上将要导入的数据源文件的字段要保持一一对应,即字段个数、字段类型要一致。并且,目标表和创建的外表的表结构也要保持一致,字段名称可以不一样。 (可选)若导入表存在索引,在数据导入过程中,将增量更新索引信息,影响数据导入性能。建议在执行数据导入前,先删除相关表的索引。在数据导入完成后,再重新创建索引。 执行数据导入。 1 INSERT INTO [目标表名] SELECT * FROM [foreign table 表名]; 若出现以下类似信息,说明数据导入成功。请查询错误信息表,查看是否存在数据格式错误,详细操作请参见处理错误表。 INSERT 0 20 若出现数据加载错误,请参见处理错误表,并重新执行数据导入。
  • 空间索引 GaussDB(DWS)数据库的PostGIS Extension支持GIST (Generalized Search Tree) 空间索引(分区表除外)。相比于B-tree索引,GIST索引适应于任意类型的非常规数据结构,可有效提高几何和地理数据信息的检索效率。 使用如下命令创建GIST索引: 1 CREATE INDEX indexname ON tablename USING GIST ( geometryfield );
  • PG_STATIO_ALL_SEQUENCES PG_STATIO_ALL_SEQUENCES视图显示当前数据库中相关的序列信息以及指定序列的I/O的统计信息。 表1 PG_STATIO_ALL_SEQUENCES字段 名称 类型 描述 relid oid 序列OID。 schemaname name 序列中模式名。 relname name 序列名。 blks_read bigint 从序列中读取的磁盘块数。 blks_hit bigint 序列缓冲区命中数量。 父主题: 系统视图
  • 示例2 客户端内存占用过多解决 此示例主要使用setFetchSize来调整客户端内存使用,它的原理是通过数据库游标来分批获取服务器端数据,但它会加大网络交互,可能会损失部分性能。 由于游标事务内有效,故需要先关闭自动提交。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // 关闭掉自动提交 conn.setAutoCommit(false); Statement st = conn.createStatement(); // 打开游标,每次获取50行数据 st.setFetchSize(50); ResultSet rs = st.executeQuery("SELECT * FROM mytable"); while (rs.next()) { System.out.print("a row was returned."); } rs.close(); // 关闭服务器游标。 st.setFetchSize(0); rs = st.executeQuery("SELECT * FROM mytable"); while (rs.next()) { System.out.print("many rows were returned."); } rs.close(); // Close the statement. st.close();
  • 操作步骤 假设远端集群的待同步表名称是tbl_remote,用于数据同步的用户是user_remote,该用户须对表tbl_remote有访问权限;假设本地集群的待同步表名称是tbl_local。 创建server。 CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS( address '192.168.178.207:8109', dbname 'db_remote', username 'user_remote', password 'xxxxxxxx', syncsrv 'gsfs://192.168.178.129:8789|gsfs://192.168.178.129:8790' ); server_remote为server名称,供互联互通外表使用。 address为远端集群CN的IP地址和端口,仅允许填写一个地址。 dbname为远端集群的数据库名。 username为连接远端集群使用的用户名,注意该用户不能为系统管理员。 password为连接远端集群使用的用户名的密码。 syncsrv为GDS Server的IP地址和端口,如果有多个地址使用|分割,与GDS外表的location类似。 GaussDB(DWS)会对syncsrv所设置的GDS地址进行网络连接测试: 只能判断本地执行集群与GDS的网络情况,无法判断远端集群与GDS的网络情况,需要注意报错提示。 在移除不可用GDS后,从中选择不会导致业务hang的、数目适当的GDS进行数据同步。 创建互联互通外表。 CREATE FOREIGN TABLE ft_tbl( col_1 type_name, col_2 type_name, … ) SERVER server_remote OPTIONS ( schema_name 'schema_remote', table_name 'tbl_remote', encoding 'utf8' ); schema_name为远端集群表所属schema,如果该option缺省,则schema_name预设为该外表所在的schema。 table_name为远端集群表名,如果该option缺省,则table_name预设为该外表的表名。 encoding为远端集群的编码,如果该option缺省,则编码使用本地集群数据库的默认编码。 选项schema_name、table_name大小写敏感,必须与远端schema、table的名字大小写保持一致。 互联互通外表的列不允许带任何约束。 互联互通外表的列名、列类型必须与远端集群的表tbl_remote的列名和列类型完全一致。 SERVER须设置为步骤1中新建的server,必须包含syncsrv属性。 使用互联互通外表进行数据同步。 本地集群是目标集群时,发起数据同步业务: 全列全量数据同步: 1 INSERT INTO tbl_local SELECT * FROM ft_tbl; 全列过滤条件数据同步: 1 INSERT INTO tbl_local SELECT * FROM ft_tbl WHERE col_2 = XX; 部分列全量数据同步: 1 INSERT INTO tbl_local (col_1) SELECT col_1 FROM ft_tbl; 部分列过滤条件数据同步: 1 INSERT INTO tbl_local (col_1) SELECT col_1 FROM ft_tbl WHERE col_2 = XX; 本地集群是源集群时,发起数据同步业务: 单表数据同步: 1 INSERT INTO ft_tbl SELECT * FROM tbl_local; join结果集数据同步: 1 INSERT INTO ft_tbl SELECT * FROM tbl_local1 join tbl_local2 ON XXX; 如遇到报错连接失败,请检查server的信息确认两个集群是否已经相互连通。 如遇到报错GDS连接失败,请检查syncsrv指定的GDS Server是否都已经启动,且与两个集群所有节点可以网络连通。 如遇到报错表不存在,请检查外表的option信息是否正确。 如遇到报错列不存在,请检查外表的列名是否与源表一致。 如遇到报错列重复定义,请检查是否相应列名超长,若超长建议使用AS别名精简。 如遇到报错无法解析列类型,请检查语句中是否有列上表达式。 如遇到报错列信息不匹配,请检查外表的列信息是否与远端集群对应表的列信息是否一致。 如遇到报错语法不支持,请检查是否使用了Join、distinct、排序等复杂用法。 如遇到乱码,请检查两端数据库的实际编码是否一致。 当本地集群是源集群时,存在极小的概率出现数据成功同步到远端集群,但是本地集群返回执行失败的情况,针对这种情况建议校验同步数据记录数。 当本地集群是源集群时,通过事务块、子事务等控制的数据同步,需要总事务提交后才能查询到数据同步结果。 删除互联互通外表。 DROP FOREIGN TABLE ft_tbl;
  • 使用场景 将数据从一个集群同步到另外一个集群,支持全量数据同步、过滤条件数据同步。 目前互联互通仅支持以下使用方式,除以下语句外,其他类型的语法均不支持。 INSERT INTO 内表 SELECT ... FROM 互联互通外表1 [WHERE]; INSERT INTO 互联互通表 SELECT * FROM 内表1 [JOIN 内表2 | WHERE]; SELECT ... FROM 互联互通表;
共100000条