华为云用户手册

  • 示例 示例一:执行gs_dumpall,导出所有数据库全量信息(dbadmin用户为管理员用户),导出文件为文本格式。执行命令后,会有很长的打印信息,最终出现total time即代表执行成功。示例中将不体现中间的打印信息。 gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_backup.sql -p 8000 -h 10.10.10.100 gs_dumpall[port=''][2017-07-21 15:57:31]: dumpall operation successful gs_dumpall[port=''][2017-07-21 15:57:31]: total time: 9627 ms 示例二:执行gs_dumpall,仅导出所有数据库定义(dbadmin用户为管理员用户),导出文件为文本格式。执行命令后,会有很长的打印信息,最终出现total time即代表执行成功。示例中将不体现中间的打印信息。 gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_backup.sql -p 8000 -h 10.10.10.100 -s gs_dumpall[port=''][2018-11-14 11:28:14]: dumpall operation successful gs_dumpall[port=''][2018-11-14 11:28:14]: total time: 4147 ms 示例三:执行gs_dumpall,仅导出所有数据库中数据,并对导出文件进行加密,导出文件为文本格式。执行命令后,会有很长的打印信息,最终出现total time即代表执行成功。示例中将不体现中间的打印信息。 gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_backup.sql -p 8000 -h 10.10.10.100 -a --with-encryption AES128 --with-key 1234567812345678 gs_dumpall[port=''][2018-11-14 11:32:26]: dumpall operation successful gs_dumpall[port=''][2018-11-14 11:23:26]: total time: 4147 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 p gs_dump[port=''][human_resource][2017-07-21 17:05:10]: dump database human_resource successfully gs_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 successfully gs_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 successfully gs_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 c gs_dump[port=''][human_resource][2017-07-21 17:14:11]: dump database human_resource successfully gs_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 p gs_dump[port=''][human_resource][2017-07-21 17:19:42]: dump database human_resource successfully gs_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 p gs_dump[port=''][human_resource][2017-07-21 17:21:02]: dump database human_resource successfully gs_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 t gs_dump[port=''][human_resource][2018-11-14 11:32:02]: dump database human_resource successfully gs_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 p gs_dump[port=''][human_resource][2018-11-14 11:35:30]: dump database human_resource successfully gs_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 c gs_dump[port=''][human_resource][2018-12-13 09:40:24]: dump database human_resource successfully gs_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 d gs_dump[port=''][jack][2018-11-14 17:21:18]: dump database human_resource successfully gs_dump[port=''][jack][2018-11-14 17:21:23]: total time: 4239 ms
  • 示例 示例一:执行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 p gs_dump[port=''][human_resource][2017-07-21 16:05:55]: dump database human_resource successfully gs_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 t gs_dump[port=''][human_resource][2018-11-14 15:07:16]: dump database human_resource successfully gs_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 d gs_dump[port=''][human_resource][2018-11-14 15:11:34]: dump database human_resource successfully gs_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 c gs_dump[port=''][human_resource][2017-07-21 16:06:31]: dump database human_resource successfully gs_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 t gs_dump[port=''][human_resource][2017-07-21 16:07:16]: dump database human_resource successfully gs_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 c gs_dump[port=''][human_resource][2017-07-21 16:07:55]: dump database human_resource successfully gs_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 c gs_dump[port=''][human_resource][2018-12-13 09:40:24]: dump database human_resource successfully gs_dump[port=''][human_resource][2018-12-13 09:40:24]: total time: 896 ms
  • 示例 示例一:执行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 p gs_dump[port=''][gaussdb][2017-07-21 15:36:13]: dump database gaussdb successfully gs_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 c gs_dump[port=''][gaussdb][2017-07-21 15:36:13]: dump database gaussdb successfully gs_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 p gs_dump[port=''][gaussdb][2017-07-20 15:04:14]: dump database gaussdb successfully gs_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 p gs_dump[port=''][gaussdb][2018-11-14 11:25:18]: dump database gaussdb successfully gs_dump[port=''][gaussdb][2018-11-14 11:25:18]: total time: 1161 ms
  • 注意事项 禁止修改导出的文件和内容,否则可能无法恢复成功。 为了保证数据一致性和完整性,导出工具会对需要转储的表设置共享锁。如果表在别的事务中设置了共享锁,gs_dump和gs_dumpall会等待锁释放后锁定表。如果无法在指定时间内锁定某个表,转储会失败。用户可以通过指定--lock-wait-timeout选项,自定义等待锁超时时间。 由于gs_dumpall读取所有数据库中的表,因此必须以数据库集群管理员身份进行连接,才能导出完整文件。在使用gsql执行脚本文件导入时,同样需要管理员权限,以便添加用户和组,以及创建数据库。 由于 GaussDB (DWS)数据库所有视图的定义都默认带有表名或别名的前缀(即tab.col的形式),因此可能与原始定义不符,导致在极少的场景下会发生重建视图字段对应基表不准确而报错的情况。为避免此情况建议在导出视图定义时,设置guc参数behavior_compat_options='compat_display_ref_table',使导出定义与原始语句一致。
  • 使用 CDM 迁移数据到GaussDB(DWS) 使用 云数据迁移 服务(Cloud Data Migration,简称CDM),可以将其他数据源(例如MySQL)的数据迁移到GaussDB(DWS) 集群的数据库中。 使用CDM迁移数据到GaussDB(DWS)的典型场景,请参见云数据迁移服务(简称CDM)的如下章节: 入门:该入门场景为使用CDM迁移本地MySQL数据库到GaussDB(DWS) 图1 使用CDM迁移数据到GaussDB(DWS) 父主题: 整库迁移
  • 使用DRS将数据导入GaussDB(DWS) 使用 数据复制服务 (Data Replication Service,简称DRS),可以将其他数据源的数据导入到GaussDB(DWS)集群的数据库中。当前支持导入的数据源主要包括以下: MySQL DDM PostgreSQL(公测) Oracle(公测) GaussDB分布式版(公测) 请参见DRS实时同步章节。 其中PostgreSQL、Oracle、GaussDB分布式版的数据源属于公测阶段,请移步到DRS管理控制台,通过新建工单方式申请公测。 父主题: 实时入库
  • 常用方法 表1 CopyManager常用方法 返回值 方法 描述 throws CopyIn copyIn(String sql) - SQLException long copyIn(String sql, InputStream from) 使用COPY FROM STDIN从InputStream中快速向数据库中的表导入数据。 SQLException,IOException long copyIn(String sql, InputStream from, int bufferSize) 使用COPY FROM STDIN从InputStream中快速向数据库中的表导入数据。 SQLException,IOException long copyIn(String sql, Reader from) 使用COPY FROM STDIN从Reader中快速向数据库中的表导入数据。 SQLException,IOException long copyIn(String sql, Reader from, int bufferSize) 使用COPY FROM STDIN从Reader中快速向数据库中的表导入数据。 SQLException,IOException CopyOut copyOut(String sql) - SQLException long copyOut(String sql, OutputStream to) 将一个COPY TO STDOUT的结果集从数据库发送到OutputStream类中。 SQLException,IOException long copyOut(String sql, Writer to) 将一个COPY TO STDOUT的结果集从数据库发送到Writer类中。 SQLException,IOException
  • 关于COPY FROM STDIN导入数据 这种方式适合数据写入量不太大, 并发度不太高的场景。 用户可以使用以下方式通过COPY FROM STDIN语句直接向GaussDB(DWS)写入数据。 通过键盘输入向GaussDB(DWS)写入数据。 通过JDBC驱动的CopyManager接口从文件或者数据库向GaussDB(DWS)写入数据。此方法支持COPY语法中copy option的所有参数。 父主题: 使用COPY FROM STDIN导入数据
  • \copy命令 \copy命令格式以及说明参见表 1 \copy元命令说明。 表1 \copy元命令说明 语法 说明 \copy { table [ ( column_list ) ] | ( query ) } { from | to } { filename | stdin | stdout | pstdin | pstdout } [ with ] [ binary ] [ oids ] [ delimiter [ as ] 'character' ] [ null [ as ] 'string' ] [ csv [ header ] [ quote [ as ] 'character' ] [ escape [ as ] 'character' ] [ force quote column_list | * ] [ force not null column_list ] ] 在任何gsql客户端登录数据库成功后,可以使用该命令进行数据的导入/导出。但是与SQL的COPY命令不同,该命令读取/写入的文件是本地文件,而非数据库服务器端文件;所以,要操作的文件的可访问性、权限等,都是受限于本地用户的权限。 说明: \COPY只适合小批量,格式良好的数据导入,容错能力较差。导入数据应优先选择GDS或COPY。
  • 操作步骤 假设远端集群的待同步表名称是tbl_remote,用于数据同步的用户是user_remote,该用户须对表tbl_remote有访问权限;假设本地集群的待同步表名称是tbl_local。 创建server。 CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS( address '192.168.178.207:8000', dbname 'db_remote', username 'user_remote', password 'xxxxxxxx', syncsrv 'gsfs://192.168.178.129:5000|gsfs://192.168.178.129:5000' ); server_remote为server名称,供互联互通外表使用。 address为远端集群CN的IP地址和端口,仅允许填写一个地址。 dbname为远端集群的数据库名。 username为连接远端集群使用的用户名,注意该用户不能为系统管理员。 password为连接远端集群使用的用户名的密码。 syncsrv为GDS Server的IP地址和端口,如果有多个地址使用|分割,与GDS外表的location类似。 GaussDB(DWS)会对syncsrv所设置的GDS地址进行网络连接测试: 只能判断本地执行集群与GDS的网络情况,无法判断远端集群与GDS的网络情况,需要注意报错提示。 在移除不可用GDS后,从中选择不会导致业务hang的、数目适当的GDS进行数据同步。 创建互联互通外表。 CREATE FOREIGN TABLE ft_tbl( col_1 type_name, col_2 type_name, … ) SERVER server_remote OPTIONS ( schema_name 'schema_remote', table_name 'tbl_remote', encoding 'utf8' ); schema_name为远端集群表所属schema,如果该option缺省,则schema_name预设为该外表所在的schema。 table_name为远端集群表名,如果该option缺省,则table_name预设为该外表的表名。 encoding为远端集群的编码,如果该option缺省,则编码使用本地集群数据库的默认编码。 选项schema_name、table_name大小写敏感,必须与远端schema、table的名字大小写保持一致。 互联互通外表的列不允许带任何约束。 互联互通外表的列名、列类型必须与远端集群的表tbl_remote的列名和列类型完全一致。 SERVER须设置为步骤1中新建的server,必须包含syncsrv属性。 使用互联互通外表进行数据同步。 本地集群是目标集群时,发起数据同步业务: 全列全量数据同步: 1 INSERT INTO tbl_local SELECT * FROM ft_tbl; 全列过滤条件数据同步: 1 INSERT INTO tbl_local SELECT * FROM ft_tbl WHERE col_2 = XX; 部分列全量数据同步: 1 INSERT INTO tbl_local (col_1) SELECT col_1 FROM ft_tbl; 部分列过滤条件数据同步: 1 INSERT INTO tbl_local (col_1) SELECT col_1 FROM ft_tbl WHERE col_2 = XX; 本地集群是源集群时,发起数据同步业务: 单表数据同步: 1 INSERT INTO ft_tbl SELECT * FROM tbl_local; join结果集数据同步: 1 INSERT INTO ft_tbl SELECT * FROM tbl_local1 join tbl_local2 ON XXX; 如遇到报错连接失败,请检查server的信息确认两个集群是否已经相互连通。 如遇到报错GDS连接失败,请检查syncsrv指定的GDS Server是否都已经启动,且与两个集群所有节点可以网络连通。 如遇到报错表不存在,请检查外表的option信息是否正确。 如遇到报错列不存在,请检查外表的列名是否与源表一致。 如遇到报错列重复定义,请检查是否相应列名超长,若超长建议使用AS别名精简。 如遇到报错无法解析列类型,请检查语句中是否有列上表达式。 如遇到报错列信息不匹配,请检查外表的列信息是否与远端集群对应表的列信息是否一致。 如遇到报错语法不支持,请检查是否使用了Join、distinct、排序等复杂用法。 如遇到乱码,请检查两端数据库的实际编码是否一致。 当本地集群是源集群时,存在极小的概率出现数据成功同步到远端集群,但是本地集群返回执行失败的情况,针对这种情况建议校验同步数据记录数。 当本地集群是源集群时,通过事务块、子事务等控制的数据同步,需要总事务提交后才能查询到数据同步结果。 删除互联互通外表。 DROP FOREIGN TABLE ft_tbl;
  • 使用场景 将数据从一个集群同步到另外一个集群,支持全量数据同步、过滤条件数据同步。 目前互联互通仅支持以下使用方式,除以下语句外,其他类型的语法均不支持。 INSERT INTO 内表 SELECT ... FROM 互联互通外表1 [WHERE]; INSERT INTO 互联互通表 SELECT * FROM 内表1 [JOIN 内表2 | WHERE]; SELECT ... FROM 互联互通表;
  • 注意事项 创建的互联互通外表与其对应的远端表的列名和类型名要完全一致,且远端表的类型为行存表或列存表。 执行同步语句时,要确保本地集群、远端集群的待同步表已存在。 使用期间,两个集群的状态应为Normal。 两个集群都需要具备基于GDS的跨集群互联互通功能。 建议两端集群的数据库编码保持一致,否则可能出现报错或者收到的数据为乱码。 两端集群所指定的数据库兼容类型要保持一致,否则可能报错或乱码。 确保执行数据同步的相关用户对待同步表有相应的访问权限。 互联互通外表只能用于跨集群数据同步场景,其他场景可能出错或无效。 互联互通外表不支持复杂的列上表达式,不支持复杂语法,包括join、排序、游标、with、集合等。 不下推的SQL语句无法使用本特性进行数据同步,否则会报错。 不支持EXPLAIN计划、逻辑集群。 不支持除了simple模式以外的JDBC模式。 当本地集群同步数据到远端集群时,只支持内表查询。 Foreign Server的syncsrv选项指定的GDS不支持SSL模式。 数据同步结束时只校验数据行数,不校验数据内容。 业务最大并发数不能大于GDS启动参数-t的一半,同时也不能大于max_active_statements,否则可能会导致业务超时失败。
  • 使用前准备 配置两个集群互连。 规划部署GDS服务器,确保所有的GDS服务器可以和上面配置的两个集群所有节点网络连通,即GDS服务器的安全组入方向要放通对应的GDS端口(例如5000)和DWS端口(默认8000)。部署GDS请参考安装配置和启动GDS。 启动GDS时,可指定任意目录作为数据中转的目录,例如/opt,启动命令示例如下: /opt/gds/bin/gds -d /opt -p 192.168.0.2:5000 -H 192.168.0.1/24 -l /opt/gds/bin/gds_log.txt -D -t 2
  • 注意事项 两个集群必须在同一个Region、一个AZ内且VPC网络互通。 创建的外表与其对应的远端表的列名和类型名要完全一致,且远端表的类型为行存表、列存表、哈希表或者复制表。 如果关联的表在另外一个集群是复制表或者存在数据倾斜,性能可能会很差。 使用期间,两个集群的状态应为“Normal”。 使用期间,禁止对远端集群的源数据表做ddl修改和增、删、改操作,否则可能导致查询结果不一致。 两个集群都需要具备基于Foreign Table的SQL on other GaussDB数据处理功能。 保证两端数据库的编码相同,否则可能出现报错或者收到的数据为乱码。 如果远端表已经做过统计信息收集,可以对外表执行analyze以获得更优的执行计划。 仅支持8.0.0及以上版本。
  • 操作步骤 创建server。 1 2 3 4 5 6 CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS (address '10.180.157.231:8000,10.180.157.130:8000' , dbname 'gaussdb', username 'xyz', password 'xxxxxx' ); server_remote为server名字,供外表使用。 address为远端集群CN的地址和端口号,如配置LVS,推荐只填写一个LVS地址,如未配置,推荐使用多个CN作为server的地址。 dbname为远端集群的数据库名。 username为连接远端集群使用的用户名,注意该用户不能为系统管理员。 password为连接远端集群使用的用户名的密码。 创建外表。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE FOREIGN TABLE region ( R_REGIONKEY INT4, R_NAME TEXT, R_COMMENT TEXT ) SERVER server_remote OPTIONS ( schema_name 'test', table_name 'region', encoding 'gbk' ); 外表的列不允许带任何约束。 外表的列名和列的类型要与远端集群对应的表的列名和列的类型完全一致。 schema_name为远端集群对应的表所在的schema,如果该option省略,则schema_name预设该外表所在的schema。 table_name为远端集群对应的表所在的表名,如果该option省略,则table_name预设该外表的表名。 encoding为远端集群的编码,如果该option省略,则编码使用远端集群数据库的默认编码。 查看建立的外表。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \d+ region Foreign table "public.region" Column | Type | Modifiers | FDW Options | Storage | Stats target | Description -------------+---------+-----------+-------------+----------+--------------+------------- r_regionkey | integer | | | plain | | r_name | text | | | extended | | r_comment | text | | | extended | | Server: server_remote FDW Options: (schema_name 'test', table_name 'region', encoding 'gbk') FDW permition: read only Has OIDs: no Distribute By: ROUND ROBIN Location Nodes: ALL DATANODES 查看建立的server。 1 2 3 4 5 6 7 8 9 \des+ server_remote List of foreign servers Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | FDW Options | Description ---------------+---------+----------------------+-------------------+------+---------+----------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------+------------- server_remote | dbadmin | gc_fdw | | | | (address '10.180.157.231:8000,10.180.157.130:8000', dbname 'gaussdb' , username 'xyz', password 'xxxxxx') | (1 row) 使用外表进行导入数据或者关联查询。 导入数据。 1 2 3 4 5 6 7 CREATE TABLE local_region ( R_REGIONKEY INT4, R_NAME TEXT, R_COMMENT TEXT ); INSERT INTO local_region SELECT * FROM region; 如遇到报错连接失败,请检查server的信息确认两个集群是否已经相互连通。 如遇到报错表不存在,请检查外表的option信息是否正确。 如遇到报错列信息不匹配,请检查外表的列信息是否与远端集群对应表的列信息是否一致。 如遇到报错版本不一致,请升级低版本的集群再继续使用。 如遇到乱码,请检查数据源的实际编码方式,并重新创建外表指定正确的编码。 关联查询。 1 SELECT * FROM region, local_region WHERE local_region.R_NAME = region.R_NAME; 外表可以当做一个本地表来使用,执行复杂的作业。 如果远端集群已经有统计信息,请对该外表执行analyze以获得更优的执行计划。 如果本地集群的DN数量比远端集群的DN数量少,本地集群需要使用SMP来获得更佳的性能。 删除外表。 1 DROP FOREIGN TABLE region;
  • 删除手动创建的外部服务器 如果执行了手动创建外部服务器,请按照以下步骤删除外部服务器、数据库和用户。 使用创建外部服务器的用户通过GaussDB(DWS)提供的数据库客户端连接到外部服务器所在的数据库。 例如,使用gsql客户端的用户可以通过以下两种方法中的一种进行连接: 如果已经登录了gsql客户端,可以执行以下命令进行切换: 1 \c mydatabase dbuser; 根据提示输入密码。 如果已经登录了gsql客户端,您也可以执行\q退出gsql后,再执行以下命令重新进行连接: 1 gsql -d mydatabase -h 192.168.2.30 -U dbuser -p 8000 -r 根据提示输入密码。 删除手动创建的外部服务器。 执行以下命令进行删除,详细语法请参见DROP SERVER: 1 DROP SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca; 返回以下信息表示删除成功: 1 DROP SERVER 查看外部服务器: 1 SELECT * FROM pg_foreign_server WHERE srvname='hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca'; 返回结果如下所示,表示已经删除成功: 1 2 3 srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions ---------+----------+--------+---------+------------+--------+------------ (0 rows) 删除自定义数据库。 通过GaussDB(DWS)提供的数据库客户端连接默认数据库postgres。 如果已经登录了gsql客户端,可以直接执行如下命令进行切换: 1 \c postgres 根据界面提示输入密码。 执行以下命令,删除自定义数据库: 1 DROP DATABASE mydatabase; 返回以下信息表示删除成功: 1 DROP DATABASE 使用管理员用户,删除本示例中创建的普通用户。 使用数据库管理员用户通过GaussDB(DWS)提供的数据库客户端连接数据库。 如果已经登录了gsql客户端,可以直接执行如下命令进行切换: 1 \c postgres dbadmin 执行以下命令回收创建外部服务器的权限: 1 REVOKE ALL ON FOREIGN DATA WRAPPER hdfs_fdw FROM dbuser; 其中FOREIGN DATA WRAPPER的名字只能是hdfs_fdw,dbuser为创建SERVER的用户名。 执行以下命令删除用户: 1 DROP USER dbuser; 可使用\du命令查询用户,确认用户是否已经删除。
  • 错误处理 数据导入过程中,对于如下错误信息,表示GaussDB(DWS)期望读取ORC数据文件,但实际却是*.txt类型的数据文件。请先参见在 MRS 集群上创建Hive ORC表创建Hive ORC类型的表,并将数据存储到该Hive ORC表中。 ERROR: dn_6009_6010: Error occurs while creating an orc reader for file /user/hive/warehouse/products_info.txt, detail can be found in dn log of dn_6009_6010.
  • 导入数据后查询数据 也可以将MRS数据导入GaussDB(DWS)后,再查询数据。 在GaussDB(DWS)数据库中,创建导入数据的目标表,用于存储导入的数据。 该表的表结构必须与创建外表中创建的外表的表结构保持一致,即字段个数、字段类型要完全一致。 例如,创建一个名为product_info的表,示例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 DROP TABLE IF EXISTS product_info; CREATE TABLE product_info ( product_price integer , 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) ) with ( orientation = column, compression=middle ) DISTRIBUTE BY HASH (product_id); 执行“INSERT INTO .. SELECT ..”命令从外表导入数据到目标表。 示例: 1 INSERT INTO product_info SELECT * FROM foreign_product_info; 若出现以下类似信息,说明数据导入成功。 INSERT 0 20 执行SELECT命令,查看从MRS导入到GaussDB(DWS)中的数据。 1 SELECT * FROM product_info; 查询结果显示如数据文件中所示的数据,表示导入成功。查询结果的结尾将显示以下信息: (20 rows)
  • 数据类型转换说明 当前用户导入到Hive/Spark的数据在HDFS存储为ORC文件格式,GaussDB(DWS)实际读取HDFS中的ORC文件,并对文件内的数据进行查询分析。 由于Hive/Spark支持的数据类型与GaussDB(DWS)自身支持的数据类型存在差异,在创建外表定义表字段时,您需要了解这两者之间数据类型的对应关系,具体如表1所示: 表1 数据类型匹配表 类型名称 GaussDB(DWS)的HDFS/OBS外表支持的字段类型 Hive表字段类型 Spark表字段类型 2字节整数 SMALLINT SMALLINT SMALLINT 4字节整数 INTEGER INT INT 8字节整数 BIGINT BIGINT BIGINT 单精度浮点数 FLOAT4 (REAL) FLOAT FLOAT 双精度浮点型 FLOAT8(DOUBLE PRECISION) DOUBLE FLOAT 科学数据类型 DECIMAL[p (,s)] 最大支持38位精度 DECIMAL 最大支持38位(Hive 0.11) DECIMAL 日期类型 DATE DATE DATE 时间类型 TIMESTAMP TIMESTAMP TIMESTAMP Boolean类型 BOOLEAN BOOLEAN BOOLEAN Char类型 CHAR(n) CHAR (n) STRING VarChar类型 VARCHAR(n) VARCHAR (n) VARCHAR (n) 字符串 TEXT(CLOB) STRING STRING
  • 创建外表 当完成获取MRS数据源连接的外部服务器信息和获取MRS数据源的HDFS路径后,就可以创建一个外表,用于读取MRS数据源数据。 创建外表的语法格式如下,详细的描述请参见(CREATE FOREIGN TABLE (SQL on Hadoop or OBS))。 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 ] ] ; 例如,创建一个名为"foreign_product_info"的外表,对语法中的参数按如下描述进行设置: table_name 必选。外表的表名。 表字段定义 column_name:外表中的字段名。 type_name:字段的数据类型。 多个字段用“,”隔开。 外表的字段个数和字段类型,需要与MRS上保存的数据完全一致。定义字段的数据类型之前,您必须先了解数据类型转换说明。 SERVER dfs_server 外表的外部服务器名称,这个server必须存在。外表通过设置外部服务器,从而关联MRS数据源连接并从MRS集群读取数据。 此处应填写为通过获取MRS数据源连接的外部服务器信息查询到的“srvname”字段的值。 OPTIONS参数 用于指定外表数据的各类参数,关键参数如下所示。 format:必选参数。取值只支持“orc”。表示数据源文件的格式,只支持Hive的ORC数据文件。 foldername:必选参数。表示数据在HDFS的存储目录或数据文件路径。 如果是启用了Kerberos认证的MRS分析集群,请确保MRS数据源连接的MRS用户,拥有此目录的读取权限。 请按照获取MRS数据源的HDFS路径中的步骤获取HDFS路径,该路径作为foldername的参数值。 encoding:可选参数。外表中数据源文件的编码格式名称,缺省为utf8。 DISTRIBUTE BY 表示外表的数据读取方式。有以下两种方式供选择,在本例中选择ROUNDROBIN。 ROUNDROBIN:表示外表在从数据源读取数据时,GaussDB(DWS)集群每一个节点读取随机一部分数据,并组成完整数据。 REPLICATION:表示外表在从数据源读取数据时,GaussDB(DWS)集群每一个节点都读取一份完整数据。 语法中的其他参数 其他参数均为可选参数,用户可以根据自己的需求进行设置,在本例中不需要设置。 根据以上信息,创建外表命令如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 DROP FOREIGN TABLE IF EXISTS foreign_product_info; CREATE FOREIGN TABLE foreign_product_info ( 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 hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca OPTIONS ( format 'orc', encoding 'utf8', foldername '/user/hive/warehouse/demo.db/product_info_orc/' ) DISTRIBUTE BY ROUNDROBIN;
  • 获取MRS数据源连接的外部服务器信息 使用创建外部服务器的用户去连接其对应的数据库。 是否使用普通用户在自定义数据库中创建外表,请根据需求进行选择: 是 请先确保,您已按照手动创建外部服务器章节中的步骤,创建了普通用户dbuser和它的数据库mydatabase,并在mydatabase中手动创建了一个外部服务器。 使用用户dbuser通过GaussDB(DWS)提供的数据库客户端连接数据库mydatabase。 如果已经使用gsql客户端连接至数据库,可以直接执行如下命令进行用户和数据库切换: 1 \c mydatabase dbuser; 根据界面提示输入密码。 否 当您通过GaussDB(DWS)管理控制台创建MRS数据源连接时,数据库管理员dbadmin会在默认数据库postgres中自动创建一个外部服务器。因此,如果使用数据库管理员dbadmin在默认数据库postgres中创建外表,需要通过GaussDB(DWS)提供的数据库客户端工具连接数据库。例如,使用gsql客户端的用户通过如下命令连接数据库: 1 gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -W password -r 执行以下命令,查看已创建的MRS数据源连接的外部服务器信息。 1 SELECT * FROM pg_foreign_server; 也可以执行\desc+命令查看外部服务器信息。 返回结果如下: 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的值。
  • 手动创建外部服务器 使用数据库管理员通过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,然后使用管理员用户授予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 9 10 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,hu obinru=C/Ruby} mydatabase | 17000 | 0 | C | C | f | t | -1 | 14146 | 1351 | 1663 | ORA | (4 rows) 使用管理员用户给普通用户赋予创建外部服务器的权限和使用外表的权限。 使用数据库管理员用户通过数据库客户端连接新建的数据库。 例如,使用gsql客户端的用户可以直接使用如下语句切换为管理员用户去连接新建的数据库: 1 \c mydatabase dbadmin; 根据提示输入用户密码。 注意,必须先使用管理员用户连接到将要创建外部服务器和使用外表的数据库,再对普通用户进行授权。 默认只有系统管理员才可以创建外部服务器,普通用户需要授权才可以创建,执行以下命令授权: 1 GRANT ALL ON FOREIGN DATA WRAPPER hdfs_fdw TO dbuser; 其中FOREIGN DATA WRAPPER的名字只能是hdfs_fdw,dbuser为创建SERVER的用户名。 执行以下命令赋予用户使用外表的权限: 1 ALTER USER dbuser USEFT; 查看用户: 1 2 3 4 5 6 7 8 9 10 11 12 13 SELECT r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, r.rolconnlimit, r.rolvalidbegin, r.rolvaliduntil, ARRAY(SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid) as memberof , r.rolreplication , r.rolauditadmin , r.rolsystemadmin , r.roluseft FROM pg_catalog.pg_roles r ORDER BY 1; 返回结果中,dbuser的信息中包含了UseFT权限,表示授权成功: 1 2 3 4 5 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
  • 数据文件 假设有数据文件product_info.txt,示例数据如下所示: 100,XHDK-A-1293-#fJ3,2017-09-01,A,2017 Autumn New Shirt Women,red,M,328,2017-09-04,715,good 205,KDKE-B-9947-#kL5,2017-09-01,A,2017 Autumn New Knitwear Women,pink,L,584,2017-09-05,406,very good! 300,JODL-X-1937-#pV7,2017-09-01,A,2017 autumn new T-shirt men,red,XL,1245,2017-09-03,502,Bad. 310,QQPX-R-3956-#aD8,2017-09-02,B,2017 autumn new jacket women,red,L,411,2017-09-05,436,It's really super nice 150,ABEF-C-1820-#mC6,2017-09-03,B,2017 Autumn New Jeans Women,blue,M,1223,2017-09-06,1200,The seller's packaging is exquisite 200,BCQP-E-2365-#qE4,2017-09-04,B,2017 autumn new casual pants men,black,L,997,2017-09-10,301,The clothes are of good quality. 250,EABE-D-1476-#oB1,2017-09-10,A,2017 autumn new dress women,black,S,841,2017-09-15,299,Follow the store for a long time. 108,CDXK-F-1527-#pL2,2017-09-11,A,2017 autumn new dress women,red,M,85,2017-09-14,22,It's really amazing to buy 450,MMCE-H-4728-#nP9,2017-09-11,A,2017 autumn new jacket women,white,M,114,2017-09-14,22,Open the package and the clothes have no odor 260,OCDA-G-2817-#bD3,2017-09-12,B,2017 autumn new woolen coat women,red,L,2004,2017-09-15,826,Very favorite clothes 980,ZKDS-J-5490-#cW4,2017-09-13,B,2017 Autumn New Women's Cotton Clothing,red,M,112,2017-09-16,219,The clothes are small 98,FKQB-I-2564-#dA5,2017-09-15,B,2017 autumn new shoes men,green,M,4345,2017-09-18,5473,The clothes are thick and it's better this winter. 150,DMQY-K-6579-#eS6,2017-09-21,A,2017 autumn new underwear men,yellow,37,2840,2017-09-25,5831,This price is very cost effective 200,GKLW-l-2897-#wQ7,2017-09-22,A,2017 Autumn New Jeans Men,blue,39,5879,2017-09-25,7200,The clothes are very comfortable to wear 300,HWEC-L-2531-#xP8,2017-09-23,A,2017 autumn new shoes women,brown,M,403,2017-09-26,607,good 100,IQPD-M-3214-#yQ1,2017-09-24,B,2017 Autumn New Wide Leg Pants Women,black,M,3045,2017-09-27,5021,very good. 350,LPEC-N-4572-#zX2,2017-09-25,B,2017 Autumn New Underwear Women,red,M,239,2017-09-28,407,The seller's service is very good 110,NQAB-O-3768-#sM3,2017-09-26,B,2017 autumn new underwear women,red,S,6089,2017-09-29,7021,The color is very good 210,HWNB-P-7879-#tN4,2017-09-27,B,2017 autumn new underwear women,red,L,3201,2017-09-30,4059,I like it very much and the quality is good. 230,JKHU-Q-8865-#uO5,2017-09-29,C,2017 Autumn New Clothes with Chiffon Shirt,black,M,2056,2017-10-02,3842,very good
  • 多线程导入 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90,导入的数据源文件格式为 CS V,同时导入2个目标表。 以root用户登录GDS数据服务器,创建数据文件存放目录“/input_data”,以及子目录“/input_data/import1/”和“/input_data/import2/”。 mkdir -p /input_data 将目标表tpcds.reasons1的数据源文件存放在数据服务器“/input_data/import1/”目录下,将目标表tpcds.reasons2的数据源文件存放在目录“/input_data/import2/”下。 (可选)创建用户及其所属的用户组。此用户用于启动GDS。若该用户及所属用户组已存在,可跳过此步骤。 groupadd gdsgrp useradd -g gdsgrp gds_user 修改数据服务器上数据文件及数据文件目录“/input_data”的属主为gds_user。 chown -R gds_user:gdsgrp /input_data 以gds_user用户登录数据服务器上启动GDS。 其中GDS安装路径为“/opt/bin/dws/gds”,数据文件存放在“/input_data/”目录下,数据服务器所在IP为192.168.0.90,GDS监听端口为5000,以后台方式运行,设定并发度为2,并设定递归文件目录。 /opt/bin/dws/gds/bin/gds -d /input_data -p 192.168.0.90:5000 -H 10.10.0.1/24 -D -t 2 -r 使用工具连接数据库。详见连接数据库。 在数据库中创建导入的目标表tpcds.reasons1和tpcds.reasons2。 1 2 3 4 5 6 CREATE TABLE tpcds.reasons1 ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) ; 1 2 3 4 5 6 CREATE TABLE tpcds.reasons2 ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) ; 在数据库中创建外表tpcds.foreign_tpcds_reasons1和tpcds.foreign_tpcds_reasons2用于接收数据服务器上的数据。 以下以外表tpcds.foreign_tpcds_reasons1为例,讲解设置的导入外表参数信息。 其中设置的导入模式信息如下所示: 导入模式为Normal模式。 由于启动GDS时,设置的数据源文件存放目录为“/input_data/”,GDS监听端口为5000,实际存放数据源文件目录为“/input_data/import1/”,所以设置参数“location”为“gsfs://192.168.0.90:5000/import1/*”。 设置的数据格式信息是根据导出时设置的详细数据格式参数信息指定的,参数设置如下所示: 数据源文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 引号字符(quote)为E'\x1b'。 数据文件中空值(null)为没有引号的空字符串。 逃逸字符(escape)默认和quote相同。 数据文件是否包含标题行(header)为默认值false,即导入时数据文件第一行被识别为数据。 设置的导入容错性如下所示: 允许出现的数据格式错误个数(PER NODE REJECT LIMIT 'value')为unlimited,即接受导入过程中所有数据格式错误。 将数据导入过程中出现的数据格式错误信息( LOG INTO error_table_name)写入表err_tpcds_reasons1。 当数据源文件中一行的最后一个字段缺失(fill_missing_fields)时,自动设置为NULL。 根据以上信息,创建的外表tpcds.foreign_tpcds_reasons1如下所示: 1 2 3 4 5 6 CREATE FOREIGN TABLE tpcds.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/import1/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '',fill_missing_fields 'on')LOG INTO err_tpcds_reasons1 PER NODE REJECT LIMIT 'unlimited'; 参考以上设置,创建的外表tpcds.foreign_tpcds_reasons2如下所示: 1 2 3 4 5 6 CREATE FOREIGN TABLE tpcds.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/import2/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '',fill_missing_fields 'on')LOG INTO err_tpcds_reasons2 PER NODE REJECT LIMIT 'unlimited'; 通过外表tpcds.foreign_tpcds_reasons1和tpcds.foreign_tpcds_reasons2将数据分别导入tpcds.reasons1和tpcds.reasons2。 1 INSERT INTO tpcds.reasons1 SELECT * FROM tpcds.foreign_tpcds_reasons1; 1 INSERT INTO tpcds.reasons2 SELECT * FROM tpcds.foreign_tpcds_reasons2; 查询错误信息表err_tpcds_reasons1和err_tpcds_reasons2,处理数据导入错误。详细请参见处理导入错误。 1 2 SELECT * FROM err_tpcds_reasons1; SELECT * FROM err_tpcds_reasons2; 待数据导入完成后,以gds_user用户登录数据服务器,停止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 -D -t 2 -r gds_user 129003 118723 0 15:04 pts/0 00:00:00 grep gds kill -9 128954
  • 集群间不落地数据导入 启动GDS。(如果已经启动跳过此步骤) gds -d /***/gds_data/ -D -p GDS_IP:GDS_PORT -l /***/gds_log/aa.log -H 0/0 -t 10 -D 如果需要设置管道文件的超时时间,则使用--pipe-timeout参数设置。 源数据库数据导出。 登录目标数据库创建内表,并写入数据。 CREATE TABLE test_pipe( id integer not null, gender text not null, name text ); INSERT INTO test_pipe values(1,2,'11111111111111'); INSERT INTO test_pipe values(2,2,'11111111111111'); INSERT INTO test_pipe values(3,2,'11111111111111'); INSERT INTO test_pipe values(4,2,'11111111111111'); INSERT INTO test_pipe values(5,2,'11111111111111'); 创建只写外表。 CREATE FOREIGN TABLE foreign_test_pipe( id integer not null, age text not null, name text ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://GDS_IP:GDS_PORT/', FORMAT 'text', DELIMITER ',', NULL '', EOL '0x0a' ,file_type 'pipe') WRITE ONLY; 导入语句,此时语句会阻塞。 INSERT INTO foreign_test_pipe SELECT * FROM test_pipe; 目标集群导入数据。 创建内表。 CREATE TABLE test_pipe (id integer not null, gender text not null, name text); 创建只读外表。 CREATE FOREIGN TABLE foreign_test_pipe(like test_pipe) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://GDS_IP:GDS_PORT/', FORMAT 'text', DELIMITER ',', NULL '', EOL '0x0a' , file_type 'pipe', auto_create_pipe 'false'); 执行导入语句: INSERT INTO test_pipe SELECT * FROM foreign_test_pipe; 查看目标集群导入语句返回的结果: SELECT * FROM test_pipe; id | gender | name ----+-----+---------------- 3 | 2 | 11111111111111 6 | 2 | 11111111111111 7 | 2 | 11111111111111 1 | 2 | 11111111111111 2 | 2 | 11111111111111 4 | 2 | 11111111111111 5 | 2 | 11111111111111 8 | 2 | 11111111111111 9 | 2 | 11111111111111 (9 rows) GDS默认导出或者导入的管道文件命名规则为:“数据库名_模式名_外表名.pipe”,因此默认需要目标集群与源集群的数据库名及模式名保持一致。如果数据库或模式不一致,则可以在location的url中指定相同的管道文件。 示例: 只写外表指定管道名。 CREATE FOREIGN TABLE foreign_test_pipe(id integer not null, age text not null, name text) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://GDS_IP:GDS_PORT/foreign_test_pipe.pipe', FORMAT 'text', DELIMITER ',', NULL '', EOL '0x0a' ,file_type 'pipe') WRITE ONLY; 只读外表指定管道名。 CREATE FOREIGN TABLE foreign_test_pipe(like test_pipe) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://GDS_IP:GDS_PORT/foreign_test_pipe.pipe', FORMAT 'text', DELIMITER ',', NULL '', EOL '0x0a' ,file_type 'pipe',auto_create_pipe 'false');
  • 多数据服务器并行导入 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90和192.168.0.91。数据源文件格式为CSV。 以root用户登录每台GDS数据服务器,在两台数据服务器上,分别创建数据文件存放目录“/input_data”。以下以IP为192.168.0.90的数据服务器为例进行操作,剩余服务器上的操作与它一致。 mkdir -p /input_data (可选)创建用户及其所属的用户组。此用户用于启动GDS。若该类用户及所属用户组已存在,可跳过此步骤。 groupadd gdsgrp useradd -g gdsgrp gds_user 将准备好的CSV格式数据源文件均匀分发至相应数据服务器的“/input_data”目录中。 修改每台数据服务器上数据文件及数据文件目录“/input_data”的属主为gds_user。以下以IP为192.168.0.90的数据服务器为例,进行操作。 chown -R gds_user:gdsgrp /input_data 以gds_user用户登录每台数据服务器上分别启动GDS。 其中GDS安装路径为“/opt/bin/dws/gds”,数据文件存放在“/input_data/”目录下,数据服务器所在IP为192.168.0.90和192.168.0.91,GDS监听端口为5000,以后台方式运行。 在IP为192.168.0.90的数据服务器上启动GDS。 /opt/bin/dws/gds/bin/gds -d /input_data -p 192.168.0.90:5000 -H 10.10.0.1/24 -D 在IP为192.168.0.91的数据服务器上启动GDS。 /opt/bin/dws/gds/bin/gds -d /input_data -p 192.168.0.91:5000 -H 10.10.0.1/24 -D 使用工具连接数据库。详见连接数据库。 创建导入的目标表tpcds.reasons。 1 2 3 4 5 6 CREATE TABLE tpcds.reasons ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ); 创建外表tpcds.foreign_tpcds_reasons用于接收数据服务器上的数据。 其中设置导入模式信息如下所示: 导入模式为Normal模式。 由于启动GDS时,设置的数据源文件存放目录为“/input_data”,GDS监听端口为5000,所以设置参数“location”为“gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*”。 设置数据格式信息是根据导出时设置的详细数据格式参数信息指定的,参数设置如下所示: 数据源文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 引号字符(quote)为E'\x1b'。 数据文件中空值(null)为没有引号的空字符串。 逃逸字符(escape)默认和quote相同。 数据文件是否包含标题行(header)为默认值false,即导入时数据文件第一行被识别为数据。 设置导入容错性如下所示: 允许出现的数据格式错误个数(PER NODE REJECT LIMIT 'value')为unlimited,即接受导入过程中所有数据格式错误。 将数据导入过程中出现的数据格式错误信息(LOG INTO error_table_name)写入表err_tpcds_reasons。 根据以上信息,创建的外表如下所示: 1 2 3 4 5 6 7 CREATE FOREIGN TABLE tpcds.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/* | gsfs://192.168.0.91:5000/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '', fill_missing_fields 'false') LOG INTO err_tpcds_reasons PER NODE REJECT LIMIT 'unlimited'; 通过外表tpcds.foreign_tpcds_reasons,将数据导入目标表tpcds.reasons。 1 INSERT INTO tpcds.reasons SELECT * FROM tpcds.foreign_tpcds_reasons; 查询错误信息表err_tpcds_reasons,处理数据导入错误。详细请参见处理导入错误。 1 SELECT * FROM err_tpcds_reasons; 待数据导入完成后,以gds_user用户登录每台数据服务器,分别停止GDS。 以下以IP为192.168.0.90的数据服务器为例,停止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 -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
  • 处理数据导入错误 根据获取的错误信息,请对照下表,处理数据导入错误。 表2 处理数据导入错误 错误信息 错误类型 原因 解决办法 missing data for column "r_reason_desc" 格式错误 数据源文件中的列数比外表定义的列数少。 对于TEXT格式的数据源文件,由于转义字符(\)导致delimiter(分隔符)错位或者quote(引号字符)错位造成的错误。 示例:目标表存在3列字段,导入的数据如下所示。由于存在转义字符“\”,分隔符“|”被转义为第二个字段的字段值,导致第三个字段值缺失。 BE|Belgium\|1 由于列数少导致的报错,选择下列办法解决: 在数据源文件中,增加列“r_reason_desc”的字段值。 在创建外表时,将参数“fill_missing_fields”设置为“on”。即当导入过程中,若数据源文件中一行数据的最后一个字段缺失,则把最后一个字段的值设置为NULL,不报错。 对由于转义字符导致的错误,需检查报错的行中是否含有转义字符(\)。若存在,建议在创建外表时,将参数“noescaping”(是否不对'\'和后面的字符进行转义)设置为true。 extra data after last expected column 格式错误 数据源文件中的列数比外表定义的列数多。 在数据源文件中,删除多余的字段值。 在创建外表时,将参数“ignore_extra_data”设置为“on”。即在导入过程中,若数据源文件比外表定义的列数多,则忽略行尾多出来的列。 invalid input syntax for type numeric: "a" 格式错误 数据类型错误。 在数据源文件中,修改输入字段的数据类型。根据此错误信息,请将输入的数据类型修改为numeric。 null value in column "staff_id" violates not-null constraint 非格式错误 非空约束。 在数据源文件中,增加非空字段信息。根据此错误信息,请增加“staff_id”列的值。 duplicate key value violates unique constraint "reg_id_pk" 非格式错误 唯一约束。 删除数据源文件中重复的行。 通过设置关键字“DISTINCT”,从SELECT结果集中删除重复的行,保证导入的每一行都是唯一的。 1 INSERT INTO reasons SELECT DISTINCT * FROM foreign_tpcds_reasons; value too long for type character varying(16) 格式错误 字段值长度超过限制。 在数据源文件中,修改字段值长度。根据此错误信息,字段值长度限制为VARCHAR2(16)。
共100000条