云服务器内容精选

  • API导入失败是什么原因? 可能原因1:单次导入的API数量超出上限。当前单次最高能导入300个API,如超出此数量,请分批导入,或提交配额修改工单,调整API单次导入上限。 可能原因2:参数错误,需要检查和修正。建议先在API网关控制台界面创建一个API,将其导出作为API文件的模板。 可能原因3:YAML文件格式问题,需要检查和修正。 可能原因4:本地proxy网络限制,更换网络环境。 可能原因5:定义API请求中,不允许在Header定义“X-Auth-Token”字段。 父主题: API导入导出
  • 通过外表导入远端DWS数据 参见7在E CS 上连接第二套集群,其中连接地址改为第二套集群的地址,本例为192.168.0.86。 创建普通用户jim,并赋予创建外表和server的权限。FOREIGN DATA WRAPPER固定为gc_fdw。 1 2 3 CREATE USER jim WITH PASSWORD 'password'; ALTER USER jim USEFT; GRANT ALL ON FOREIGN DATA WRAPPER gc_fdw TO jim; 切换到jim用户,创建server。 1 2 3 4 5 6 7 SET ROLE jim PASSWORD 'password'; CREATE SERVER server_remote FOREIGN DATA WRAPPER gc_fdw OPTIONS (address '192.168.0.8:8000,192.168.0.158:8000' , dbname 'gaussdb', username 'leo', password 'password' ); address:第一套集群的两个内网IP和端口,参见6获取,本例为192.168.0.8:8000,192.168.0.158:8000。 dbname:连接的第一套集群的数据库名,本例为gaussdb。 username:连接的第一套集群的用户名,本例为leo。 password:用户名密码。 创建外表。 外表的字段和约束,必须与待访问表的字段和约束保持一致。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 CREATE FOREIGN TABLE region ( 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 server_remote OPTIONS ( schema_name 'leo', table_name 'product_info', encoding 'utf8' ); SERVER:上一步创建的server的名称,本例为server_remote。 schema_name:待访问的第一套集群的schema名称,本例为leo。 table_name:待访问的第一套集群的表名,参见10获取,本例为product_info。 encoding:保持与第一套集群的数据库编码一致,参见9获取,本例为utf8。 查看创建的server和外表。 1 2 \des+ server_remote \d+ region 创建本地表。 表的字段和约束,必须与待访问表的字段和约束保持一致。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CREATE TABLE local_region ( 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); 通过外表导入数据到本地表。 1 2 INSERT INTO local_region SELECT * FROM region; SELECT * FROM local_region; 您也可以直接查询外表而无需将数据导入。 1 SELECT * FROM region;
  • 使用GDS导入数据源 使用root账户登录ECS,使用文件传输工具将7下载好的工具包上传到/opt目录下。 在/opt目录下解压工具包。 cd /opt unzip dws_client_8.1.x_redhat_x64.zip 创建GDS用户,并修改数据源目录和GDS目录的属主。 groupadd gdsgrp useradd -g gdsgrp gds_user chown -R gds_user:gdsgrp /opt/gds chown -R gds_user:gdsgrp /input_data 切换到gds_user用户。 su - gds_user 导入GDS环境变量。 仅8.1.x及以上版本需要执行,低版本请跳过。 cd /opt/gds/bin source gds_env 启动GDS。 /opt/gds/bin/gds -d /input_data/ -p 192.168.0.90:5000 -H 192.168.0.0/24 -l /opt/gds/gds_log.txt -D -d dir:保存有待导入数据的数据文件所在目录。本教程中为“/input_data/”。 -p ip:port:GDS监听IP和监听端口。配置为GDS所在的ECS的内网IP,可与DWS通讯,本例为192.168.0.90:5000。 -H address_string:允许哪些主机连接和使用GDS服务。参数需为CIDR格式。本例设置为DWS的内网IP所在的网段即可。 -l log_file:存放GDS的日志文件路径及文件名。本教程为“/opt/gds/gds_log.txt”。 -D:后台运行GDS。 使用gsql连接第一套DWS集群。 执行exit切换root用户,进入ECS的/opt目录,导入gsql的环境变量。 exit cd /opt source gsql_env.sh 进入/opt/bin目录,使用gsql连接第一套DWS集群。 cd /opt/bin gsql -d gaussdb -h 192.168.0.8 -p 8000 -U dbadmin -W password -r -d: 连接的数据库名,本例为默认数据库gaussdb。 -h:连接的DWS内网IP,即6查询到的内网IP,本例为192.168.0.8。 -p:DWS端口,固定为8000。 -U:数据库管理员用户,默认为dbadmin。 -W:管理员用户的密码,为3创建集群时设置的密码,本例password为用户创建集群设置的密码。 创建普通用户leo,并赋予创建外表的权限。 1 2 CREATE USER leo WITH PASSWORD 'password'; ALTER USER leo USEFT; 切换到leo用户,创建GDS外表。 以下LOCATION参数请填写为6的GDS的监听IP和端口,后面加上/*,例如:gsfs://192.168.0.90:5000/* 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 28 29 SET ROLE leo PASSWORD 'password'; 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 'gsfs://192.168.0.90:5000/*', FORMAT 'CSV' , DELIMITER ',', ENCODING 'utf8', HEADER 'false', FILL_MISSING_FIELDS 'true', IGNORE_EXTRA_DATA 'true' ) READ ONLY LOG INTO product_info_err PER NODE REJECT LIMIT 'unlimited'; 创建本地表。 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); 从GDS外表导入数据并查询,数据导入成功。 1 2 INSERT INTO product_info SELECT * FROM product_info_ext ; SELECT count(*) FROM product_info;
  • 准备源数据 在本地PC指定目录下,创建以下3个.csv格式的文件,数据样例如下。 数据文件“product_info0.csv” 1 2 3 4 5 100,XHDK-A,2017-09-01,A,2017 Shirt Women,red,M,328,2017-09-04,715,good! 205,KDKE-B,2017-09-01,A,2017 T-shirt Women,pink,L,584,2017-09-05,40,very good! 300,JODL-X,2017-09-01,A,2017 T-shirt men,red,XL,15,2017-09-03,502,Bad. 310,QQPX-R,2017-09-02,B,2017 jacket women,red,L,411,2017-09-05,436,It's nice. 150,ABEF-C,2017-09-03,B,2017 Jeans Women,blue,M,123,2017-09-06,120,good. 数据文件“product_info1.csv” 1 2 3 4 5 200,BCQP-E,2017-09-04,B,2017 casual pants men,black,L,997,2017-09-10,301,good quality. 250,EABE-D,2017-09-10,A,2017 dress women,black,S,841,2017-09-15,299,This dress fits well. 108,CDXK-F,2017-09-11,A,2017 dress women,red,M,85,2017-09-14,22,It's really amazing to buy. 450,MMCE-H,2017-09-11,A,2017 jacket women,white,M,114,2017-09-14,22,very good. 260,OCDA-G,2017-09-12,B,2017 woolen coat women,red,L,2004,2017-09-15,826,Very comfortable. 数据文件“product_info2.csv” 1 2 3 4 5 6 7 8 9 10 980,"ZKDS-J",2017-09-13,"B","2017 Women's Cotton Clothing","red","M",112,,, 98,"FKQB-I",2017-09-15,"B","2017 new shoes men","red","M",4345,2017-09-18,5473 50,"DMQY-K",2017-09-21,"A","2017 pants men","red","37",28,2017-09-25,58,"good","good","good" 80,"GKLW-l",2017-09-22,"A","2017 Jeans Men","red","39",58,2017-09-25,72,"Very comfortable." 30,"HWEC-L",2017-09-23,"A","2017 shoes women","red","M",403,2017-09-26,607,"good!" 40,"IQPD-M",2017-09-24,"B","2017 new pants Women","red","M",35,2017-09-27,52,"very good." 50,"LPEC-N",2017-09-25,"B","2017 dress Women","red","M",29,2017-09-28,47,"not good at all." 60,"NQAB-O",2017-09-26,"B","2017 jacket women","red","S",69,2017-09-29,70,"It's beautiful." 70,"HWNB-P",2017-09-27,"B","2017 jacket women","red","L",30,2017-09-30,55,"I like it so much" 80,"JKHU-Q",2017-09-29,"C","2017 T-shirt","red","M",90,2017-10-02,82,"very good." 使用root账户登录已创建好的ECS,执行以下命令创建数据源文件目录。 mkdir -p /input_data 使用文件传输工具,将以上数据文档上传到ECS的/input_data目录下。
  • 导入到已有分组注意事项 将API定义导入到一个已有的分组,导入过程中不会删除分组中已有的API,只是将新增的API导入分组。 适用于将一个新的API或者一个修改后的API导入到已有的分组。 导入API前,请注意以下事项: API网关中API的配额满足需求。 导入的API定义与已有的API定义冲突时,您可以选择使用导入的API定义覆盖已有的API定义,或者保留已有的API定义,此时导入的API定义会显示导入失败。 如果选择扩展覆盖,当导入API的扩展定义项名称与已有策略(ACL,流量控制等)名称相同时,则会覆盖已有策略(ACL,流量控制等)。 导入的API不会自动发布到环境,导入时可以选择“立即发布”或者“稍后发布”,您可以自行选择策略。
  • 导入到新分组注意事项 将API定义导入到一个新的分组,导入过程中系统会自动创建一个新的API分组,并将导入的API归属到该分组。 适用于将一份全新且完整的API导入到API网关。 导入API前,请注意以下事项: API网关中API分组和API的配额满足需求。 使用Swagger info或OpenAPI info的title作为API分组名称,新创建的API分组名称不能与已有的API分组名称重名。 导入的API定义中,如果存在冲突,那么根据系统导入的先后顺序,先导入的API会显示导入成功,后导入的API会显示导入失败。例如导入的API定义中存在2个名称相同或请求路径相同的API,那么先导入的API会显示导入成功,后导入的会显示导入失败。 如果选择扩展覆盖,当导入API的扩展定义项名称与已有策略(ACL,流量控制等)名称相同时,则会覆盖已有策略(ACL,流量控制等)。 导入的API不会自动发布到环境,导入时可以选择“立即发布”或者“稍后发布”,您可以自行选择策略。
  • 字符集 PG里面的字符集支持各种字符集存储文本,包括单字节字符集,比如ISO 8859系列,以及多字节字符集,比如EUC(扩展Unix编码Extended Unix Code)、UTF-8和Mule内部编码。MPPDB中目前主要使用的字符集包括GBK、UTF-8和LATIN1。所有被支持的字符集都可以被客户端透明地使用,但少数只能在服务器上使用(即作为一种服务器端编码,GBK编码在PG中只是客户端编码,不是服务端编码,MPPDB将GBK引入到服务端编码,这是很多问题的根源)。默认的字符集是在使用initdb初始化PG数据库时选择的。在创建一个数据库实例时可以重载字符集,因此可能会有多个数据库实例并且每一个使用不同的字符集。一个重要的限制是每个数据库的字符集必须和数据库LC_CTYPE(字符分类)和LC_COLLATE (字符串排序顺序)设置兼容。对于C或POSIX,任何字符集都是允许的,但是对于其他区域只有一种字符集可以正确工作。不过,在Windows上UTF-8编码可以和任何区域配合使用。 SQL_ASCII设置与其他设置表现得相当不同。如果服务器字符集是SQL_ASCII,服务器把字节值0-127根据ASCII标准解释,而字节值128-255则当作无法解析的字符。如果设置为SQL_ASCII,就不会有编码转换。因此,这个设置基本不是用来声明所使用的指定编码,因为这个声明会忽略编码。在大多数情况下,如果使用了任何非ASCII数据,那么使用SQL_ASCII设置都是不明智的,因为PG将无法帮助你转换或者校验非ASCII字符。 数据库系统支持某种编码,主要涉及三个方面:数据库服务器支持,数据访问接口支持以及客户端工具支持。 数据库服务器字符编码 数据库服务器支持某种编码,是指数据库服务器能够从客户端接收、存储以及向客户端提供该种编码的字符(包括标识符、字符型字段值),并能将该种编码的字符转换到其它编码(如UTF-8编码转到GBK编码)。 指定数据库服务器编码:创建数据库时指定:CREATE DATABASE … ENCODING … //可以取ASCII、UTF-8、EUC_CN、……; 查看数据库编码:show server_encoding。 数据库访问接口编码 数据库访问接口支持某种编码,是指数据库访问接口要做到能对该种编码的字符进行正确读写,不应出现数据丢失、数据失真等情况。以JDBC接口为例: JDBC接口一般根据JVM的file.encoding设置client_encoding:set client_encoding to file_encoding; 将String转换成client_encoding编码的字节流,传给服务器端:原型String.getBytes(client_encoding) ; 收到服务器的字节流后,使用client_encoding构造String对象作为getString的返回值给应用程序:原型String(byte[], …, client_encoding)。 客户端编码 客户端工具支持某种编码,是指客户端工具能够显示从数据库读取该种编码的字符,也能通过本工具将该种编码的字符提交到服务器端。 指定会话的客户端编码:SET CLIENT_ENCODING TO 'value'; 查看数据库编码:Show client_encoding。
  • 区域支持 区域支持指的是应用遵守文化偏好的问题,包括字母表、排序、数字格式等。区域是在使用initdb创建一个数据库时自动被初始化的。默认情况下,initdb将会按照它的执行环境的区域设置初始化数据库,即系统已经设置好的区域。如果想要使用其他的区域,可以使用手工指定(initdb –locale=xx)。 如果想要将几种区域的规则混合起来,可以使用以下区域子类来控制本地化规则的某些方面。这些类名转换成initdb的选项名来覆盖某个特定分类的区域选择。 表1 区域支持 字段 描述 LC_COLLATE 字符串排序顺序。 LC_CTYPE 字符分类(什么是一个字符?它的大写形式是否等效?) LC_MESSAGES 消息使用的语言Language of messages。 LC_MONETARY 货币数量使用的格式。 LC_NUMERIC 数字的格式。 LC_TIME 日期和时间的格式。
  • 兼容性说明 支持OpenAPI规范。 OpenAPI规范(OAS),是定义一个标准的、与具体编程语言无关的RESTful API的规范。OpenAPI规范的前身是Swagger规范,API网关目前支持两种OpenAPI规范:Swagger 2.0或OpenAPI 3.0。为了方便区分,下文中OAS表示OpenAPI规范(包含Swagger 2.0或OpenAPI 3.0),Swagger表示Swagger 2.0规范,OpenAPI表示OpenAPI 3.0规范。 API网关导入或导出的OAS对象,与API网关对象定义的映射关系。 请求参数类型与API网关参数类型差异。 API请求路径模板语法差异。 导入API时支持的API网关扩展字段。 表1 OAS对象与API网关对象定义的映射关系 Swagger对象 OpenAPI对象 (以3.0.0为例) API网关对象 导入时行为 导出时行为 info.title info.title API分组名称 导入到新的分组:新的分组名称 导入到已有分组:未使用 支持汉字、英文、数字、下划线,且只能以英文或汉字开头,3 ~ 64字符 填充为分组名称 info.description info.description API分组描述 导入到新的分组:新的分组描述 导入到已有分组:未使用 填充为分组描述信息 info.version info.version 版本 未使用 用户指定 未指定则使用当前时间 host server.url API分组 域名 未使用 优先使用API分组的第一个自定义域名 如果分组未绑定自定义域名则使用分组的独立域名 basePath - - 将与每条API的请求路径拼接起来使用 未填充 paths.path paths.path API请求路径 与basePath拼接起来作为API请求路径 填充为API请求路径 operation.operationId operation.operationId API名称 作为API名称 填充为API名称 operation.description operation.description API描述 作为API描述 填充为API描述 operation.parameters operation.parameters API前端请求参数 作为API请求参数 填充为API请求参数 operation.schemes - API前端请求协议 作为API请求协议 填充为API请求协议 operation.responses operation.responses - 未使用 固定填充default响应定义 operation.security operation.security API认证方式 API认证方式 结合x-apigateway-auth-type 填充为API认证方式 结合x-apigateway-auth-type 表2 请求参数类型和API网关参数类型差异 OAS类型Swagger类型 API网关类型 支持的参数属性字段 integer long float double number maximum minimum default enum required description string string maxLength minLength default enum required description 其它类型 不支持 不支持 表3 API请求路径模板语法差异 语法 OAS类型Swagger类型 API网关 /users/{userName} 支持 支持 /users/prefix-{userName} /users/{userName}-suffix /users/prefix-{userName} -suffix 支持 前端请求定义不支持 后端请求定义支持 /users/{proxy+} 不支持 前端请求定义支持 后端请求定义不支持
  • 限制说明 API网关参数限制,如下所示。 API网关暂不支持formData和body位置的请求参数定义。 API网关暂不支持consumes和produces定义。 API网关中,header位置的参数名称,不区分大小写。 后端策略限制,如下所示。 默认后端类型为HTTP,策略后端支持HTTP、HTTP-VPC 默认后端类型为HTTP-VPC,策略后端支持HTTP、HTTP-VPC 默认后端类型为function,策略后端支持function 默认后端类型为mock,策略后端支持mock
  • 手动导入 通过主页面的“更多功能”选项或单击左上角搜索框旁边的,可以展示当前支持的导入选项,可根据需要选择。 导入文件 选择响应格式的文件并上传,然后选择文件中系统识别出来的接口和数据模型导入。 一个文件导入后,将会视为一个根目录,一个根目录中不允许存在URL相同的接口。 Postman支持Collections和Environment数据集ZIP包的全量导入,也支持单个Collection文件导入。 Postman支持接口和接口用例的前置脚本及后置脚本导入。 导入URL 选择“导入Swagger URL”,输入URL,即可完成文档导入。 通过Swagger URL导入时,需要填写json数据文件的URL,而非Swagger UI的URL。
  • 使用INSERT多行插入 在导入时,如果不能使用COPY命令,可以根据情况使用多行插入。多行插入是通过批量进行一系列插入而提高性能。 下面的示例使用一条INSERT语句向一个三列表插入三行。这仍属于少量插入,只是用来说明多行插入的语法。 向表customer_t1中插入多行数据: 1 2 3 4 INSERT INTO customer_t1 VALUES (6885, 'maps', 'Joes'), (4321, 'tpcds', 'Lily'), (9527, 'world', 'James'); 有关更多详情和示例,请参考INSERT章节。
  • 使用GDS导入数据 数据倾斜会造成查询表性能下降。对于记录数超过千万条的表,建议在执行全量数据导入前,先导入部分数据,以进行数据倾斜检查和调整分布列,避免导入大量数据后发现数据倾斜而造成调整成本高。详细请参见查看数据倾斜状态章节。 为了优化导入速度,建议拆分文件,使用多GDS进行并行导入。单个导入任务可以拆分成多个导入任务并发执行导入;多个导入任务使用同一GDS时,可以使用-t参数打开GDS多线程并发执行导入。GDS建议挂载在不同物理盘以及不同网卡上,避免物理IO以及网络可能出现的瓶颈。 在GDS IO与网卡未达到物理瓶颈前,可以考虑在 GaussDB (DWS)开启SMP进行加速。SMP开启之后会对对应的GDS产生成倍的压力。需要特别说明的是:SMP自适应衡量的标准是GaussDB(DWS)的CPU压力,而不是GDS所承受的压力。有关SMP的更多信息请参见SMP手动调优建议章节。 GDS与GaussDB(DWS)通信要求物理网络畅通,并且尽量使用万兆网。千兆网无法承载高速的数据传输压力,极易出现断连。即使用千兆网时GaussDB(DWS)无法提供通信保障。满足万兆网的同时,数据磁盘组I/O性能大于GDS单核处理能力上限(约400MB/s)时,方可寻求单文件导入速率最大化。 并发导入场景与单表导入相似,至少应保证I/O性能大于网络最大速率。 GDS跟DN的数据比例建议在1:3至1:6之间。 为了优化列存分区表的批量插入效率,在批量插入过程中会对数据进行缓存后再批量写盘。通过GUC参数“partition_mem_batch”和“partition_max_cache_size”,可以设置缓存个数以及缓存区大小。这两个参数的值越小,列存分区表的批量插入越慢。当然,越大的缓存个数和缓存分区,会带来越多的内存消耗。
  • 使用gsql元命令导入数据 \copy命令在任何gsql客户端登录数据库成功后可以执行导入数据。与COPY命令相比较,\copy命令不是读取或写入数据库服务端的文件,而是直接读取或写入本地文件。 \copy命令不如SQL COPY命令有效,因为所有的数据必须通过客户端/服务器的连接来传递。对于大量的数据来说SQL命令可能会更好。 有关如何使用\copy命令的更多信息,请参阅使用gsql元命令\COPY导入数据 。 \COPY只适合小批量、格式良好的数据导入,容错能力较差。导入数据应优先选择GDS或COPY。
  • 从OBS并行导入数据 将导入数据拆分为多个文件 导入大数据量的数据时,通常需要较长的时间及耗费较多的计算资源。 从OBS上导入数据时,如下方法可以提升导入性能:将数据文件存储到OBS前,尽可能均匀地将文件切分成多个,文件的数量为DN的整数倍更适合。 在导入前后验证数据文件 从OBS导入数据时,首先将您的文件上传到OBS存储桶中,建议您列出存储桶的内容,然后验证该存储桶是否包含所有正确的文件并且仅包含这些文件。 在完成导入操作后,请使用SELECT查询语句验证所需文件是否已导入。 OBS导入导出数据时,不支持中文路径。