在DB2的联合数据库(Federated Database)体系中,create server是一条绕不开的语句。它的作用是在本地DB2目录中登记一个远程数据源的定义,让本地数据库知道"外面有一台什么类型的服务器、通过什么包装器访问"。很多人配置联邦查询时卡在这一步,不是因为语法复杂,而是对参数含义、前置条件和权限要求理解不透彻。本文从原理到实操,把这条语句讲透。

一、create server的语法结构与参数含义
先看基本语法。create server必须在包装器(wrapper)创建之后执行,否则会报错:
CREATE SERVER server_name TYPE server_type VERSION version_number WRAPPER wrapper_name OPTIONS (ADD server_option 'option_value', ...);
其中server_name是你在本地给这台远程服务器起的名字,后续创建昵称(nickname)、用户映射时都要引用它。这个名字只在本地联邦目录中有意义,不需要和远程服务器的真实主机名一致,但为了便于维护,通常建议起一个能体现用途的名字,比如ORA_SRC_1表示这是一个Oracle源库。
TYPE参数指明远程数据源的产品类型,常见的取值有ORACLE、DB2/LINUX、DB2/AIX64、MSSQLSERVER、SYBASE、MYSQL等。这个值必须和你创建包装器时指定的库类型匹配,写错了连接阶段就会失败。特别注意,如果远程是DB2家族的数据库,TYPE要精确到平台,比如Linux上的DB2写DB2/LINUX,AIX上的写DB2/AIX64,Windows上的写DB2/NT64。不确定的情况下,可以在远程数据库上执行SELECT * FROM SYSIBMADM.ENV_SYS_INFO查看平台信息。
VERSION参数描述远程数据源的版本号,例如Oracle 11g写11.2,Oracle 19c写19.0。版本号影响包装器对SQL方言的翻译方式,比如分页语法、字符串函数的改写策略都依赖这个值。如果版本填得比实际低,某些特性可能无法下推到远程执行;填得过高则可能生成远程不支持的语法。
WRAPPER指定使用哪个包装器。包装器是联邦体系中的"翻译官",负责和远程数据源通信。对于DB2家族内部互访,DB2 9.7之后的版本推荐使用新命名,即创建包装器时指定library 'libdb2drda.so'(Linux平台)。在OPTIONS子句中,最重要的选项是连接字符串,不同数据源的名字不同,例如Oracle数据源用NODE指向Oracle服务器的tnsname节点名,DB2数据源用DBNAME指向catalog中定义的数据库别名。
二、实战示例:从DB2访问Oracle和远程DB2
假设本地是DB2,需要访问一台Oracle 19c服务器。完整流程分三步:先创建包装器,再创建服务器定义,最后建立用户映射。示例代码如下:
-- 第一步:创建Oracle包装器 CREATE WRAPPER oracle_wrapper LIBRARY 'libdb2net8.so'; -- 第二步:创建服务器定义 CREATE SERVER ora_server TYPE ORACLE VERSION 19.0 WRAPPER oracle_wrapper OPTIONS (ADD NODE 'orcl_node'); -- 第三步:建立用户映射,把本地用户映射到Oracle账号 CREATE USER MAPPING FOR local_user SERVER ora_server OPTIONS (ADD REMOTE_AUTHID 'scott', ADD REMOTE_PASSWORD 'tiger123');
上面的NODE 'orcl_node'必须提前在Oracle客户端的tnsnames.ora中配置好,或者在DB2服务器上用net8相关工具登记。用户映射这一步经常被忽略,但没有它,本地用户发起查询时联邦系统不知道用什么身份登录远程库,查询会直接失败。
再来看DB2访问DB2的场景,这是最简单的一种联邦,因为通信走DRDA协议,不需要额外的第三方客户端:
-- 创建DRDA包装器 CREATE WRAPPER drda_wrapper LIBRARY 'libdb2drda.so'; -- 创建指向远程DB2的服务器定义 CREATE SERVER remote_db2 TYPE DB2/LINUX VERSION 11.5 WRAPPER drda_wrapper OPTIONS (ADD DBNAME 'SALESDB'); -- 建立用户映射 CREATE USER MAPPING FOR ADMIN SERVER remote_db2 OPTIONS (ADD REMOTE_AUTHID 'db2inst1', ADD REMOTE_PASSWORD 'Passw0rd'); -- 创建昵称后即可像操作本地表一样查询远程表 CREATE NICKNAME sales_orders FOR remote_db2.DB2INST1.ORDERS; SELECT COUNT(*) FROM sales_orders;
这里的SALESDB是本地实例catalog中已经编目的远程数据库别名,需要先用CATALOG TCPIP NODE和CATALOG DATABASE命令完成编目。昵称(nickname)创建成功后,查询远程表就和查本地表语法完全一致,DB2优化器会自动决定哪些谓词可以下推到远程执行。
三、常见报错与排查方法
执行create server时的报错大多集中在三类。第一类是权限问题,报错码类似SQL1109N或提示权限不足。联邦对象属于数据库级编目对象,执行者必须具有SYSADM或DBADM权限,普通用户即使有IMPLICIT_SCHEMA权限也无法创建服务器定义。
第二类是包装器库路径问题。如果报错找不到library文件,检查DB2安装目录下的lib目录(Linux)或bin目录(Windows)中是否存在对应的.so或.dll文件。对于Oracle包装器,还需要确认Oracle客户端已经安装并且环境变量ORACLE_HOME、PATH、LIBPATH设置正确,否则包装器加载阶段就会失败。DB2实例用户需要能读到Oracle客户端的库文件,这是一个典型的权限坑。
第三类是数据源配置问题。服务器创建成功不代表能连通,要验证连通性可以借助系统视图:SELECT * FROM SYSIBM.SYSSERVERS查看已登记的服务器,用SET PASSTHRU ora_server进入直通模式执行一条远程SQL来测试链路,测试完记得用SET PASSTHRU RESET退出。如果直通模式下也报错,说明问题出在包装器、网络或远程账号上,与create server语句本身无关。
另外提醒一点,联邦功能在DB2的所有版本里并非默认可用,早期版本需要单独购买WSE以上的许可并安装Relational Connect组件。如果执行create wrapper或create server时直接提示语法不被识别,先确认当前版本和许可是否支持联邦。修改服务器定义用ALTER SERVER语句,删除用DROP SERVER,删除前必须先删掉依赖它的nickname和user mapping,否则会报依赖冲突。
DB2 create serverDB2联合数据库DB2联邦查询修改时间:2026-09-09 20:22:44