开发者社区> 问答> 正文

快速入门SQL Server版-初始化配置-使用 oss_fdw 读写外部数据文本文件


阿里云支持通过oss_fdw插件将OSS中的数据加载到PostgreSQL和PPAS数据库中,也支持将PostgreSQL和PPAS数据库中的数据写入OSS中。

oss_fdw 参数


oss_fdw和其他fdw接口一样,对外部数据OSS中的数据进行封装。用户可以像使用数据表一样通过oss_fdw读取OSS中存放的数据。oss_fdw提供独有的参数用于连接和解析OSS上的文件数据。
[tr=transparent] [/url]说明[tr=transparent]oss_flush_block_size和oss_flush_block_size两个参数对导入模式无效。

辅助函数


FUNCTION oss_fdw_list_file (relname text, schema text DEFAULT ‘public’)

select * from oss_fdw_list_file('t_oss');              name              |   size--------------------------------+----------- oss_test/test.gz.1  | 739698350 oss_test/test.gz.2  | 739413041 oss_test/test.gz.3  | 739562048(3 rows)

辅助功能


oss_fdw.rds_read_one_file:在读模式下,指定某个外表匹配的文件。设置后,该外部表在数据导入中只匹配被设置的一个文件。
例如,set oss_fdw.rds_read_one_file = ‘oss_test/example16.csv.1’;set oss_fdw.rds_read_one_file = 'oss_test/test.gz.2';select * from oss_fdw_list_file('t_oss');              name              |   size--------------------------------+-----------  oss_test/test.gz.2  | 739413041(1 rows)

oss_fdw用例

# 创建插件create extension oss_fdw;# 创建 server CREATE SERVER ossserver FOREIGN DATA WRAPPER oss_fdw OPTIONS(host 'oss-cn-hangzhou.aliyuncs.com' , id 'xxx', key 'xxx',bucket 'mybucket');# 创建 oss 外部表CREATE FOREIGN TABLE ossexample(date text, time text, open float,high float, low float, volume int)SERVER ossserverOPTIONS ( filepath 'osstest/example.csv', delimiter ',' ,format 'csv', encoding 'utf8', PARSE_ERRORS '100');# 创建表,数据就装载到这张表中create table example(date text, time text, open float,high float, low float, volume int);# 数据从 ossexample 装载到 example 中。insert into example select * from ossexample;# 可以看到# oss_fdw 能够正确估计 oss 上的文件大小,正确的规划查询计划。explain insert into example select * from ossexample;QUERY PLAN---------------------------------------------------------------------Insert on example  (cost=0.00..1.60 rows=6 width=92)->  Foreign Scan on ossexample  (cost=0.00..1.60 rows=6 width=92)Foreign OssFile: osstest/example.csv.0Foreign OssFile Size: 728(4 rows)# 表 example 中的数据写出到 OSS 中。insert into ossexample select * from example;explain insert into ossexample select * from example;QUERY PLAN-----------------------------------------------------------------Insert on ossexample  (cost=0.00..16.60 rows=660 width=92)->  Seq Scan on example  (cost=0.00..16.60 rows=660 width=92)(2 rows)

oss_fdw 注意事项


  • oss_fdw是在PostgreSQL FOREIGN TABLE框架下开发的外部表插件。

  • 数据导入的性能和PostgreSQL集群的资源(CPU IO MEM MET)相关,也和OSS相关。

  • 为保证数据导入的性能,请确保云数据库PostgreSQL与OSS所在Region相同,相关信息请参考[url=https://help.aliyun.com/document_detail/oss/user_guide/oss_concept/endpoint.html]OSS endpoint 信息。

  • 如果读取外表的SQL时触发 ERROR: oss endpoint userendpoint not in aliyun white list, 建议使用阿里云各可用区公共 endpoint。如果问题仍无法解决,请通过工单反馈。


错误处理


导入或导出出错时,日志中会出现下列错误提示信息:

  • code:出错请求的HTTP状态码。

  • error_code:OSS的错误码。

  • error_msg:OSS的错误信息。

  • req_id:标识该次请求的UUID。当您无法解决问题时,可以凭req_id来请求OSS开发工程师的帮助。

请参考以下链接中的文档了解和处理各类错误,超时相关的错误可以使用oss_ext相关参数处理。

id和key隐藏


CREATE SERVER中的id和key信息如果不做任何处理,用户可以使用select * from pg_foreign_server看到明文信息,会暴露用户的id和key。我们通过对id和key进行对称加密实现对id和key的隐藏(不同的实例使用不同的密钥,最大限度保护用户信息),但无法使用类似GP一样的方法,增加一个数据类型,会导致老实例不兼容。
最终的加密后的信息如下:postgres= # select * from pg_foreign_server ;srvname  | srvowner | srvfdw | srvtype | srvversion | srvacl |                                                                               srvoptions-----------+----------+--------+---------+------------+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------ossserver |        10 |   16390 |          |             |         | {host=oss-cn-hangzhou-zmf.aliyuncs.com,id=MD5xxxxxxxx,key=MD5xxxxxxxx,bucket=067862}
加密后的信息将会以MD5开头(总长度为len%8==3),这样导出之后再导入不会再次加密,但是用户不能创建MD5开头的key和id。

展开
收起
梨好橙 2018-08-31 23:14:03 1757 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载