企業常見多數據庫實例:業務庫 (OLTP)、數倉庫 (OLAP)、歸檔庫、第三方系統庫。報表/服務需聯合查詢多庫表,但不想在應用層做 JOIN (性能差、一致性難保證)。DB2 聯邦技術 允許在一個數據庫中創建 Nickname (別名) 映射遠程表,再構建本地 View (視圖) 封裝跨庫邏輯,對上層應用透明化為單表訪問。
[應用] → [本地數據庫 A] → View(SYS_PERSON) → Nickname(TEMPXX_PERSON2) → Wrapper/Server/User Mapping → [遠程數據庫 B 表]
db2 update dbm cfg using FEDERATED YES → db2stop force && db2startSELECT 權限。DROP VIEW SYS_PERSON, SYS_ORG, SYS_ORGSUBSYSREL, SYS_ORGPERSON, SYS_RIGHTSHORTCUT, SYS_APPROLE_PERSON;
DROP NICKNAME TEMPXX_PERSON2, TEMPXX_PERSONACCOUNT2, TEMPXX_ORG2, TEMPXX_SYSORGSHORTCUT2, TEMPXX_SYSTEM2, TEMPXX_ORGPERSON2, TEMPXX_RIGHTSHORTCUT2, TEMPXX_ROLE2, TEMPXX_ROLEDISABLE2;
DROP USER MAPPING FOR DB2ADMIN SERVER TEMPSERVER;
DROP SERVER TEMPSERVER;
DROP WRAPPER DRDA;
CREATE WRAPPER "DRDA" LIBRARY 'db2drda.dll' OPTIONS (DB2_FENCED 'N');
LIBRARY:Windows 下為 db2drda.dll,Linux/AIX 為 libdb2drda.a / libdb2drda.so。DB2_FENCED 'N':在引擎進程內加載,性能更高 (需信任遠程庫)。CREATE SERVER TEMPSERVER
TYPE DB2/UDB
VERSION 8.1
WRAPPER DRDA
AUTHORIZATION "remote_user"
PASSWORD "remote_pwd"
OPTIONS (DBNAME 'TESTPP');
DBNAME:遠程數據庫別名 (需在遠程節點目錄中存在)。VERSION:遠程 DB2 版本主版本號 (8/9/10/11)。CREATE USER MAPPING FOR DB2ADMIN SERVER TEMPSERVER
OPTIONS (REMOTE_AUTHID 'remote_user', REMOTE_PASSWORD 'remote_pwd');
FOR DB2ADMIN:本地哪個用戶通過此映射訪問遠程庫。生產建議用專用服務賬號而非管理員。CREATE NICKNAME DB2ADMIN.TEMPXX_PERSON2 FOR TEMPSERVER.DB2ADMIN.TEMPXX_PERSON;
CREATE NICKNAME DB2ADMIN.TEMPXX_PERSONACCOUNT2 FOR TEMPSERVER.DB2ADMIN.TEMPXX_PERSONACCOUNT;
CREATE NICKNAME DB2ADMIN.TEMPXX_ORG2 FOR TEMPSERVER.DB2ADMIN.TEMPXX_ORG;
CREATE NICKNAME DB2ADMIN.TEMPXX_SYSORGSHORTCUT2 FOR TEMPSERVER.DB2ADMIN.TEMPXX_SYSORGSHORTCUT;
CREATE NICKNAME DB2ADMIN.TEMPXX_SYSTEM2 FOR TEMPSERVER.DB2ADMIN.TEMPXX_SYSTEM;
CREATE NICKNAME DB2ADMIN.TEMPXX_ORGPERSON2 FOR TEMPSERVER.DB2ADMIN.TEMPXX_ORGPERSON;
CREATE NICKNAME DB2ADMIN.TEMPXX_RIGHTSHORTCUT2 FOR TEMPSERVER.DB2ADMIN.TEMPXX_RIGHTSHORTCUT;
CREATE NICKNAME DB2ADMIN.TEMPXX_ROLE2 FOR TEMPSERVER.DB2ADMIN.TEMPXX_ROLE;
CREATE NICKNAME DB2ADMIN.TEMPXX_ROLEDISABLE2 FOR TEMPSERVER.DB2ADMIN.TEMPXX_ROLEDISABLE;
關鍵點: Nickname 在本地編目視圖中表現為普通表,優化器可推演統計信息 (需 RUNSTATS ON NICKNAME 或遠程同步)。
用戶核心視圖 (SYS_PERSON):
CREATE VIEW SYS_PERSON AS
SELECT
PA.PERSONUUID, PA.FLAG, PA.USERID, PA.ACCOUNTSTAT, PA.LOGINFAILNUM,
PA.LASTLOGINIP, PA.LASTLOGINDATE, PA.PASSQUESTION, PA.PASSANSWER, PA.TTLFLAG,
PA.ACCOUNTTTL, PA.CREATETIME, PA.DELTAG,
P.PERSONCODE, P.CNNAME, P.ENNAME, P.FIRSTNAME, P.LASTNAME, P.IDNUM,
P.CARDCODE, P.SEX, P.MARRYCODE, P.PCODE, P.HOMETEL, P.OFFICETEL,
P.HOMEFAX, P.OFFICEFAX, P.MOBILE, P.PAGER, P.EMAIL1, P.EMAIL2,
P.COUNTRY, P.PROVINCEID, P.CITYID, P.CONNECTADDR, P.ZIP, P.EDUCODE,
P.DEGREECODE, P.OTHERINFO, P.SEQUENCENO, P.JOB, P.SIGNATURE
FROM DB2ADMIN.TEMPXX_PERSON2 P
JOIN DB2ADMIN.TEMPXX_PERSONACCOUNT2 PA
ON P.PERSONUUID = PA.PERSONUUID;
組織視圖 (SYS_ORG):
CREATE VIEW SYS_ORG AS
SELECT ORGUUID, CNNAME, ENNAME, ORGCODE, CONTACT, ORGGRADE, ORGPROP,
ORGLEVEL, SERIALINDEX, MEMO, PARENTORGUUID, STATUS, ORGLEVELCODE, DELTAG, SEQUENCENO
FROM DB2ADMIN.TEMPXX_ORG2;
子系統-組織映射 (SYS_ORGSUBSYSREL):
CREATE VIEW SYS_ORGSUBSYSREL AS
SELECT S.SYSID, S.ORGUUID, O.CNNAME, S.SYSNAME, S.SYSPROP
FROM DB2ADMIN.TEMPXX_SYSORGSHORTCUT2 S
JOIN DB2ADMIN.TEMPXX_SYSTEM2 SYS ON S.SYSID = SYS.SYSID
JOIN DB2ADMIN.TEMPXX_ORG2 O ON S.ORGUUID = O.ORGUUID;
用戶-組織映射 (SYS_ORGPERSON):
CREATE VIEW SYS_ORGPERSON AS
SELECT PERSONUUID, ORGUUID, ISBELONG
FROM DB2ADMIN.TEMPXX_ORGPERSON2;
用戶-系統角色 (SYS_RIGHTSHORTCUT):排除禁用角色
CREATE VIEW SYS_RIGHTSHORTCUT AS
SELECT RS.PERSONUUID, RS.ROLEID, R.SYSID, R.CNNAME
FROM DB2ADMIN.TEMPXX_RIGHTSHORTCUT2 RS
JOIN DB2ADMIN.TEMPXX_ROLE2 R ON RS.ROLEID = R.ROLEID
WHERE R.CREATEBY = '1'
EXCEPT
SELECT RD.PERSONUUID, RD.ROLEID, R.SYSID, R.CNNAME
FROM DB2ADMIN.TEMPXX_ROLEDISABLE2 RD
JOIN DB2ADMIN.TEMPXX_ROLE2 R ON RD.ROLEID = R.ROLEID;
用戶-應用角色 (SYS_APPROLE_PERSON):
CREATE VIEW SYS_APPROLE_PERSON AS
SELECT DISTINCT RS.PERSONUUID, P.CNNAME AS PERSONNAME, R.CNNAME AS ROLENAME, R.ROLECODE
FROM DB2ADMIN.TEMPXX_RIGHTSHORTCUT2 RS
JOIN DB2ADMIN.TEMPXX_ROLE2 R ON RS.ROLEID = R.ROLEID
JOIN DB2ADMIN.TEMPXX_PERSON2 P ON RS.PERSONUUID = P.PERSONUUID
WHERE R.CREATEBY = '1'
EXCEPT
SELECT DISTINCT RD.PERSONUUID, P.CNNAME, R.CNNAME, R.ROLECODE
FROM DB2ADMIN.TEMPXX_ROLEDISABLE2 RD
JOIN DB2ADMIN.TEMPXX_ROLE2 R ON RD.ROLEID = R.ROLEID
JOIN DB2ADMIN.TEMPXX_PERSON2 P ON RD.PERSONUUID = P.PERSONUUID
WHERE R.CREATEBY = '1';
| 維度 | 建議 |
|---|---|
| 統計信息 | 定期 RUNSTATS ON NICKNAME ... 或遠程跑統計後本地 SYSPROC.NNSTAT 同步,否則優化器誤判遠程表基數導致計劃劣化。 |
| 推演下推 | DB2 優化器嘗試將過濾條件 (WHERE)、聚合、JOIN 下推到遠程執行。確保遠程表有對應索引,避免全表掃描後傳輸海量數據。 |
| 網路延遲 | 跨機房/跨網段聯邦查詢延遲敏感。關鍵路徑考慮物化視圖 (MQT) 定時同步至本地。 |
| 權限最小化 | 遠程只授 SELECT;本地 User Mapping 綁定專用服務賬號;Wrapper 設 DB2_FENCED 'Y' 隔離進程 (安全優先) 或 'N' (性能優先)。 |
| 版本兼容 | |
| 監控 | db2pd -federated、MON_GET_CONNECTION 觀察遠程連接池、查詢耗時、傳輸行數。 |
-- 1. Wrapper 自動註冊 (無需手動 CREATE WRAPPER DRDA)
-- 2. Server 支持 SSL 加密傳輸
CREATE SERVER TEMPSERVER
TYPE DB2/UDB
WRAPPER DRDA
OPTIONS (
HOST 'remote.host', PORT '50000', DBNAME 'TESTPP',
SSL_ENABLE 'TRUE', SSL_KEYSTORE_FILE '/path/keystore.p12', SSL_KEYSTORE_PASSWORD 'xxx'
);
-- 3. User Mapping 支持 Kerberos/Token
CREATE USER MAPPING FOR SVC_APP SERVER TEMPSERVER
OPTIONS (AUTHENTICATION 'KERBEROS');
DB2 聯邦 + Nickname + View 模式,以標準 SQL 封裝異構數據源,實現「邏輯集中、物理分散」的數據虛擬化。關鍵在於:統計信息同步、下推優化、網路拓撲感知、權限最小化。將上述 DDL 腳本化納入版本控制,配合 CI/CD 自動化部署,即可構建穩健可維護的跨庫數據服務層。