华为云用户手册

  • 示例 示例一:执行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 tgs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: dump database human_resource successfullygs_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 tgs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: dump database human_resource successfullygs_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 passwordgs_dumpall[port='8000'][human_resource][2018-11-14 17:26:18]: dumpall operation successfulgs_dumpall[port='8000'][human_resource][2018-11-14 17:26:18]: total time: 6437 ms
  • 注意事项 GDS支持并发导入导出,gds -t参数用于设置gds的工作线程池大小,控制并发场景下同时工作的工作线程数且不会加速单个sql任务。gds -t缺省值为8,上限值为200。在使用管道功能进行导入导出时,-t参数应不低于业务并发数。如果是双集群互联互通场景,-t参数应不低于业务并发数的两倍。 由于管道“读取即删除”的特点,需确保导入或导出过程中除GDS程序外无其他程序读取管道文件,避免导入过程中数据丢失或者任务报错及导出的文件内容混乱。 不支持对具有相同location的外表并发导入导出,即GDS的多个线程同时读取管道文件或者同时写入管道文件。 GDS的单个导入导出任务只识别一个管道文件,因此不要对GDS外表设置带有通配符({}[]?)的location地址。如: 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');
  • 常见问题和定位方法: 问题1:"/***/postgres_public_foreign_test_pipe_tr.pipe" must be named pipe. 定位方法:GDS的外表file_type类型为pipe但是操作的文件却是一个普通文件类型。应该排查postgres_public_foreign_test_pipe_tr.pipe是否是为管道文件。 问题2:could not open pipe "/***/postgres_public_foreign_test_pipe_tw.pipe" cause by Permission denied. 定位方法:GDS没有权限打开管道文件。 问题3:could not open source file /*****/postgres_public_foreign_test_pipe_tw.pipe because timeout 300s for WRITING. 定位方法:GDS导出时打开管道文件超时,一般由于auto_create_pipe为false时候,管道文件在300秒内未被创建,或者创建了但是300秒内没有程序读取该管道文件。 问题4:could not open source file /*****/postgres_public_foreign_test_pipe_tw.pipe because timeout 300s for READING. 定位方法:GDS导出时打开管道文件超时,一般由于auto_create_pipe为false时候,管道文件在300秒内未被创建或者创建了但是300秒之内没有程序写入该管道文件。 问题5:could not poll writing source pipe file "/****/postgres_public_foreign_test_pipe_tw.pipe" timeout 300s. 定位方法:GDS导出时超过300秒未等到管道上的写事件,一般由于该管道文件超过300秒没有被读取。 问题6:could not poll reading source pipe file "/****/postgres_public_foreign_test_pipe_tw.pipe" timeout 300s. 定位方法:GDS导入时超过300秒未等到管道上的读事件,一般由于该管道文件超过300秒没有被写入。 问题7:could not open pipe file "/***/postgres_public_foreign_test_pipe_tw.pipe" for "WRITING" with error No such device or address. 定位方法:表示当前"/***/postgres_public_foreign_test_pipe_tw.pipe"管道文件没有程序正在读取导致GDS无法以写的方式打开管道文件。
  • 示例 示例一:执行gs_dump,导出hr模式全量信息,并对导出文件进行压缩,导出文件格式为文本格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_schema_backup.sql -p 8000 -h 10.10.10.100 human_resource -n hr -Z 6 -F pgs_dump[port=''][human_resource][2017-07-21 16:05:55]: dump database human_resource successfullygs_dump[port=''][human_resource][2017-07-21 16:05:55]: total time: 2425 ms 示例二:执行gs_dump,仅导出hr模式的数据,导出文件格式为tar归档格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_schema_data_backup.tar -p 8000 -h 10.10.10.100 human_resource -n hr -a -F tgs_dump[port=''][human_resource][2018-11-14 15:07:16]: dump database human_resource successfullygs_dump[port=''][human_resource][2018-11-14 15:07:16]: total time: 1865 ms 示例三:执行gs_dump,仅导出hr模式的定义,导出文件格式为目录归档格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_schema_def_backup -p 8000 -h 10.10.10.100 human_resource -n hr -s -F dgs_dump[port=''][human_resource][2018-11-14 15:11:34]: dump database human_resource successfullygs_dump[port=''][human_resource][2018-11-14 15:11:34]: total time: 1652 ms 示例四:执行gs_dump,导出human_resource数据库时,排除hr模式,导出文件格式为自定义归档格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_schema_backup.dmp -p 8000 -h 10.10.10.100 human_resource -N hr -F cgs_dump[port=''][human_resource][2017-07-21 16:06:31]: dump database human_resource successfullygs_dump[port=''][human_resource][2017-07-21 16:06:31]: total time: 2522 ms 示例五:执行gs_dump,同时导出hr和public模式,且仅导出模式定义,并对导出文件进行加密,导出文件格式为tar归档格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_schema_backup1.tar -p 8000 -h 10.10.10.100 human_resource -n hr -n public -s --with-encryption AES128 --with-key 1234567812345678 -F tgs_dump[port=''][human_resource][2017-07-21 16:07:16]: dump database human_resource successfullygs_dump[port=''][human_resource][2017-07-21 16:07:16]: total time: 2132 ms 示例六:执行gs_dump,导出human_resource数据库时,排除hr和public模式,导出文件格式为自定义归档格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_schema_backup2.dmp -p 8000 -h 10.10.10.100 human_resource -N hr -N public -F cgs_dump[port=''][human_resource][2017-07-21 16:07:55]: dump database human_resource successfullygs_dump[port=''][human_resource][2017-07-21 16:07:55]: total time: 2296 ms 示例七:执行gs_dump,导出public模式下所有表(视图、序列和外表)和hr模式中staffs表,包含数据和表定义,导出文件格式为自定义归档格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_backup3.dmp -p 8000 -h 10.10.10.100 human_resource -t public.* -t hr.staffs -F cgs_dump[port=''][human_resource][2018-12-13 09:40:24]: dump database human_resource successfullygs_dump[port=''][human_resource][2018-12-13 09:40:24]: total time: 896 ms
  • 示例 示例一:执行gs_dump,导出表hr.staffs的定义和数据,并对导出文件进行压缩,导出文件格式为文本格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup.sql -p 8000 -h 10.10.10.100 human_resource -t hr.staffs -Z 6 -F pgs_dump[port=''][human_resource][2017-07-21 17:05:10]: dump database human_resource successfullygs_dump[port=''][human_resource][2017-07-21 17:05:10]: total time: 3116 ms 示例二:执行gs_dump,只导出表hr.staffs的数据,导出文件格式为tar归档格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_table_data_backup.tar -p 8000 -h 10.10.10.100 human_resource -t hr.staffs -a -F t gs_dump[port=''][human_resource][2017-07-21 17:04:26]: dump database human_resource successfullygs_dump[port=''][human_resource][2017-07-21 17:04:26]: total time: 2570 ms 示例三:执行gs_dump,导出表hr.staffs的定义,导出文件格式为目录归档格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_table_def_backup -p 8000 -h 10.10.10.100 human_resource -t hr.staffs -s -F d gs_dump[port=''][human_resource][2017-07-21 17:03:09]: dump database human_resource successfullygs_dump[port=''][human_resource][2017-07-21 17:03:09]: total time: 2297 ms 示例四:执行gs_dump,不导出表hr.staffs,导出文件格式为自定义归档格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup4.dmp -p 8000 -h 10.10.10.100 human_resource -T hr.staffs -F cgs_dump[port=''][human_resource][2017-07-21 17:14:11]: dump database human_resource successfullygs_dump[port=''][human_resource][2017-07-21 17:14:11]: total time: 2450 ms 示例五:执行gs_dump,同时导出两个表hr.staffs和hr.employments,导出文件格式为文本格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup1.sql -p 8000 -h 10.10.10.100 human_resource -t hr.staffs -t hr.employments -F pgs_dump[port=''][human_resource][2017-07-21 17:19:42]: dump database human_resource successfullygs_dump[port=''][human_resource][2017-07-21 17:19:42]: total time: 2414 ms 示例六:执行gs_dump,导出时,排除两个表hr.staffs和hr.employments,导出文件格式为文本格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup2.sql -p 8000 -h 10.10.10.100 human_resource -T hr.staffs -T hr.employments -F pgs_dump[port=''][human_resource][2017-07-21 17:21:02]: dump database human_resource successfullygs_dump[port=''][human_resource][2017-07-21 17:21:02]: total time: 3165 ms 示例七:执行gs_dump,导出表hr.staffs的定义和数据,只导出表hr.employments的定义,导出文件格式为tar归档格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup3.tar -p 8000 -h 10.10.10.100 human_resource -t hr.staffs -t hr.employments --exclude-table-data hr.employments -F tgs_dump[port=''][human_resource][2018-11-14 11:32:02]: dump database human_resource successfullygs_dump[port=''][human_resource][2018-11-14 11:32:02]: total time: 1645 ms 示例八:执行gs_dump,导出表hr.staffs的定义和数据,并对导出文件进行加密,导出文件格式为文本格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup4.sql -p 8000 -h 10.10.10.100 human_resource -t hr.staffs --with-encryption AES128 --with-key 1212121212121212 -F pgs_dump[port=''][human_resource][2018-11-14 11:35:30]: dump database human_resource successfullygs_dump[port=''][human_resource][2018-11-14 11:35:30]: total time: 6708 ms 示例九:执行gs_dump,导出public模式下所有表(包括视图、序列和外表)和hr模式中staffs表,包含数据和表定义,导出文件格式为自定义归档格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup5.dmp -p 8000 -h 10.10.10.100 human_resource -t public.* -t hr.staffs -F cgs_dump[port=''][human_resource][2018-12-13 09:40:24]: dump database human_resource successfullygs_dump[port=''][human_resource][2018-12-13 09:40:24]: total time: 896 ms 示例十: 执行gs_dump,仅导出依赖于t1模式下的test1表对象的视图信息,导出文件格式为目录归档格式。 gs_dump -W password -U jack -f /home//backup/MPPDB_view_backup6 -p 8000 -h 10.10.10.100 human_resource -t t1.test1 --include-depend-objs --exclude-self -F dgs_dump[port=''][jack][2018-11-14 17:21:18]: dump database human_resource successfullygs_dump[port=''][jack][2018-11-14 17:21:23]: total time: 4239 ms
  • 多线程导出 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90,导出的数据文件格式为CSV,同时导出2个目标表,所以规划使用Remote模式进行多线程导出。 Remote模式多线程导出数据操作示例如下所示: 以root用户登录GDS数据服务器,创建导出数据文件存放目录“/output_data”,数据库用户及所属的用户组。 123 mkdir -p /output_datagroupadd gdsgrpuseradd -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 91011121314151617 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 910111213141516 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。 1234 ps -ef|grep gdsgds_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 gdskill -9 128954
  • Remote模式导出 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90,导出数据文件格式为CSV,所以规划的并行导出模式为Remote模式。 Remote模式并行导出数据操作示例如下所示: 以root用户登录GDS数据服务器,创建数据文件存放目录“/output_data”,启动gds_user用户及所属的用户组。 1 mkdir -p /output_data (可选)创建用户及其所属的用户组。此用户用于启动GDS。若该类用户及所属用户组已存在,可跳过此步骤。 12 groupadd gdsgrpuseradd -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 91011121314151617 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_serverOPTIONS (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。 1234 ps -ef|grep gdsgds_user 128954 1 0 15:03 ? 00:00:00 gds -d /output_data -p 192.168.0.90:5000 -Dgds_user 129003 118723 0 15:04 pts/0 00:00:00 grep gdskill -9 128954
  • 示例 示例一:执行gs_dump,导出gaussdb数据库全量信息,并对导出文件进行压缩,导出文件格式为sql文本格式。 gs_dump -W password -U jack -f /home//backup/postgres_backup.sql -p 8000 -h 10.10.10.100 gaussdb -Z 8 -F pgs_dump[port=''][gaussdb][2017-07-21 15:36:13]: dump database gaussdb successfullygs_dump[port=''][gaussdb][2017-07-21 15:36:13]: total time: 3793 ms 示例二:执行gs_dump,仅导出gaussdb数据库中的数据,不包含数据库对象定义,导出文件格式为自定义归档格式。 gs_dump -W Password -U jack -f /home//backup/postgres_data_backup.dmp -p 8000 -h 10.10.10.100 gaussdb -a -F cgs_dump[port=''][gaussdb][2017-07-21 15:36:13]: dump database gaussdb successfullygs_dump[port=''][gaussdb][2017-07-21 15:36:13]: total time: 3793 ms 示例三:执行gs_dump,仅导出gaussdb数据库所有对象的定义,导出文件格式为sql文本格式。 --导出前,表nation有数据select n_nationkey,n_name,n_regionkey from nation limit 3; n_nationkey | n_name | n_regionkey -------------+---------------------------+------------- 0 | ALGERIA | 0 3 | CANADA | 1 11 | IRAQ | 4(3 rows)gs_dump -W password -U jack -f /home//backup/postgres_def_backup.sql -p 8000 -h 10.10.10.100 gaussdb -s -F pgs_dump[port=''][gaussdb][2017-07-20 15:04:14]: dump database gaussdb successfullygs_dump[port=''][gaussdb][2017-07-20 15:04:14]: total time: 472 ms 示例四:执行gs_dump,仅导出gaussdb数据库的所有对象的定义,导出文件格式为文本格式,并对导出文件进行加密。 gs_dump -W password -U jack -f /home//backup/postgres_def_backup.sql -p 8000 -h 10.10.10.100 gaussdb --with-encryption AES128 --with-key 1234567812345678 -s -F pgs_dump[port=''][gaussdb][2018-11-14 11:25:18]: dump database gaussdb successfullygs_dump[port=''][gaussdb][2018-11-14 11:25:18]: total time: 1161 ms
  • 创建外表 当完成创建外部服务器后,在GaussDB(DWS)数据库中创建一个OBS/HDFS只写外表,用来访问存储在OBS/HDFS上的数据。此外表是只写的,只能用于导出操作。 创建外表的语法格式如下,详细的描述请参见CREATE FOREIGN TABLE (SQL on Hadoop or OBS)。 1 2 3 4 5 6 7 8 91011 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 9101112131415161718192021222324 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
  • 示例 示例:创建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 9101112131415 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;
  • 注意事项 禁止修改导出的文件和内容,否则可能无法恢复成功。 为了保证数据一致性和完整性,导出工具会对需要转储的表设置共享锁。如果表在别的事务中设置了共享锁,gs_dump和gs_dumpall会等待锁释放后锁定表。如果无法在指定时间内锁定某个表,转储会失败。用户可以通过指定--lock-wait-timeout选项,自定义等待锁超时时间。 由于gs_dumpall读取所有数据库中的表,因此必须以数据库集群管理员身份进行连接,才能导出完整文件。在使用gsql执行脚本文件导入时,同样需要管理员权限,以便添加用户和组,以及创建数据库。 由于GaussDB(DWS)数据库所有视图的定义都默认带有表名或别名的前缀(即tab.col的形式),因此可能与原始定义不符,导致在极少的场景下会发生重建视图字段对应基表不准确而报错的情况。为避免此情况建议在导出视图定义时,设置guc参数behavior_compat_options='compat_display_ref_table',使导出定义与原始语句一致。
  • 操作步骤 根据规划导出数据中规划的路径确定外表参数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外表。外表的创建语法以及详细使用,请参考CREATE FOREIGN TABLE (GDS导入导出)。
  • 任务示例 示例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;
  • 规划导出路径 Remote模式 以root用户登录GDS数据服务器,创建导出的数据文件存放目录“/output_data”。 1 mkdir -p /output_data (可选)创建用户及所属的用户组。此用户为启动GDS的用户,该用户需要拥有导出数据文件存放目录的写权限。 12 groupadd gdsgrpuseradd -g gdsgrp gdsuser 若出现以下提示,说明数据库用户及所属用户组已存在,可跳过本步骤。 12 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。 -
  • 单表导出操作步骤 通过创建外表,将数据库中的单表导出至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的密钥,请根据实际密钥替换示例中的内容。 根据以上信息,创建的外表如下所示: 1 2 3 4 5 6 7 8 910111213141516171819202122232425 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_serverOPTIONS(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 910111213141516171819202122232425 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_serverOPTIONS(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外表并发导出。
  • 多表并发导出操作步骤 通过创建的两个外表,将数据库中的两个表分别导出至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的密钥,请根据实际密钥替换示例中的内容。 根据以上信息,创建的外表如下所示: 1 2 3 4 5 6 7 8 910111213141516171819202122232425 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_serverOPTIONS(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 9101112131415161718192021222324252627 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_serverOPTIONS(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;
  • 示例二 例如,在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导出数据时不支持该参数为ture,使用缺省值false,不需要设置,表示导出的数据文件第一行不是标题行(即表头)。 根据以上信息,创建的外表如下所示: 1 2 3 4 5 6 7 8 91011121314151617181920212223242526 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外表。外表的创建语法以及详细使用,请参考CREATE FOREIGN TABLE (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)为'|'。 根据以上信息,创建的外表如下所示: 1 2 3 4 5 6 7 8 9101112131415161718192021 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
  • (可选)新建用户及数据库并授予外表权限 如果您将使用普通用户在自定义数据库中创建外部服务器和外表,由于普通用户没有外表权限无法创建,所以,您必须参照以下步骤新建用户和数据库,并授予该用户外表权限。 以下示例,是新建一个普通用户dbuser并创建一个数据库mydatabase,然后使用管理员用户授予dbuser外表权限。 使用数据库管理员通过GaussDB(DWS)提供的数据库客户端连接默认数据库gaussdb。 例如,使用gsql客户端的用户执行下面命令连接数据库: 1 gsql -d gaussdb -h 192.168.2.30 -U dbadmin -p 8000 -W password -r 新建一个普通用户,并用它创建一个数据库。 新建一个具有创建数据库权限的用户dbuser: 1 CREATE USER dbuser WITH CREATEDB PASSWORD 'password'; 切换为新建的用户: 1 SET ROLE dbuser PASSWORD 'password'; 执行以下命令创建数据库: 1 CREATE DATABASE mydatabase; 查询数据库: 1 SELECT * FROM pg_database; 返回结果中有mydatabase的信息表示创建成功: 1 2 3 4 5 6 7 8 910 datname | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datcompatibility | datacl------------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+---------------+------------------+---------------------------------------------------- template1 | 10 | 0 | C | C | t | t | -1 | 14146 | 1351 | 1663 | ORA | {=c/Ruby,Ruby=CTc/Ruby} template0 | 10 | 0 | C | C | t | f | -1 | 14146 | 1350 | 1663 | ORA | {=c/Ruby,Ruby=CTc/Ruby} gaussdb | 10 | 0 | C | C | f | t | -1 | 14146 | 1352 | 1663 | ORA | {=Tc/Ruby,Ruby=CTc/Ruby,chaojun=C/Ruby,huobinru=C/Ruby} mydatabase | 17000 | 0 | C | C | f | t | -1 | 14146 | 1351 | 1663 | ORA |(4 rows) 使用管理员用户给普通用户赋予创建外部服务器的权限和使用外表的权限。 使用数据库管理员用户通过GaussDB(DWS)提供的数据库客户端连接新建的数据库。 例如,使用gsql客户端的用户可以直接使用如下语句切换为管理员用户去连接新建的数据库: 1 \c mydatabase dbadmin; 根据提示输入管理员用户密码。 注意,必须先使用管理员用户连接到将要创建外部服务器和使用外表的数据库,再对普通用户进行授权。 默认只有系统管理员才可以创建外部服务器,普通用户需要授权才可以创建,执行以下命令授权: 12 GRANT ALL ON SCHEMA public TO dbuser;GRANT ALL ON FOREIGN DATA WRAPPER dfs_fdw TO dbuser; 其中fdw_name的名字可以是hdfs_fdw或者dfs_fdw,dbuser为创建SERVER的用户名。 执行以下命令赋予用户使用外表的权限。 1 ALTER USER dbuser USEFT; 查看用户: 1 2 3 4 5 6 7 8 910111213 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.roluseftFROM pg_catalog.pg_roles rORDER BY 1; 返回结果中dbuser的信息中包含了UseFT权限,表示授权成功: 12345 rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolconnlimit | rolvalidbegin | rolvaliduntil | memberof | rolreplication | rolauditadmin | rolsystemadmin | roluseft-----------+----------+------------+---------------+-------------+-------------+--------------+---------------+---------------+----------+----------------+---------------+----------------+---------- dbuser | f | t | f | t | t | -1 | | | {} | f | f | f | t lily | f | t | f | f | t | -1 | | | {} | f | f | f | f Ruby | t | t | t | t | t | -1 | | | {} | t | t | t | t
  • 创建外部服务器 使用即将创建外部服务器的用户去连接其对应的数据库。 在本示例中,将使用(可选)新建用户及数据库并授予外表权限中创建的普通用户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 根据提示输入密码。 创建外部服务器。 创建外部服务器的详细语法,请参见CREATE SERVER。 例如,执行以下命令创建外部服务器'obs_server' : 12345678 CREATE SERVER obs_server FOREIGN DATA WRAPPER dfs_fdw OPTIONS ( address 'obs.cn-north-1.myhuaweicloud.com' , ACCESS_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.xxx.xxx.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'; 返回结果如下所示,表示已经创建成功: 123456 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)
  • 创建外表 创建外表的语法格式如下,详细的描述请参见CREATE FOREIGN TABLE (SQL on Hadoop or OBS)。 1 2 3 4 5 6 7 8 910 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 ] ] ; 例如,创建一个名为"product_info_ext_obs"的外表,对语法中的参数按如下描述进行设置: table_name 外表的表名。 表字段定义 column_name:外表中的字段名。 type_name:字段的数据类型。 多个字段用“,”隔开。 外表的字段个数和字段类型,需要与OBS上保存的数据完全一致。 SERVER dfs_server 外表的外部服务器名称,这个server必须存在。外表通过设置外部服务器连接OBS读取数据。 此处应填写为参照创建外部服务器创建的外部服务器名称。 OPTIONS参数 用于指定外表数据的各类参数,关键参数如下所示。 “format”:表示对应的OBS服务上的文件格式,支持“orc”、“carbondata”格式。 “foldername”:必选参数。数据源文件的OBS路径,此处仅需要填写“/桶名/文件夹目录层级/”。 可以先通过OBS上的数据准备中的2获取数据源文件的完整的OBS路径,该路径为OBS服务的终端节点(Endpoint)。 “totalrows”:可选参数。该参数不是导入的总行数。由于OBS上文件可能很多,做analyze可能会很慢,通过“totalrows”参数,让用户来设置一个预估的值,使优化器能通过这个值做大小表的估计。一般预估值与实际值的数量级差不多时,查询效率较高。 “encoding”:外表中数据源文件的编码格式名称,缺省为utf8。对于OBS外表此参数为必选项。 DISTRIBUTE BY: 这个子句是必须的,对于OBS外表,当前只支持ROUNDROBIN分布方式。 表示外表在从数据源读取数据时,GaussDB(DWS)集群每一个节点随机读取一部分数据,并组成完整数据。 语法中的其他参数 其他参数均为可选参数,用户可以根据自己的需求进行设置,在本例中不需要设置。 根据以上信息,创建外表命令如下所示: 建立不包含分区列的OBS外表,表关联的外部服务器为obs_server,表对应的OBS服务上的文件格式为‘orc’,OBS上的数据存储路径为'/mybucket/data/'。 1 2 3 4 5 6 7 8 910111213141516171819202122 DROP FOREIGN TABLE IF EXISTS product_info_ext_obs;CREATE FOREIGN TABLE product_info_ext_obs( 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 obs_server OPTIONS (format 'orc', foldername '/mybucket/demo.db/product_info_orc/',encoding 'utf8',totalrows '10') DISTRIBUTE BY ROUNDROBIN; 建立包含分区列的OBS外表,product_info_ext_obs外表使用product_manufacturer字段作为分区键,obs/mybucket/demo.db/product_info_orc/路径下有如下分区目录: 分区目录1:product_manufacturer=10001 分区目录2:product_manufacturer=10010 分区目录3:product_manufacturer=10086 ... 1 2 3 4 5 6 7 8 9101112131415161718192021222324 DROP FOREIGN TABLE IF EXISTS product_info_ext_obs;CREATE FOREIGN TABLE product_info_ext_obs( 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) , product_manufacturer integer) SERVER obs_server OPTIONS (format 'orc', foldername '/mybucket/demo.db/product_info_orc/',encoding 'utf8',totalrows '10') DISTRIBUTE BY ROUNDROBINPARTITION BY (product_manufacturer) AUTOMAPPED;
  • 相关原理 下面分别从以下两类表介绍从集群导出数据到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导出数据。
  • 导出流程 图2 并行导出流程 表1 流程说明 流程 说明 子任务 规划导出数据 创建OBS桶,并在桶中创建导出后的数据文件的存放目录。 详细请参见规划导出数据。 - 创建OBS外表。 创建外表用于帮助OBS指定的待导出数据文件。外表中保存了数据源文件导出后的位置、文件格式、编码格式、数据间的分隔符等信息。 详细内容请参见创建OBS外表。 - 执行导出数据。 在创建好外表后,通过INSERT语句,将数据快速、高效地导出到数据文件中。 详细内容请参见执行导出。 -
  • 相关概念 数据源文件:存储有数据的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对于数据的内容是无感知的,即认为对象内的数据为无状态的二进制数据。 外表:用于识别数据源文件中的数据。外表中保存了数据源文件的位置、文件格式、存放位置、编码格式、数据间的分隔符等信息。
  • 导出文件的命名规则 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文件。
  • 获取源数据的OBS路径并设置读取权限 登录OBS管理控制台。 单击“服务列表”,选择“对象存储服务”,打开OBS管理控制台页面。 获取数据源文件的OBS路径。 数据源文件在上传到OBS桶之后,会生成全局唯一的访问路径。在创建外表时需要指定数据源文件的OBS路径。 如何查看OBS路径,请参见《对象存储服务控制台指南》的通过对象URL访问对象章节。 例如,在本例中,查看到数据文件的OBS路径分别为: 12 https://obs.cn-north-1.myhuaweicloud.com/mybucket/demo.db/product_info_orc/product_info.0https://obs.cn-north-1.myhuaweicloud.com/mybucket/demo.db/product_info_orc/product_info.1 为用户设置OBS桶的读取权限。 在使用SQL on OBS功能时,执行该功能的用户需要取得数据源文件所在OBS桶的读取权限。通过配置桶的ACL权限,可以将读取权限授予指定的用户帐号。 具体请参见《对象存储服务控制台指南》中的配置桶ACL章节。
共100000条