↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

F.14. file_fdw #

file_fdw 模块提供了外部数据包装器 file_fdw,可用于访问服务器文件系统中的数据文件,或者在服务器上执行程序并读取其输出。数据文件或程序输出必须采用 COPY FROM 可读取的格式;详见 COPY。当前对数据文件的访问为只读。

使用此包装器创建的外部表可以具有下列选项:

filename

指定要读取的文件。相对路径以数据目录为基准。必须指定 filename 或 program 之一,但不能同时指定二者。

program

指定要执行的命令。该命令的标准输出会按使用 COPY FROM PROGRAM 时的方式读取。必须指定 program 或 filename 之一,但不能同时指定二者。

format

指定数据格式,与 COPY 的 FORMAT 选项相同。

header

指定数据是否包含标题行,与 COPY 的 HEADER 选项相同。

delimiter

指定数据的定界符字符,与 COPY 的 DELIMITER 选项相同。

quote

指定数据的引用字符,与 COPY 的 QUOTE 选项相同。

escape

指定数据的转义字符,与 COPY 的 ESCAPE 选项相同。

null

指定数据的空值串,与 COPY 的 NULL 选项相同。

encoding

指定数据编码,与 COPY 的 ENCODING 选项相同。

请注意,虽然 COPY 允许诸如 HEADER 这样的选项在没有对应值的情况下指定,但外部表选项语法要求在所有情况下都必须提供一个值。要启用通常写成不带值的 COPY 选项,可以传入值 TRUE,因为所有这类选项都是布尔值。

使用此包装器创建的外部表的列可以具有下列选项:

force_not_null

这是一个布尔选项。如果为真,它指定该列的值不应与空值串(即表级的 null 选项)匹配。其效果与在 COPY 的 FORCE_NOT_NULL 选项中列出该列相同。

force_null

这是一个布尔选项。如果为真,它指定该列中与空值串匹配的值即使带有引号,也会作为 NULL 返回。没有此选项时,只有未加引号且与空值串匹配的值才会作为 NULL 返回。其效果与在 COPY 的 FORCE_NULL 选项中列出该列相同。

file_fdw 当前尚不支持 COPY 的 FORCE_QUOTE 选项。

这些选项只能在外部表或其列上指定,不能在 file_fdw 外部数据包装器的选项中指定,也不能在使用该包装器的服务器或用户映射的选项中指定。

出于安全原因,更改表级选项需要是超级用户,或者拥有角色 pg_read_server_files(使用文件名时)或角色 pg_execute_server_program(使用程序时)的权限:只有特定用户才应能够控制读取哪个文件或运行哪个程序。原则上也可以允许普通用户更改其他选项,但目前尚不支持。

在指定 program 选项时,请记住,该选项字符串会由 shell 执行。如果需要向该命令传递来自不受信任来源的参数,必须谨慎去除或转义任何对 shell 可能具有特殊含义的字符。出于安全原因,最好使用固定的命令字符串,或者至少避免向其中传递任何用户输入。

对于使用 file_fdw 的外部表,EXPLAIN 会显示待读取的文件名或待运行的程序名。对于文件,除非指定 COSTS OFF,否则还会显示文件大小(以字节为单位)。

例 F.1. 为 PostgreSQL CSV 日志创建外部表

file_fdw 的一个明显用途,是将 PostgreSQL 活动日志作为表提供以供查询。要做到这一点,首先必须将日志记录到 CSV 文件中,这里将该文件称为 pglog.csv。首先,将 file_fdw 安装为扩展:

CREATE EXTENSION file_fdw;

然后创建一个外部服务器:

CREATE SERVER pglog FOREIGN DATA WRAPPER file_fdw;

现在就可以创建外部表了。使用 CREATE FOREIGN TABLE 命令时,需要定义该表的列、CSV 文件名及其格式:

CREATE FOREIGN TABLE pglog (
  log_time timestamp(3) with time zone,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint,
  command_tag text,
  session_start_time timestamp with time zone,
  virtual_transaction_id text,
  transaction_id bigint,
  error_severity text,
  sql_state_code text,
  message text,
  detail text,
  hint text,
  internal_query text,
  internal_query_pos integer,
  context text,
  query text,
  query_pos integer,
  location text,
  application_name text,
  backend_type text,
  leader_pid integer,
  query_id bigint
) SERVER pglog
OPTIONS ( filename 'log/pglog.csv', format 'csv' );

到这里就完成了 — 现在可以直接查询日志了。当然,在生产环境中,还需要定义某种方法来处理日志轮转。


报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.