华为云用户手册

  • 注意事项 GDS支持并发导入导出,gds -t参数用于设置GDS的工作线程池大小,控制并发场景下同时工作的工作线程数且不会加速单个SQL任务。gds -t缺省值为8,上限值为200。在使用管道功能进行导入导出时,-t参数应不低于业务并发数。如果是双集群互联互通场景,-t参数应不低于业务并发数的两倍。 由于管道“读取即删除”的特点,需确保导入或导出过程中除GDS程序外无其他程序读取管道文件,避免导入过程中数据丢失或者任务报错及导出的文件内容混乱。 不支持对具有相同Location的外表并发导入导出,即GDS的多个线程同时读取管道文件或者同时写入管道文件。 GDS的单个导入导出任务只识别一个管道文件,因此不要对GDS外表设置带有通配符({}[]?)的Location地址。如: 1 CREATE FOREIGN TABLE foreign_test_pipe_tr( like test_pipe ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.1:7789/foreign_test_*', FORMAT 'text', DELIMITER ',', NULL '', EOL '0x0a' ,file_type 'pipe',auto_create_pipe 'false');
  • 多线程导出 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90,导出的数据文件格式为 CS V,同时导出2个目标表,所以规划使用Remote模式进行多线程导出。 Remote模式多线程导出数据操作示例如下所示: 以root用户登录GDS数据服务器,创建导出数据文件存放目录“/output_data”,数据库用户及所属的用户组。 1 2 3 mkdir -p /output_data groupadd gdsgrp useradd -g gdsgrp gds_user 修改数据服务器上数据文件目录“/output_data”的属主为gds_user。 1 chown -R gds_user:gdsgrp /output_data 以gds_user用户登录数据服务器上启动GDS。 其中GDS安装路径为“/opt/bin/dws/gds”,导出数据文件存放在“/output_data/”目录下,数据服务器所在IP为192.168.0.90,GDS监听端口为5000,以后台方式运行,设定并发度为2。 1 /opt/bin/dws/gds/bin/gds -d /output_data -p 192.168.0.90:5000 -H 10.10.0.1/24 -D -t 2 在 GaussDB (DWS)上,创建外表foreign_tpcds_reasons1和foreign_tpcds_reasons2用于接收数据服务器上的数据。 其中设置的导出模式信息如下所示: 由于启动GDS时,设置的导出数据文件存放目录为“/output_data/”,GDS监听端口为5000。创建的导出数据文件存放目录为“/output_data/”。所以设置参数“location”为“gsfs://192.168.0.90:5000/”。 设置导出的数据文件格式信息如下所示: 数据文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 引号字符(quote)为E'\x1b'。 数据文件中空值(null)为没有引号的空字符串。 逃逸字符(escape)默认和quote相同。 数据文件是否包含标题行(header)为默认值false,即导出时数据文件第一行被识别为数据。 根据以上信息,创建的外表foreign_tpcds_reasons1如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CREATE FOREIGN TABLE foreign_tpcds_reasons1 ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS ( LOCATION 'gsfs://192.168.0.90:5000/', FORMAT 'CSV', ENCODING 'utf8', DELIMITER E'\x08', QUOTE E'\x1b', NULL '' ) WRITE ONLY; 参考以上设置,创建的外表foreign_tpcds_reasons2如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE FOREIGN TABLE foreign_tpcds_reasons2 ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS ( LOCATION 'gsfs://192.168.0.90:5000/', FORMAT 'CSV', DELIMITER E'\x08', QUOTE E'\x1b', NULL '' ) WRITE ONLY; 在数据库中通过外表foreign_tpcds_reasons1和foreign_tpcds_reasons2,将表reasons1和reasons2中的数据导出到目录“/output_data”中: 1 INSERT INTO foreign_tpcds_reasons1 SELECT * FROM tpcds.reason; 1 INSERT INTO foreign_tpcds_reasons2 SELECT * FROM tpcds.reason; 待数据导出完成后,以gds_user用户登录数据服务器,停止GDS。 其中GDS进程号为128954。 1 2 3 4 ps -ef|grep gds gds_user 128954 1 0 15:03 ? 00:00:00 gds -d /output_data -p 192.168.0.90:5000 -D -t 2 gds_user 129003 118723 0 15:04 pts/0 00:00:00 grep gds kill -9 128954
  • Remote模式导出 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90,导出数据文件格式为CSV,所以规划的并行导出模式为Remote模式。 Remote模式并行导出数据操作示例如下所示: 以root用户登录GDS数据服务器,创建数据文件存放目录“/output_data”,启动gds_user用户及所属的用户组。 1 mkdir -p /output_data (可选)创建用户及其所属的用户组。此用户用于启动GDS。若该类用户及所属用户组已存在,可跳过此步骤。 1 2 groupadd gdsgrp useradd -g gdsgrp gds_user 修改数据服务器上数据文件目录“/output_data”的属主为gds_user。 1 chown -R gds_user:gdsgrp /output_data 以gds_user用户登录数据服务器上分别启动GDS。 其中GDS安装路径为“/opt/bin/dws/gds”,导出数据文件存放在“/output_data/”目录下,数据服务器所在IP为192.168.0.90,GDS监听端口为5000,以后台方式运行。 1 /opt/bin/dws/gds/bin/gds -d /output_data -p 192.168.0.90:5000 -H 10.10.0.1/24 -D 在数据库中创建外表foreign_tpcds_reasons用于接收数据服务器上的数据。 其中设置的导出模式信息如下所示: 由于启动GDS时,设置的导出数据文件存放目录为“/output_data/”,GDS监听端口为5000。创建的导出数据文件存放目录为“/output_data/”。所以设置参数“location”为“gsfs://192.168.0.90:5000/”。 设置导出的数据文件格式信息如下所示: 数据文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 引号字符(quote)为E'\x1b'。 数据文件中空值(null)为没有引号的空字符串。 逃逸字符(escape)默认和quote相同。 数据文件是否包含标题行(header)为默认值false,即导出时数据文件第一行被识别为数据。 根据以上信息,创建的外表如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CREATE FOREIGN TABLE foreign_tpcds_reasons ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS ( LOCATION 'gsfs://192.168.0.90:5000/', FORMAT 'CSV', ENCODING 'utf8', DELIMITER E'\x08', QUOTE E'\x1b', NULL '' ) WRITE ONLY; 在数据库上,通过外表foreign_tpcds_reasons,将数据导出到数据文件中。 1 INSERT INTO foreign_tpcds_reasons SELECT * FROM tpcds.reason; 待数据导出完成后,以gds_user用户登录数据服务器,停止GDS。 其中GDS进程号为128954。 1 2 3 4 ps -ef|grep gds gds_user 128954 1 0 15:03 ? 00:00:00 gds -d /output_data -p 192.168.0.90:5000 -D gds_user 129003 118723 0 15:04 pts/0 00:00:00 grep gds kill -9 128954
  • 操作步骤 以gds_user用户登录安装GDS的数据服务器。 请根据启动GDS的方式,选择停止GDS的方式。 若用户使用“gds”命令启动GDS,请使用以下方式停止GDS。 执行如下命令,查询GDS进程号。 ps -ef|grep gds 示例:其中GDS进程号为128954。 ps -ef|grep gds gds_user 128954 1 0 15:03 ? 00:00:00 gds -d /input_data/ -p 192.168.0.90:5000 -l /log/gds_log.txt -D gds_user 129003 118723 0 15:04 pts/0 00:00:00 grep gds 使用“kill”命令,停止GDS。其中128954为上一步骤中查询出的GDS进程号。 kill -9 128954 若用户使用“gds_ctl.py”命令启动GDS,请使用以下命令停止GDS。 cd /opt/bin/dws/gds/bin python3 gds_ctl.py stop
  • 导出操作语法 执行数据导出语法: 1 INSERT INTO [foreign table 表名] SELECT * FROM [源表名]; 编写批处理任务脚本,实现并发批量导出数据。并发量视机器资源使用情况而定。可通过几个表测试,监控资源利用率,根据结果提高或减少并发量。常用资源监控命令有:内存和CPU监控top命令,I/O监控命令iostat,网络监控命令sar等。相关案例请参见多线程导出。
  • 任务示例 示例1:将表reason的数据通过外表foreign_tpcds_reasons导出到数据文件中。 1 INSERT INTO foreign_tpcds_reasons SELECT * FROM tpcds.reason; 示例2:通过条件过滤(r_reason_sk =1),向数据文件中导出部分数据。 1 INSERT INTO foreign_tpcds_reasons SELECT * FROM tpcds.reason WHERE r_reason_sk=1; 示例3:对于特殊的数据类型如RAW类型,在导出之后是一个二进制文本,导入工具无法识别。需使用RAWTOHEX()函数将其转换为16进制文本导出。 1 INSERT INTO foreign_tpcds_reasons SELECT RAWTOHEX(c) FROM tpcds.reason;
  • 操作步骤 根据规划导出数据中规划的路径确定外表参数location的值。 Remote模式 请通过URL方式设置参数“location”,用于指定导出的数据文件存放路径。 不需要指定文件名。 当有多个路径时,若导出数据源数少于路径数时,多余的路径会只生成文件不写入数据。 示例: GDS数据服务器IP为192.168.0.90,假定启动GDS时设置的监听端口为5000,设置的导出后文件存放目录为“/output_data/”。 根据以上情况,在创建外表时,指定参数“location”为“gsfs://192.168.0.90:5000/”。 location可以指定子目录如“gsfs://192.168.0.90:5000/2019/11/”实现同一张表根据日期导出到不同目录下。 现有版本在执行导出任务的时候会判断“/output_data/2019/11”目录是否存在,不存在则创建。导出时会将文件写入此目录下, 这样用户在创建或修改外表后就不需要再去手动执行“mkdir -p /output_data/2019/11”。 梳理待导出数据的格式信息,确定创建外表时使用的数据格式参数的值。 根据前面步骤确定的参数,创建GDS外表。
  • 示例 示例:创建GDS导出外表foreign_tpcds_reasons,待导出数据格式为CSV,用于接收数据服务器上的数据。 其中设置的导出模式信息如下所示: 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90,待导出的数据文件格式为CSV,选择并行导出模式为Remote模式。 假定启动GDS时,规划导出的数据文件存放目录为“/output_data/”,GDS监听端口为5000,所以设置参数“location”为“gsfs://192.168.0.90:5000/”。 设置导出的数据格式信息,参数设置如下所示: 导出数据文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 引号字符(quote)为E'\x1b'。 数据文件中空值(null)为没有引号的空字符串。 逃逸字符(escape)默认和quote相同。 数据文件是否包含标题行(header)为默认值false,即导出时数据文件第一行被识别为数据。 导出数据文件换行符样式(EOL)为0X0A。 创建的外表如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CREATE FOREIGN TABLE foreign_tpcds_reasons ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.90:5000/', FORMAT 'CSV', DELIMITER E'\x08', QUOTE E'\x1b', NULL '', EOL '0x0a' ) WRITE ONLY;
  • 规划导出路径 Remote模式 以root用户登录GDS数据服务器,创建导出的数据文件存放目录“/output_data”。 1 mkdir -p /output_data (可选)创建用户及所属的用户组。此用户为启动GDS的用户,该用户需要拥有导出数据文件存放目录的写权限。 1 2 groupadd gdsgrp useradd -g gdsgrp gdsuser 若出现以下提示,说明数据库用户及所属用户组已存在,可跳过本步骤。 1 2 useradd: Account 'gdsuser' already exists. groupadd: Group 'gdsgrp' already exists. 修改数据文件目录属主为gdsuser。 1 chown -R gdsuser:gdsgrp /output_data
  • 相关概念 数据文件:存储有数据的TEXT、CSV或FIXED文件。文件中保存的是从GaussDB(DWS)数据库导出的数据。 外表:用于规划导出数据文件的数据文件格式、存放位置、编码格式等信息。 GDS:数据服务工具。在导出数据时,需要将此工具部署到数据文件所在的服务器上,使DN可以通过该工具导出数据。 表:数据库中的表,包括行存表和列存表。数据文件中的数据从这些表中导出。 Remote导出模式:将集群中的业务数据导出到集群之外的主机上。
  • 概述 通过外表导出数据:通过GDS外表设置的导出模式、导出数据格式等信息来指定待导出的数据文件,利用多DN并行的方式,将数据从数据库导出到数据文件中,从而提高整体导出性能。不支持直接导出文件到HDFS文件系统。 CN只负责任务的规划及下发,把数据导出的工作交给了DN,释放了CN的资源,使其有能力处理外部请求。 通过让各个DN都参与数据导出,充分利用各个设备的计算能力及网络带宽。 图1 通过外表导出数据
  • 导出流程 图2 并行导出流程 表1 流程说明 流程 说明 子任务 规划导出数据。 根据所选模式,准备需要导出的数据并规划导出路径。 详细内容请参见规划导出数据 - 启动GDS。 若规划的导出模式为Remote模式,需在数据服务器上安装配置并启动GDS。 详细内容请参见安装配置和启动GDS。 - 创建外表。 创建外表用于帮助GDS指定导出的数据文件。外表中保存了导出数据文件的位置、文件格式、编码格式、数据间的分隔符等信息。 详细内容请参见创建GDS外表。 - 执行导出数据。 在创建好外表后,通过INSERT语句,将数据快速、高效地导出到数据文件中。 详细内容请参见执行导出数据。 - 停止GDS。 数据导出完成后,停止GDS。 详细请参见停止GDS。 -
  • 创建外表 当完成创建外部服务器后,在GaussDB(DWS)数据库中创建一个HDFS只写外表,用来访问存储在HDFS上的数据。此外表是只写的,只能用于导出操作。 创建外表的语法格式如下: 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”:外表中数据源文件目录,即表数据目录在HDFS文件系统上对应的文件目录。此选项对WRITE ONLY外表为必选项,对READ ONLY外表为可选项。 “encoding”:外表中数据源文件的编码格式名称,缺省为utf8。 “filesize” 指定WRITE ONLY外表的文件大小。此选项为可选项,不指定该选项默认分布式文件系统配置中文件大小的配置值。此语法仅对WRITE ONLY的外表有效。 取值范围:[1, 1024]的整数。 filesize参数只对ORC格式的WRITE ONLY的HDFS外表有效。 “compression” 指定ORC格式文件的压缩方式,此选项为可选项。此语法仅对WRITE ONLY的外表有效。 取值范围: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; ---建立不包含分区列的HDFS外表,表关联的外部服务器为hdfs_server,表对应的HDFS服务上的文件格式为‘orc’,HDFS上的数据存储路径为'/user/hive/warehouse/product_info_orc/'。 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 '/user/hive/warehouse/product_info_orc/', compression 'snappy', version '0.12' ) Write Only; 父主题: 导出ORC数据到 MRS
  • 手动创建外部服务器 使用数据库管理员通过GaussDB(DWS)提供的数据库客户端连接默认数据库postgres。 例如:通过gsql客户端登录数据库的用户可以使用以下两种方法中的一种进行连接: 可以通过以下两种方法中的一种进行连接: 如果已经登录了gsql客户端,可以执行以下命令切换数据库和用户: 1 \c postgres dbadmin; 根据提示输入密码。 如果尚未登录gsql客户端,或者已经登录了gsql客户端执行\q退出gsql后,执行以下命令重新进行连接: 1 gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -W password -r 执行以下命令查询自动创建的外部服务器的信息: 1 SELECT * FROM pg_foreign_server; 返回结果如下: 1 2 3 4 5 6 srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions --------------------------------------------------+----------+--------+---------+------------+--------+--------------------------------------------------------------------------------------------------------------------- gsmpp_server | 10 | 13673 | | | | gsmpp_errorinfo_server | 10 | 13678 | | | | hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca | 16476 | 13685 | | | | {"address=192.168.1.245:25000,192.168.1.218:25000",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs} (3 rows) 查询结果中,每一行代表一个外部服务器的信息。与MRS数据源连接相关联的外部服务器包含以下信息: srvname值包含“hdfs_server”字样以及MRS集群的ID,此ID与MRS管理控制台的集群列表MRS ID相同。 srvoptions字段中的address参数为MRS集群的主备节点的IP地址及端口。 您可以根据上述信息找到您所要的外部服务器,并记录下它的srvname和srvoptions的值。 切换为即将创建外部服务器的用户去连接其对应的数据库。 在本示例中,执行以下命令,使用创建用户和数据库并授予外表权限中创建的普通用户dbuser连接其创建的数据库mydatabase: 1 \c mydatabase dbuser; 创建外部服务器。 创建外部服务器的详细语法,请参见CREATE SERVER。示例如下: 1 2 3 4 5 6 7 CREATE SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692cahdfs_server 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' ); 以下为必选参数的说明: 外部服务器名称 允许用户自定义名字。 在本例中,指定为前面的2中记录下来的srvname字段的值,如'hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca'。 不同的数据库之间资源是隔离的,因此在不同的数据库中外部服务器名称可以相同。 FOREIGN DATA WRAPPER 只能指定为HDFS_FDW,它在数据库中已经存在。 OPTIONS参数 以下参数请分别指定为2中记录下来的srvoptions中的参数值。 address 指定HDFS集群的主备节点所在的IP地址以及端口。 hdfscfgpath 指定HDFS集群配置文件路径。该参数仅支持type为HDFS时设置。只能设置一个路径。 type 取值为'hdfs',表示HDFS_FDW连接的是HDFS。 查看外部服务器: 1 SELECT * FROM pg_foreign_server WHERE srvname='hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca'; 返回结果如下所示,表示已经创建成功: 1 2 3 4 srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions --------------------------------------------------+----------+--------+---------+------------+--------+--------------------------------------------------------------------------------------------------------------------- hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca | 16476 | 13685 | | | | {"address=192.168.1.245:25000,192.168.1.218:25000",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs} (1 row)
  • 创建外表 当完成创建外部服务器后,在GaussDB(DWS)数据库中创建一个OBS/HDFS只写外表,用来访问存储在OBS/HDFS上的数据。此外表是只写的,只能用于导出操作。 创建外表的语法格式如下: 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格式文件的压缩方式,此选项为可选项。此语法仅对WRITE ONLY的外表有效。 取值范围: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
  • 手动创建外部服务器 使用数据库管理员通过GaussDB(DWS)提供的数据库客户端连接默认数据库postgres。 例如:通过gsql客户端登录数据库的用户可以使用以下两种方法中的一种进行连接: 可以通过以下两种方法中的一种进行连接: 如果已经登录了gsql客户端,可以执行以下命令切换数据库和用户: 1 \c postgres dbadmin; 根据提示输入密码。 如果尚未登录gsql客户端,或者已经登录了gsql客户端执行\q退出gsql后,执行以下命令重新进行连接: 1 gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -W password -r 执行以下命令查询自动创建的外部服务器的信息: 1 SELECT * FROM pg_foreign_server; 返回结果如下: 1 2 3 4 5 6 srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions --------------------------------------------------+----------+--------+---------+------------+--------+--------------------------------------------------------------------------------------------------------------------- gsmpp_server | 10 | 13673 | | | | gsmpp_errorinfo_server | 10 | 13678 | | | | hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca | 16476 | 13685 | | | | {"address=192.168.1.245:25000,192.168.1.218:25000",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs} (3 rows) 查询结果中,每一行代表一个外部服务器的信息。与MRS数据源连接相关联的外部服务器包含以下信息: srvname值包含“hdfs_server”字样以及MRS集群的ID,此ID与MRS管理控制台的集群列表MRS ID相同。 srvoptions字段中的address参数为MRS集群的主备节点的IP地址及端口。 您可以根据上述信息找到您所要的外部服务器,并记录下它的srvname和srvoptions的值。 切换为即将创建外部服务器的用户去连接其对应的数据库。 在本示例中,执行以下命令,使用创建用户和数据库并授予外表权限中创建的普通用户dbuser连接其创建的数据库mydatabase: 1 \c mydatabase dbuser; 创建外部服务器。 创建外部服务器的详细语法,请参见CREATE SERVER。示例如下: 1 2 3 4 5 6 7 CREATE SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692cahdfs_server 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' ); 以下为必选参数的说明: 外部服务器名称 允许用户自定义名字。 在本例中,指定为前面的2中记录下来的srvname字段的值,如'hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca'。 不同的数据库之间资源是隔离的,因此在不同的数据库中外部服务器名称可以相同。 FOREIGN DATA WRAPPER 只能指定为HDFS_FDW,它在数据库中已经存在。 OPTIONS参数 以下参数请分别指定为2中记录下来的srvoptions中的参数值。 address 指定HDFS集群的主备节点所在的IP地址以及端口。 hdfscfgpath 指定HDFS集群配置文件路径。该参数仅支持type为HDFS时设置。只能设置一个路径。 type 取值为'hdfs',表示HDFS_FDW连接的是HDFS。 查看外部服务器: 1 SELECT * FROM pg_foreign_server WHERE srvname='hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca'; 返回结果如下所示,表示已经创建成功: 1 2 3 4 srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions --------------------------------------------------+----------+--------+---------+------------+--------+--------------------------------------------------------------------------------------------------------------------- hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca | 16476 | 13685 | | | | {"address=192.168.1.245:25000,192.168.1.218:25000",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs} (1 row)
  • 创建外部服务器 使用即将创建外部服务器的用户去连接其对应的数据库。 在本示例中,将使用(可选)新建用户及数据库并授予外表权限中创建的普通用户dbuser连接其创建的数据库mydatabase 。用户需要通过GaussDB(DWS)提供的数据库客户端连接数据库。 例如,使用gsql客户端的用户可以通过以下两种方法中的一种进行连接: 如果已经登录了gsql客户端,可以执行以下命令切换数据库和用户: 1 \c mydatabase dbuser; 根据提示输入密码。 如果尚未登录gsql客户端,或者已经登录了gsql客户端执行“\q”退出gsql后,执行以下命令重新进行连接: 1 gsql -d mydatabase -h 192.168.2.30 -U dbuser -p 8000 -r 根据提示输入密码。 创建外部服务器。 例如,执行以下命令创建外部服务器“obs_server”: 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 2 3 4 5 6 7 8 CREATE SERVER obs_server FOREIGN DATA WRAPPER dfs_fdw OPTIONS ( address 'obs.cn-north-1.myhuaweicloud.com' , AC CES S_KEY 'access_key_value_to_be_replaced', SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced', encrypt 'on', type 'obs' ); 以下为必选参数的说明: 外部服务器名称 允许用户自定义名字。 在本例中指定为“obs_server” 。 FOREIGN DATA WRAPPER fdw_name的名字可以是hdfs_fdw或者dfs_fdw,它在数据库中已经存在。 OPTIONS参数 address 指定OBS服务的终端节点。 address的获取方法如下: 先通过OBS上的数据准备中的2获取OBS路径。 在OBS上查看到的OBS路径,为OBS服务终端节点(Endpoint):obs.example.com。 访问密钥(AK和SK)(必选) GaussDB(DWS)需要通过访问密钥(AK和SK)访问OBS,因此,必须先获取访问密钥。 “access_key”(必选):表示用户的AK信息。 “secret_access_key”(必选):表示用户的SK信息。 获取访问密钥的具体步骤,请参见创建访问密钥(AK和SK)。 type 取值为“obs”,表示dfs_fdw连接的是OBS。 查看外部服务器: 1 SELECT * FROM pg_foreign_server WHERE srvname='obs_server'; 返回结果如下所示,表示已经创建成功: 1 2 3 4 5 6 srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions ------------+----------+--------+---------+------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- obs_server | 24661 | 13686 | | | | {address=xxx.xxx.x.xxx,access_key=xxxxxxxxxxxxxxxxxxxx,type=obs,secret_access_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} (1 row)
  • 多表并发导出操作步骤 通过创建的两个外表,将数据库中的两个表分别导出至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外表并发导出。
  • 示例二 例如,在GaussDB(DWS)数据库中,创建一个format参数为CSV的只写外表,用于导出CSV文件。设置的参数信息如下所示: location 在规划导出数据中,通过获取数据源文件的OBS路径,已经获取到数据源文件的OBS路径。 因此,设置参数“location”为: 1 location 'obs://mybucket/output_data/', 访问密钥(AK和SK) 用户获取OBS访问协议对应的AK值(access_key)。 用户获取OBS访问协议对应的SK值 (secret_access_key)。 用户在创建用户时已经获取了access_key和secret_access_key的密钥,请根据实际密钥替换示例中的对应内容。 设置数据格式参数 数据源文件格式(format)为“CSV”。 编码格式(encoding)为“UTF-8”。 是否使用加密(encrypt),默认为 “off”。 字段分隔符(delimiter)为“,”。 header(指定导出数据文件是否包含标题行) 指定导出数据文件是否包含标题行,标题行一般用来描述表中每个字段的信息。 OBS导出数据时不支持该参数为true,使用缺省值false,不需要设置,表示导出的数据文件第一行不是标题行(即表头)。 根据以上信息,创建的外表如下所示: 认证用的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 26 DROP FOREIGN TABLE IF EXISTS product_info_output_ext2; CREATE FOREIGN TABLE product_info_output_ext2 ( 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/output_data/', 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' ) WRITE ONLY ; 返回如下信息表示创建成功: 1 CREATE FOREIGN TABLE
  • 操作步骤 根据规划导出数据中规划的路径,由此确定创建外表时使用的参数location的值。 用户获取OBS访问协议对应的AK值和SK值。 获取访问密钥,请登录管理控制台,单击右上角的用户名并选择菜单“我的凭证”,然后在左侧导航树单击“管理访问密钥”。在访问密钥页面,可以查看已有的访问密钥ID(即AK),如果要同时获取AK和SK,可以单击“新增访问密钥”创建并下载访问密钥。 梳理待导出数据的格式信息,确定创建外表时使用的数据格式参数的值。详细使用请参见数据格式参数。 根据前面步骤确定的参数,创建OBS外表。
  • 示例一 例如,在GaussDB(DWS)数据库中,创建一个format参数为text的只写外表,用于导出text文件。设置的参数信息如下所示: location 在规划导出数据中,通过获取数据源文件的OBS路径已经获取到数据源文件的OBS路径。 因此,设置参数“location”为: location 'obs://mybucket/output_data/', 访问密钥(AK和SK) 用户获取OBS访问协议对应的AK值(access_key)。 用户获取OBS访问协议对应的SK值 (secret_access_key)。 用户在创建用户时已经获取了access_key和secret_access_key的密钥,请根据实际密钥替换示例中的内容。 设置数据格式参数 数据源文件格式(format)为“TEXT”。 编码格式(encoding)为“UTF-8”。 是否使用加密(encrypt),默认为“off”。 字段分隔符(delimiter)为“|”。 根据以上信息,创建的外表如下所示: 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 DROP FOREIGN TABLE IF EXISTS product_info_output_ext1; CREATE FOREIGN TABLE product_info_output_ext1 ( c_bigint bigint, c_char char(30), c_varchar varchar(30), c_nvarchar2 nvarchar2(30) , c_data date, c_time time , c_test varchar(30)) server gsmpp_server options ( LOCATION 'obs://mybucket/output_data/', ACCESS_KEY 'access_key_value_to_be_replaced', SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced' format 'text', delimiter '|', encoding 'utf-8', encrypt 'on' ) WRITE ONLY; 返回如下信息表示创建成功: CREATE FOREIGN TABLE
  • 相关原理 下面分别从以下两类表介绍从集群导出数据到OBS的原理。 Hash分布表:在建表语句中指定了DISTRIBUTE BY HASH (Column_Name)的表。 对于Hash分布表而言,在存储表数据时,采用的是散列(Hash)方式的存储原理,如图1所示,图中以将表(T2)导出到OBS为例。 在存储表数据时,将表(T2)中指定的Hash字段(col2)进行Hash运算后,生成相应的Hash值(value),根据DN与Hash值的映射关系,将该元组分发到相应的DN上进行存储。 在导出数据到OBS时,每一个存储了导出表的(T2)数据的DN会直接向OBS导出属于自己的数据文件。多个节点将并行导出原始数据。 图1 Hash分布原理 Replication表:在建表语句中指定了DISTRIBUTE BY REPLICATION的表。 Replication表在GaussDB(DWS)集群的每个节点上都会存储一份完整的表数据。因此,在导出数据到OBS时,GaussDB(DWS)只会随机选择一个DN节点向OBS导出数据。
  • 导出文件的命名规则 GaussDB(DWS)向OBS导出数据的文件命名规则如下: 从DN节点导出数据时,以segment的格式存储在OBS服务中,文件命名规则为“表名称_节点名称_segment.n”。这里的“n”是从0开始按照自然数0、1、2、3递增。 例如,表t1在datanode3里面的数据导出成文件“t1_datanode3_segment.0”、“t1_datanode3_segment.1”等等,以此类推。 对于来自不同集群或不同数据库的数据,建议用户可以将数据导出到不同的OBS桶或者同一个OBS桶的不同路径下。 每个segment可以存储的最大数据为1GB,并且不能切断元组。如果segment超过1GB,超过1GB的数据会作为第二个segment进行存储。 例如: datanode3节点将表(t1)导出到OBS时,一个segment里面已经存储了100条元组,大小是1023MB,如果再插入一条5MB的元组,大小就变成1028MB了,此时会以1023MB生成一个“t1_datanode3_segment.0”保存到OBS服务中,新插入的第101条元组作为下一个“t1_datanode3_segment.1”保存到OBS服务中。 导出Hash分布表时,每个DataNode节点生成的segment数量和集群的DataNode节点数无关,而是取决于每个DataNode节点上存储的数据量。按照Hash方式存储在各个DataNode节点上的数据分布不一定均匀。 例如,一个有6个DataNode节点的集群,DataNode1到DataNode6分别有1.5GB、0.7GB、0.6GB、0.8GB、0.4GB、0.5GB的数据,则导出时会生成7个OBS segment文件,其中DataNode1会生成1GB和0.5GB两个segment文件。
  • 相关概念 数据源文件:存储有数据的TEXT、CSV文件。 OBS: 对象存储服务 ,是一种可存储文档、图片、影音视频等非结构化数据的 云存储 服务。从GaussDB(DWS)并行导出数据时,数据对象放置在OBS服务器上。 桶(Bucket):对OBS中的一个存储空间的形象称呼,是存储对象的容器。 对象存储是一种非常扁平化的存储方式,桶中存储的对象都在同一个逻辑层级,去除了文件系统中的多层级树形目录结构。 在OBS中,桶名必须是全局唯一的且不能修改,即用户创建的桶不能与自己已创建的其他桶名称相同,也不能与其他用户创建的桶名称相同。每个桶在创建时都会生成默认的桶ACL(Access Control List),桶ACL列表的每项包含了对被授权用户授予什么样的权限,如读取权限、写入权限、完全控制权限等。用户只有对桶有相应的权限,才可以对桶进行操作,如创建、删除、显示、设置桶ACL等。 一个用户最多可创建100个桶,但每个桶中存放的总数据容量和对象/文件数量没有限制。 对象:是存储在OBS中的基本数据单位。用户上传的数据以对象的形式存储在OBS的桶中。对象的属性包括名称Key,Metadata,Data。 通常,将对象等同于文件来进行管理,但是由于OBS是一种对象存储服务,并没有文件系统中的文件和文件夹概念。为了使用户更方便进行管理数据,OBS提供了一种方式模拟文件夹。通过在对象的名称中增加“/”,如tpcds1000/stock.csv,tpcds1000可以等同于文件夹,stock.csv就可以等同于文件名,而对象名称(key)仍然是tpcds1000/stock.csv、对象的内容就是stock.csv数据文件的内容。 Key:对象的名称(键),为经过UTF-8编码的长度大于0且不超过1024的字符序列,一个桶里的每个对象必须拥有唯一的对象键值。用户可使用桶名+对象名来存储和获取对应的对象。 Metadata:对象元数据,用来描述对象的信息。元数据又可分为系统元数据和用户元数据。这些元数据以键值对(Key-value)的形式随http头域一起上传到OBS系统。 系统元数据由OBS系统产生,在处理对象数据时使用。系统元数据包括:Date、Content-length、last-modify、Content-MD5等。 用户元数据由用户上传对象时指定,是用户自己对对象的一些描述信息。 Data:对象的数据内容,OBS对于数据的内容是无感知的,即认为对象内的数据为无状态的二进制数据。 外表:用于识别数据源文件中的数据。外表中保存了数据源文件的位置、文件格式、存放位置、编码格式、数据间的分隔符等信息。
  • 导出流程 图2 并行导出流程 表1 流程说明 流程 说明 子任务 规划导出数据 创建OBS桶,并在桶中创建导出后的数据文件的存放目录。 详细请参见规划导出数据。 - 创建OBS外表。 创建外表用于帮助OBS指定的待导出数据文件。外表中保存了数据源文件导出后的位置、文件格式、编码格式、数据间的分隔符等信息。 详细内容请参见创建OBS外表。 - 执行导出数据。 在创建好外表后,通过INSERT语句,将数据快速、高效地导出到数据文件中。 详细内容请参见执行导出。 -
  • 示例 示例一:执行gs_restore,导入指定MPPDB_backup.dmp文件(自定义归档格式)中postgres数据库的数据和对象定义。 1 2 3 gs_restore -W password backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb gs_restore[2017-07-21 19:16:26]: restore operation successful gs_restore: total time: 13053 ms 示例二:执行gs_restore,导入指定MPPDB_backup.tar文件(tar归档格式)中postgres数据库的数据和对象定义。 1 2 3 gs_restore backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb gs_restore[2017-07-21 19:21:32]: restore operation successful gs_restore[2017-07-21 19:21:32]: total time: 21203 ms 示例三:执行gs_restore,导入指定MPPDB_backup目录文件(目录归档格式)中postgres数据库的数据和对象定义。 1 2 3 gs_restore backup/MPPDB_backup -p 8000 -h 10.10.10.100 -d backupdb gs_restore[2017-07-21 19:26:46]: restore operation successful gs_restore[2017-07-21 19:26:46]: total time: 21003 ms 示例四:执行gs_restore,将postgres数据库的所有对象的定义导入至backupdb数据库。导入前,postgres存在完整的定义和数据,导入后,backupdb数据库只存在所有对象定义,表没有数据。 1 2 3 gs_restore -W password /home//backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb -s -e -c gs_restore[2017-07-21 19:46:27]: restore operation successful gs_restore[2017-07-21 19:46:27]: total time: 32993 ms 示例五:执行gs_restore,导入MPPDB_backup.dmp文件中PUBLIC模式的所有定义和数据。在导入时会先删除已经存在的对象,如果原对象存在跨模式的依赖则需手工强制干预。 1 2 3 4 5 6 7 gs_restore backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb -e -c -n PUBLIC gs_restore: [archiver (db)] Error while PROCESSING TOC: gs_restore: [archiver (db)] Error from TOC entry 313; 1259 337399 TABLE table1 gaussdba gs_restore: [archiver (db)] could not execute query: ERROR: cannot drop table table1 because other objects depend on it DETAIL: view t1.v1 depends on table table1 HINT: Use DROP ... CASCADE to drop the dependent objects too. Command was: DROP TABLE public.table1; 手工删除依赖,导入完成后再重新创建。 1 2 3 gs_restore backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb -e -c -n PUBLIC gs_restore[2017-07-21 19:52:26]: restore operation successful gs_restore[2017-07-21 19:52:26]: total time: 2203 ms 示例六:执行gs_restore,导入MPPDB_backup.dmp文件中PUBLIC模式下表hr.staffs的定义。在导入之前,hr.staffs表不存在。 1 2 3 gs_restore backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb -e -c -s -n PUBLIC -t hr.staffs gs_restore[2017-07-21 19:56:29]: restore operation successful gs_restore[2017-07-21 19:56:29]: total time: 21000 ms 示例七:执行gs_restore,导入MPPDB_backup.dmp文件中PUBLIC模式下表hr.staffs的数据。在导入之前,hr.staffs表不存在数据。 1 2 3 gs_restore backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb -e -a -n PUBLIC -t hr.staffs gs_restore[2017-07-21 20:12:32]: restore operation successful gs_restore[2017-07-21 20:12:32]: total time: 20203 ms 示例八:执行gs_restore,导入指定表hr.staffs的定义。在导入之前,hr.staffs表的数据是存在的。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 human_resource=# select * from hr.staffs; staff_id | first_name | last_name | email | phone_number | hire_date | employment_id | salary | commission_pct | manager_id | section_id ----------+-------------+-------------+----------+--------------------+---------------------+---------------+----------+----------------+------------+------------ 200 | Jennifer | Whalen | JWHALEN | 515.123.4444 | 1987-09-17 00:00:00 | AD_ASST | 4400.00 | | 101 | 10 201 | Michael | Hartstein | MHARTSTE | 515.123.5555 | 1996-02-17 00:00:00 | MK_MAN | 13000.00 | | 100 | 20 gsql -d human_resource -p 8000 gsql ((GaussDB x.x.x build 39137c2d) compiled at 2022-04-01 15:43:11 commit 3629 last mr 5138 release) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. human_resource=# drop table hr.staffs CASCADE; NOTICE: drop cascades to view hr.staff_details_view gs_restore -W password /home//backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100-d human_resource -n hr -t staffs -s -e restore operation successful total time: 904 ms human_resource=# select * from hr.staffs; staff_id | first_name | last_name | email | phone_number | hire_date | employment_id | salary | commission_pct | manager_id | section_id ----------+------------+-----------+-------+--------------+-----------+---------------+--------+----------------+------------+------------ (0 rows) 示例九:执行gs_restore,导入staffs和areas两个指定表的定义和数据。在导入之前,staffs和areas表不存在。 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 30 31 32 33 34 35 36 human_resource=# \d List of relations Schema | Name | Type | Owner | Storage --------+--------------------+-------+----------+---------------------------------- hr | employment_history | table | | {orientation=row,compression=no} hr | employments | table | | {orientation=row,compression=no} hr | places | table | | {orientation=row,compression=no} hr | sections | table | | {orientation=row,compression=no} hr | states | table | | {orientation=row,compression=no} (5 rows) gs_restore -W password /home/mppdb/backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d human_resource -n hr -t staffs -n hr -t areas restore operation successful total time: 724 ms human_resource=# \d List of relations Schema | Name | Type | Owner | Storage --------+--------------------+-------+----------+---------------------------------- hr | areas | table | | {orientation=row,compression=no} hr | employment_history | table | | {orientation=row,compression=no} hr | employments | table | | {orientation=row,compression=no} hr | places | table | | {orientation=row,compression=no} hr | sections | table | | {orientation=row,compression=no} hr | staffs | table | | {orientation=row,compression=no} hr | states | table | | {orientation=row,compression=no} (7 rows) human_resource=# select * from hr.areas; area_id | area_name ---------+------------------------ 4 | Iron 1 | Wood 2 | Lake 3 | Desert (4 rows) 示例十:执行gs_restore,导入hr的模式,包含模式下的所有对象定义和数据。 1 2 3 gs_restore -W password /home//backup/MPPDB_backup1.sql -p 8000 -h 10.10.10.100 -d backupdb -n hr -e -c restore operation successful total time: 702 ms 示例十一:执行gs_restore,同时导入hr和hr1两个模式,仅导入模式下的所有对象定义。 1 2 3 gs_restore -W password /home//backup/MPPDB_backup2.dmp -p 8000 -h 10.10.10.100 -d backupdb -n hr -n hr1 -s restore operation successful total time: 665 ms 示例十二:执行gs_restore,将human_resource数据库导出文件进行解密并导入至backupdb数据库中。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 create database backupdb; gs_restore /home//backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb --with-key=1234567812345678 restore operation successful total time: 23472 ms gsql -d backupdb -p 8000 -r gsql ((GaussDB x.x.x build 39137c2d) compiled at 2022-04-01 15:43:11 commit 3629 last mr 5138 release) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. backupdb=# select * from hr.areas; area_id | area_name ---------+------------------------ 4 | Iron 1 | Wood 2 | Lake 3 | Desert (4 rows) 示例十三:用户user1不具备将导出文件中数据导入至数据库backupdb的权限,而角色role1具备该权限,要实现将文件数据导入数据库backupdb,可以在导出命令中设置--role角色为role1,使用role1的权限,完成导出目的。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 human_resource=# CREATE USER user1 IDENTIFIED BY 'password'; gs_restore -U user1 -W password /home//backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb --role role1 --rolepassword password restore operation successful total time: 554 ms gsql -d backupdb -p 8000 -r gsql ((GaussDB x.x.x build 39137c2d) compiled at 2022-04-01 15:43:11 commit 3629 last mr 5138 release) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. backupdb=# select * from hr.areas; area_id | area_name ---------+------------------------ 4 | Iron 1 | Wood 2 | Lake 3 | Desert (4 rows)
  • 操作场景 gs_restore是GaussDB(DWS)提供的与gs_dump配套的导入工具。通过该工具,可将gs_dump导出的文件导入至数据库。gs_restore支持导入的文件格式包含自定义归档格式、目录归档格式和tar归档格式。 gs_restore具备如下两种功能。 导入至数据库 如果指定了数据库,则数据将被导入到指定的数据库中。其中,并行导入必须指定连接数据库的密码。 导入至脚本文件 如果未指定导入数据库,则创建包含重建数据库所需的SQL语句脚本,并将其写入至文件或者标准输出。该脚本文件等效于gs_dump导出的纯文本格式文件。 gs_restore工具在导入时,允许用户选择需要导入的内容,并支持在数据导入前对等待导入的内容进行排序。
  • 示例 示例一:执行gs_dump导出数据,用户jack不具备导出数据库human_resource的权限,而角色role1具备该权限,要实现导出数据库human_resource,可以在导出命令中设置--role角色为role1,使用role1的权限,完成导出目的。导出文件格式为tar归档格式。 human_resource=# CREATE USER jack IDENTIFIED BY "password"; gs_dump -U jack -W password -f /home//backup/MPPDB_backup11.tar -p 8000 -h 10.10.10.100 human_resource --role role1 --rolepassword password -F t gs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: dump database human_resource successfully gs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: total time: 4239 ms 示例二:执行gs_dump导出数据,用户jack不具备导出模式public的权限,而角色role1具备该权限,要实现导出模式public,可以在导出命令中设置--role角色为role1,使用role1的权限,完成导出目的。导出文件格式为tar归档格式。 human_resource=# CREATE USER jack IDENTIFIED BY "1234@abc"; gs_dump -U jack -W password -f /home//backup/MPPDB_backup12.tar -p 8000 -h 10.10.10.100 human_resource -n public --role role1 --rolepassword password -F t gs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: dump database human_resource successfully gs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: total time: 3278 ms 示例三:执行gs_dumpall导出数据,用户jack不具备导出所有数据库的权限,而角色role1具备该权限,要实现导出所有数据库,可以在导出命令中设置--role角色为role1,使用role1的权限,完成导出目的。导出文件格式为文本归档格式。 human_resource=# CREATE USER jack IDENTIFIED BY "password"; gs_dumpall -U jack -W password -f /home//backup/MPPDB_backup.sql -p 8000 -h 10.10.10.100 --role role1 --rolepassword password gs_dumpall[port='8000'][human_resource][2018-11-14 17:26:18]: dumpall operation successful gs_dumpall[port='8000'][human_resource][2018-11-14 17:26:18]: total time: 6437 ms
  • 示例 示例一:执行gs_dumpall,导出所有数据库的公共全局表空间信息和用户信息(dbadmin用户为管理员用户),导出文件为文本格式。 gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_globals.sql -p 8000 -h 10.10.10.100 -g gs_dumpall[port=''][2018-11-14 19:06:24]: dumpall operation successful gs_dumpall[port=''][2018-11-14 19:06:24]: total time: 1150 ms 示例二: 执行gs_dumpall,导出所有数据库的公共全局表空间信息(dbadmin用户为管理员用户),并对导出文件进行加密,导出文件为文本格式。 gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_tablespace.sql -p 8000 -h 10.10.10.100 -t --with-encryption AES128 --with-key 1212121212121212 gs_dumpall[port=''][2018-11-14 19:00:58]: dumpall operation successful gs_dumpall[port=''][2018-11-14 19:00:58]: total time: 186 ms 示例三:执行gs_dumpall,导出所有数据库的公共全局用户信息(dbadmin用户为管理员用户),导出文件为文本格式。 gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_user.sql -p 8000 -h 10.10.10.100 -r gs_dumpall[port=''][2018-11-14 19:03:18]: dumpall operation successful gs_dumpall[port=''][2018-11-14 19:03:18]: total time: 162 ms
共100000条