PostgreSQL/Hologres 外部服务器系统表 pg_foreign_server 详解
pg_foreign_server
是 PostgreSQL 和 Hologres 中定义外部数据服务器连接信息的核心系统表,它存储了所有外部服务器的配置信息。
表结构定义解析
CREATE TABLE pg_catalog.pg_foreign_server (srvname name NOT NULL, -- 外部服务器名称srvowner oid NOT NULL, -- 服务器所有者的OIDsrvfdw oid NOT NULL, -- 外部数据包装器(FDW)的OIDsrvtype text, -- 服务器类型标识符(可选)srvversion text, -- 服务器版本信息(可选)srvacl aclitem[], -- 访问权限控制列表srvoptions text[] -- 服务器特定的选项,以"option=value"格式存储
) WITH OIDS;
字段详细说明
- srvname (name类型,非空)
-
- 外部服务器的名称,用于在创建外部表时引用
- 必须唯一,不能与现有服务器重名
- srvowner (oid类型,非空)
-
- 服务器所有者的OID,关联到
pg_authid
系统表 - 决定谁可以修改或删除此服务器定义
- 服务器所有者的OID,关联到
- srvfdw (oid类型,非空)
-
- 外部数据包装器(Foreign Data Wrapper)的OID
- 关联到
pg_foreign_data_wrapper
系统表 - 决定此服务器使用哪种数据源连接器(如mysql_fdw, postgres_fdw等)
- srvtype (text类型,可选)
-
- 服务器类型的描述性标识符
- 例如:'mysql', 'oracle', 'hdfs'等
- srvversion (text类型,可选)
-
- 服务器版本信息
- 由FDW实现决定如何填充
- srvacl (aclitem[]类型)
-
- 访问控制列表,定义哪些用户/角色可以使用此服务器
- 格式示例:
{user1=U/user1,user2=U/user1}
- srvoptions (text[]类型)
-
- 服务器级别的选项设置,以键值对数组形式保存
- 例如MySQL连接可能包含:
{host='mysql.example.com', port='3306', dbname='mydb'}
外部数据架构关系
pg_foreign_data_wrapper (FDW定义)↑
pg_foreign_server (服务器连接定义)↑
pg_foreign_table (外部表定义)↑
pg_class (表的基本属性)
实际应用示例
- 查询所有外部服务器信息:
SELECT s.srvname AS server_name,fdw.fdwname AS wrapper_name,pg_get_userbyid(s.srvowner) AS owner,s.srvtype,s.srvoptions
FROM pg_foreign_server sJOIN pg_foreign_data_wrapper fdw ON s.srvfdw = fdw.oid;
- 创建外部服务器的标准方法(推荐):
CREATE SERVER mysql_server
FOREIGN DATA WRAPPER mysql_fdw
OPTIONS (host 'mysql.example.com', port '3306');
- 修改服务器选项:
ALTER SERVER mysql_server OPTIONS (SET dbname 'newdb');
Hologres中的特殊说明
在阿里云Hologres中:
- 支持多种外部数据源连接,如MaxCompute、OSS等
- 可能有阿里云特定的FDW实现
- 某些选项可能与原生PostgreSQL不同
重要安全警告
您代码中显示的DROP TABLE
和CREATE TABLE
语句是直接操作系统表的危险操作:
- 绝对不要直接操作系统表,这会导致数据库损坏
- 只应使用标准DDL命令管理外部服务器:
-- 创建服务器
CREATE SERVER ... FOREIGN DATA WRAPPER ... OPTIONS (...);-- 删除服务器
DROP SERVER IF EXISTS server_name;
- 权限管理应使用GRANT/REVOKE:
GRANT USAGE ON FOREIGN SERVER server_name TO user_name;