DB2 中的主从逻辑复制通常通过 **Q 复制(Q Replication)** 或 **SQL 复制(SQL Replication)** 实现,两者均基于逻辑日志捕获数据变更并异步同步到目标端。以下是基于 **Q 复制** 的详细配置步骤和示例:
---
### **一、Q 复制核心组件**
1. **Capture 程序**
- 运行在源数据库(主库),监控事务日志,捕获数据变更(INSERT/UPDATE/DELETE)。
- 将变更记录写入队列(MQ 队列或 DB2 队列)。
2. **Apply 程序**
- 运行在目标数据库(从库),从队列读取变更记录,应用到目标表。
- 支持冲突解决和转换规则。
3. **控制表(Control Tables)**
- 存储复制配置元数据(如订阅关系、队列映射、错误日志等)。
---
### **二、配置步骤示例**
#### **场景说明**
- **源数据库(主库)**: `SOURCE_DB`,表 `EMPLOYEES`
- **目标数据库(从库)**: `TARGET_DB`,表 `EMPLOYEES`
- 要求:实时同步 `EMPLOYEES` 表的增删改操作。
---
#### **1. 环境准备**
- 确保源和目标数据库启用归档日志(ARCHIVELOG 模式)。
- 安装并配置 **IBM MQ**(用于队列管理)或使用 DB2 内置队列。
- 确保用户权限:
- 源库:`DBADM`、`SECADM`、`REPLICATION` 权限。
- 目标库:`DBADM`、`DATAACCESS` 权限。
---
#### **2. 创建队列管理器(以 IBM MQ 为例)**
```bash
# 在源和目标服务器创建队列管理器
crtmqm QM_SOURCE
crtmqm QM_TARGET
# 启动队列管理器
strmqm QM_SOURCE
strmqm QM_TARGET
# 创建本地队列
echo "DEFINE QLOCAL(SOURCE.Q)" | runmqsc QM_SOURCE
echo "DEFINE QLOCAL(TARGET.Q)" | runmqsc QM_TARGET
```
---
#### **3. 配置源数据库(主库)**
1. **创建控制表**
```sql
-- 在源库执行
CALL ASNQCCP.CREATE_QSUB('CAPTURE_SCH', 'REPL_ADMIN');
```
2. **定义复制队列**
```sql
CALL ASNQCCP.ADD_QUEUE(
Q_NAME = 'SOURCE.Q',
QUEUE_TYPE = 'MQ',
MQ_QMGR_NAME = 'QM_SOURCE',
MQ_QUEUE_NAME = 'SOURCE.Q'
);
```
3. **注册复制表**
```sql
CALL ASNQCCP.ADD_TABLE(
TAB_SCHEMA = 'HR',
TAB_NAME = 'EMPLOYEES',
Q_NAME = 'SOURCE.Q',
SUB_TYPE = 'C' -- Capture 类型
);
```
4. **启动 Capture 程序**
```sql
CALL ASNQCCP.START_CAPTURE('CAPTURE_SCH');
```
---
#### **4. 配置目标数据库(从库)**
1. **创建控制表**
```sql
-- 在目标库执行
CALL ASNQCAP.CREATE_QSUB('APPLY_SCH', 'REPL_ADMIN');
```
2. **定义复制队列**
```sql
CALL ASNQCAP.ADD_QUEUE(
Q_NAME = 'TARGET.Q',
QUEUE_TYPE = 'MQ',
MQ_QMGR_NAME = 'QM_TARGET',
MQ_QUEUE_NAME = 'TARGET.Q'
);
```
3. **注册目标表**
```sql
CALL ASNQCAP.ADD_TABLE(
TAB_SCHEMA = 'HR',
TAB_NAME = 'EMPLOYEES',
Q_NAME = 'TARGET.Q',
SUB_TYPE = 'A' -- Apply 类型
);
```
4. **启动 Apply 程序**
```sql
CALL ASNQCAP.START_APPLY('APPLY_SCH');
```
---
#### **5. 创建订阅(Subscription)**
1. **在源库定义订阅关系**
```sql
CALL ASNQCCP.ADD_SUBSCRIPTION(
SUB_NAME = 'SUB_EMPLOYEES',
Q_NAME = 'SOURCE.Q',
TARGET_QMGR = 'QM_TARGET',
TARGET_Q = 'TARGET.Q'
);
```
2. **激活订阅**
```sql
CALL ASNQCCP.ACTIVATE_SUBSCRIPTION('SUB_EMPLOYEES');
```
---
#### **6. 验证同步**
1. **在源库插入数据**
```sql
INSERT INTO HR.EMPLOYEES (ID, NAME) VALUES (1, 'Alice');
```
2. **在目标库查询数据**
```sql
SELECT * FROM HR.EMPLOYEES WHERE ID = 1;
```
- 若返回 `Alice`,说明复制成功。
---
### **三、常见问题**
1. **队列积压**
- 检查 Apply 程序是否运行,或网络延迟是否过高。
- 监控命令:`ASNQCMD STATUS QUEUE Q_NAME=SOURCE.Q`
2. **冲突解决**
- 若目标表存在唯一键冲突,需在 Apply 配置中定义冲突解决规则(如忽略或覆盖)。
3. **日志空间不足**
- 确保源库日志文件大小充足:`db2 update db cfg using LOGFILSIZ 10240`
---
### **四、总结**
通过 Q 复制,DB2 可实现跨平台、异构数据库的逻辑同步。关键步骤包括:
1. 配置队列管理器(IBM MQ 或 DB2 队列)。
2. 创建控制表并注册复制对象。
3. 启动 Capture 和 Apply 进程。
4. 定义订阅关系并验证数据一致性。
实际场景中需结合监控工具(如 `ASNCLP` 或 IBM Data Replication Dashboard)确保复制稳定性。
3880

被折叠的 条评论
为什么被折叠?



