风哥教程参考DB2官方文档Federation、Data Virtualization等内容,详细介绍联邦数据库配置、跨数据库查询、异构数据源集成等。更多视频教程www.fgedu.net.cn
目录大纲
Part01-联邦数据库概述
1.1 联邦数据库概念
联邦数据库(Federated Database)允许:
- 访问远程DB2数据库
- 访问Oracle、MySQL、SQL Server等异构数据源
- 跨数据库查询和联合查询
- 数据虚拟化
- 分布式事务
1.2 联邦数据库组件
- 包装器(Wrapper):连接数据源的接口
- 服务器(Server):远程数据源定义
- 用户映射(User Mapping):本地用户到远程用户的映射
- 昵称(Nickname):远程表的本地别名
Part02-配置联邦环境
2.1 启用联邦功能
UPDATE DATABASE MANAGER CONFIGURATION USING FEDERATED YES;
# 重启实例
db2stop
db2start
# 验证联邦功能
GET DATABASE MANAGER CONFIGURATION | grep FEDERATED
# 连接到本地数据库
db2 connect to FGEDB
# 安装包装器
# DB2包装器
CREATE WRAPPER DRDA;
# Oracle包装器
CREATE WRAPPER ORACLE;
# MySQL包装器
CREATE WRAPPER MYSQL;
# ODBC包装器
CREATE WRAPPER ODBC;
2.2 配置远程服务器
CREATE SERVER REMOTE_DB2
TYPE DB2/UDB
VERSION 12.1
WRAPPER DRDA
AUTHORIZATION “remote_user”
PASSWORD “remote_password”
OPTIONS (
ADD DBNAME ‘REMOTEDB’,
ADD NODE ‘REMOTE_NODE’
);
# 创建Oracle服务器
CREATE SERVER ORACLE_SERVER
TYPE ORACLE
VERSION 19c
WRAPPER ORACLE
AUTHORIZATION “oracle_user”
PASSWORD “oracle_password”
OPTIONS (
ADD NODE ‘oracle_tns_name’
);
# 创建MySQL服务器
CREATE SERVER MYSQL_SERVER
TYPE MYSQL
VERSION 8.0
WRAPPER MYSQL
AUTHORIZATION “mysql_user”
PASSWORD “mysql_password”
OPTIONS (
ADD HOST ‘192.168.1.100’,
ADD PORT ‘3306’,
ADD DBNAME ‘mysqldb’
);
# 查看服务器定义
SELECT
SERVERNAME,
SERVER_TYPE,
SERVER_VERSION,
WRAPPERNAME
FROM SYSCAT.SERVERS;
2.3 创建用户映射和昵称
CREATE USER MAPPING FOR LOCAL_USER
SERVER REMOTE_DB2
OPTIONS (
ADD REMOTE_AUTHID ‘remote_user’,
ADD REMOTE_PASSWORD ‘remote_password’
);
CREATE USER MAPPING FOR LOCAL_USER
SERVER ORACLE_SERVER
OPTIONS (
ADD REMOTE_AUTHID ‘oracle_user’,
ADD REMOTE_PASSWORD ‘oracle_password’
);
# 创建昵称(远程表的本地别名)
CREATE NICKNAME REMOTE_ORDERS FOR REMOTE_DB2.ORDERS;
CREATE NICKNAME REMOTE_CUSTOMER FOR REMOTE_DB2.CUSTOMER;
CREATE NICKNAME ORACLE_EMPLOYEES FOR ORACLE_SERVER.EMPLOYEES;
CREATE NICKNAME ORACLE_DEPARTMENTS FOR ORACLE_SERVER.DEPARTMENTS;
CREATE NICKNAME MYSQL_PRODUCTS FOR MYSQL_SERVER.PRODUCTS;
# 查看昵称定义
SELECT
NICKNAME,
SERVERNAME,
REMOTE_SCHEMA,
REMOTE_TABLE
FROM SYSCAT.NICKNAMES;
# 查看远程表结构
DESCRIBE REMOTE_ORDERS;
DESCRIBE ORACLE_EMPLOYEES;
Part03-跨数据库查询
3.1 联邦查询示例
SELECT * FROM REMOTE_ORDERS
WHERE CREATE_TIME > ‘2026-04-01’;
# 联合查询本地和远程表
SELECT
o.ORDER_ID,
o.TOTAL_AMOUNT,
c.CUSTOMER_NAME
FROM ORDERS o
INNER JOIN REMOTE_CUSTOMER c ON o.CUSTOMER_ID = c.CUSTOMER_ID
WHERE o.CREATE_TIME > ‘2026-04-01’;
# 跨多个数据源查询
SELECT
o.ORDER_ID,
o.TOTAL_AMOUNT,
e.EMPLOYEE_NAME AS SALES_REP,
p.PRODUCT_NAME
FROM ORDERS o
INNER JOIN ORACLE_EMPLOYEES e ON o.SALES_REP_ID = e.EMPLOYEE_ID
INNER JOIN MYSQL_PRODUCTS p ON o.PRODUCT_ID = p.PRODUCT_ID
WHERE o.CREATE_TIME > ‘2026-04-01’;
# 联邦聚合查询
SELECT
c.COUNTRY,
COUNT(*) AS ORDER_COUNT,
SUM(o.TOTAL_AMOUNT) AS TOTAL_AMOUNT
FROM ORDERS o
INNER JOIN REMOTE_CUSTOMER c ON o.CUSTOMER_ID = c.CUSTOMER_ID
GROUP BY c.COUNTRY
ORDER BY TOTAL_AMOUNT DESC;
# 使用PASS THROUGH直接访问远程数据源
SET PASSTHRU REMOTE_DB2;
SELECT * FROM ORDERS WHERE CREATE_TIME > ‘2026-04-01’;
SET PASSTHRU RESET;
3.2 分布式事务
BEGIN ATOMIC
INSERT INTO ORDERS (ORDER_ID, CUSTOMER_ID, TOTAL_AMOUNT)
VALUES (‘O001’, ‘C001’, 1000.00);
UPDATE REMOTE_CUSTOMER
SET TOTAL_ORDERS = TOTAL_ORDERS + 1,
TOTAL_AMOUNT = TOTAL_AMOUNT + 1000.00
WHERE CUSTOMER_ID = ‘C001’;
INSERT INTO ORACLE_EMPLOYEES (EMPLOYEE_ID, SALES_COUNT)
VALUES (‘E001’, 1);
END;
# 两阶段提交
# 准备阶段
PREPARE TRANSACTION ‘tx001’;
# 提交阶段
COMMIT TRANSACTION ‘tx001’;
# 回滚阶段
ROLLBACK TRANSACTION ‘tx001’;
# 监控分布式事务
SELECT
XID,
STATUS,
PARTICIPANTS
FROM SYSIBMADM.TRANSACTIONS
WHERE XID IS NOT NULL;
Part04-性能优化
4.1 查询下推优化
ALTER SERVER REMOTE_DB2
OPTIONS (SET PUSHDOWN ‘Y’);
ALTER SERVER ORACLE_SERVER
OPTIONS (SET PUSHDOWN ‘Y’);
# 查看查询下推设置
SELECT
SERVERNAME,
OPTION,
SETTING
FROM SYSCAT.SERVEROPTIONS
WHERE OPTION = ‘PUSHDOWN’;
# 创建索引昵称
CREATE NICKNAME REMOTE_ORDERS_IDX FOR REMOTE_DB2.IDX_ORDERS_CUSTOMER;
# 使用本地物化查询表缓存远程数据
CREATE TABLE MQT_REMOTE_ORDERS AS (
SELECT * FROM REMOTE_ORDERS
) DATA INITIALLY DEFERRED REFRESH DEFERRED;
REFRESH TABLE MQT_REMOTE_ORDERS;
# 使用本地表缓存热点远程数据
CREATE TABLE LOCAL_CUSTOMER_CACHE AS (
SELECT * FROM REMOTE_CUSTOMER
) DATA INITIALLY DEFERRED REFRESH DEFERRED;
REFRESH TABLE LOCAL_CUSTOMER_CACHE;
4.2 性能监控
SELECT
SUBSTR(STMT_TEXT, 1, 100) AS STMT_TEXT,
TOTAL_EXEC_TIME,
TOTAL_USR_CPU_TIME,
TOTAL_SYS_CPU_TIME,
TOTAL_WAIT_TIME
FROM SYSIBMADM.TOP_DYNAMIC_SQL
WHERE STMT_TEXT LIKE ‘%REMOTE_%’
ORDER BY TOTAL_EXEC_TIME DESC;
# 监控远程服务器连接
SELECT
SERVERNAME,
CONNECTIONS,
TOTAL_CONNECTS,
TOTAL_CONNECT_TIME
FROM SYSCAT.SERVERS;
# 查看联邦查询执行计划
EXPLAIN PLAN FOR
SELECT * FROM ORDERS o
INNER JOIN REMOTE_CUSTOMER c ON o.CUSTOMER_ID = c.CUSTOMER_ID;
SELECT * FROM EXPLAIN_OPERATOR WHERE OPERATOR_TYPE = ‘REMOTE’;
# 监控包装器性能
SELECT
WRAPPERNAME,
SERVERS,
NICKNAMES
FROM SYSCAT.WRAPPERS;
Part05-风哥经验总结与分享
5.1 联邦数据库配置要点
- 启用FEDERATED参数
- 安装合适的包装器
- 正确配置远程服务器连接信息
- 创建用户映射确保权限正确
- 为远程表创建昵称
- 启用查询下推提高性能
5.2 性能优化建议
| 场景 | 优化方案 |
|---|---|
| 远程查询慢 | 启用查询下推,本地缓存 |
| 网络延迟高 | 使用MQT缓存远程数据 |
| 分布式事务慢 | 减少跨库事务,异步处理 |
| 连接池耗尽 | 增大连接池,优化连接管理 |
5.3 运维要点
- 监控远程服务器连接状态
- 监控联邦查询性能
- 定期刷新MQT缓存
- 检查网络连接稳定性
- 管理远程用户权限
- 建立联邦查询性能基线
学习交流加群风哥微信: itpux-com
风哥Oracle/MySQL/PostgreSQL/Greenplum/DB2/Redis等数据库培训课程,10年一线实战经验,企业级培训,真正掌握数据库核心技术!
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
