首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 聯邦技術實戰:跨數據庫視圖構建完整指南

     編輯:DB2 教學

業務場景

企業常見多數據庫實例:業務庫 (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 && db2start
  • 網路互通:本地主機可 TCP 連接遠程 DB2 端口 (默認 50000)。
  • 遠程用戶具備目標表 SELECT 權限。

六步構建法 (DDL 腳本化建議)

1. 清理舊對象 (冪等腳本)

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;

2. 創建 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':在引擎進程內加載,性能更高 (需信任遠程庫)。

3. 創建 Server (遠程實例入口)

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)。

4. 創建 User Mapping (認證映射)

CREATE USER MAPPING FOR DB2ADMIN SERVER TEMPSERVER
  OPTIONS (REMOTE_AUTHID 'remote_user', REMOTE_PASSWORD 'remote_pwd');
  • FOR DB2ADMIN:本地哪個用戶通過此映射訪問遠程庫。生產建議用專用服務賬號而非管理員。

5. 創建 Nickname (遠程表映射)

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 或遠程同步)。

6. 創建業務視圖 (封裝跨庫 JOIN/過濾)

用戶核心視圖 (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';

性能與運維關鍵點

  • CREATE SERVER VERSION 需匹配遠程主版本;DRDA 協議向後兼容良好,但新特性 (如 XML、Column-organized) 需版本匹配。
  • 維度建議
    統計信息定期 RUNSTATS ON NICKNAME ... 或遠程跑統計後本地 SYSPROC.NNSTAT 同步,否則優化器誤判遠程表基數導致計劃劣化。
    推演下推DB2 優化器嘗試將過濾條件 (WHERE)、聚合、JOIN 下推到遠程執行。確保遠程表有對應索引,避免全表掃描後傳輸海量數據。
    網路延遲跨機房/跨網段聯邦查詢延遲敏感。關鍵路徑考慮物化視圖 (MQT) 定時同步至本地。
    權限最小化遠程只授 SELECT;本地 User Mapping 綁定專用服務賬號;Wrapper 設 DB2_FENCED 'Y' 隔離進程 (安全優先) 或 'N' (性能優先)。
    版本兼容
    監控db2pd -federated、MON_GET_CONNECTION 觀察遠程連接池、查詢耗時、傳輸行數。

    遷移到新版本 (Db2 11.5+) 的現代化寫法

    -- 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 自動化部署,即可構建穩健可維護的跨庫數據服務層。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved