Skip to content

DB2 备份恢复命令

备份恢复命令概述

DB2提供了丰富的备份和恢复命令,用于保护数据库数据安全和实现灾难恢复。这些命令支持多种备份类型(全量、增量、差异、在线等)和恢复方式,能够满足不同场景下的备份恢复需求。

备份命令详解

1. 全量备份

全量备份是指备份整个数据库的所有数据,是最基础的备份类型。

离线全量备份

bash
# 基本语法
db2 backup database `<database_name>` to `<backup_path>`

# 示例:备份数据库sample到本地目录
db2 backup database sample to /db2backup

# 示例:备份到多个设备,提高备份速度
db2 backup database sample to /db2backup1,/db2backup2

# 示例:使用压缩备份
db2 backup database sample to /db2backup compress

# 示例:指定备份映像名称
db2 backup database sample to /db2backup filename sample_full_$(date +%Y%m%d_%H%M%S).001

在线全量备份

在线备份允许在数据库运行时进行备份,不影响数据库的正常使用。

bash
# 基本语法
db2 backup database `<database_name>` online to `<backup_path>`

# 示例:在线备份数据库sample
db2 backup database sample online to /db2backup

# 示例:在线备份并包含日志
db2 backup database sample online to /db2backup include logs

# 示例:在线备份并指定并行度
db2 backup database sample online to /db2backup parallelism 4

# 示例:在线备份并使用压缩
db2 backup database sample online to /db2backup compress include logs

2. 增量备份

增量备份只备份自上次全量备份或增量备份以来发生变化的数据,能够减少备份时间和存储空间。

bash
# 基本语法
db2 backup database `<database_name>` incremental to `<backup_path>`

# 示例:离线增量备份
db2 backup database sample incremental to /db2backup

# 示例:在线增量备份
db2 backup database sample online incremental to /db2backup include logs

# 示例:在线增量备份并指定并行度
db2 backup database sample online incremental to /db2backup parallelism 2 include logs

3. 差异备份

差异备份只备份自上次全量备份以来发生变化的数据,与增量备份相比,恢复时只需要全量备份和最后一次差异备份。

bash
# 基本语法
db2 backup database `<database_name>` delta to `<backup_path>`

# 示例:离线差异备份
db2 backup database sample delta to /db2backup

# 示例:在线差异备份
db2 backup database sample online delta to /db2backup include logs

4. 表空间备份

表空间备份允许只备份特定的表空间,适用于大型数据库或只需要备份部分数据的场景。

离线表空间备份

bash
# 基本语法
db2 backup database `<database_name>` tablespace (`<tablespace_name1>`,`<tablespace_name2>`) to `<backup_path>`

# 示例:备份用户表空间USERSPACE1
db2 backup database sample tablespace (USERSPACE1) to /db2backup

# 示例:备份多个表空间
db2 backup database sample tablespace (USERSPACE1, SYSTOOLSPACE) to /db2backup

在线表空间备份

bash
# 基本语法
db2 backup database `<database_name>` tablespace (`<tablespace_name>`) online to `<backup_path>`

# 示例:在线备份表空间USERSPACE1
db2 backup database sample tablespace (USERSPACE1) online to /db2backup

# 示例:在线备份表空间并包含日志
db2 backup database sample tablespace (USERSPACE1) online to /db2backup include logs

5. 日志备份

日志备份是指备份数据库的事务日志,用于前滚恢复到特定时间点。

bash
# 基本语法
db2 archive log for database `<database_name>`

# 示例:手动归档日志
db2 archive log for database sample

# 示例:使用日志归档命令并指定日志目标
db2 archive log for database sample to /db2archlog

恢复命令详解

1. 数据库恢复

数据库恢复是指将数据库从备份映像中恢复到指定状态。

离线恢复

bash
# 基本语法
db2 restore database `<database_name>` from `<backup_path>` taken at `<timestamp>`

# 示例:恢复全量备份
db2 restore database sample from /db2backup taken at 20231015143045

# 示例:恢复到新的数据库名称
db2 restore database sample from /db2backup taken at 20231015143045 into sample_new

# 示例:恢复到不同路径
db2 restore database sample from /db2backup taken at 20231015143045 newlogpath /db2newlog

# 示例:使用重定向恢复
db2 restore database sample from /db2backup taken at 20231015143045 redirect
# 然后修改容器路径
# 最后完成恢复
db2 restore database sample continue

在线恢复

在线恢复允许在数据库运行时恢复表空间或日志。

bash
# 基本语法
db2 restore database `<database_name>` tablespace (`<tablespace_name>`) online from `<backup_path>` taken at `<timestamp>`

# 示例:在线恢复表空间
db2 restore database sample tablespace (USERSPACE1) online from /db2backup taken at 20231015143045

2. 前滚恢复

前滚恢复是指将数据库恢复到备份后的某个时间点或日志序列,能够恢复备份后的数据变化。

bash
# 基本语法
db2 rollforward database `<database_name>` to `<point_in_time>` using local time

# 示例:前滚到指定时间点
db2 rollforward database sample to 2023-10-15-14.30.45.000000 using local time

# 示例:前滚到最后一个日志
db2 rollforward database sample to end of logs

# 示例:前滚表空间
db2 rollforward database sample to end of logs tablespace (USERSPACE1)

# 示例:前滚并停止数据库
db2 rollforward database sample to end of logs and stop

# 示例:前滚到指定日志序列
db2 rollforward database sample to logseq 123456 and stop

3. 恢复到特定时间点

恢复到特定时间点是指将数据库恢复到备份后的某个具体时间,需要结合全量备份和前滚恢复。

bash
# 步骤1:恢复全量备份
db2 restore database sample from /db2backup taken at 20231015143045

# 步骤2:前滚到指定时间点
db2 rollforward database sample to 2023-10-15-15.30.00.000000 using local time and stop

备份恢复辅助命令

1. 备份验证

备份验证用于检查备份映像的完整性和可用性。

bash
# 基本语法
db2ckbkp `<backup_image_path>`

# 示例:验证备份映像
db2ckbkp /db2backup/SAMPLE.0.db2inst1.DBPART000.20231015143045.001

# 示例:详细验证
db2ckbkp -v /db2backup/SAMPLE.0.db2inst1.DBPART000.20231015143045.001

# 示例:验证并显示备份内容
db2ckbkp -h /db2backup/SAMPLE.0.db2inst1.DBPART000.20231015143045.001

2. 备份列表查看

查看数据库的备份历史记录。

bash
# 基本语法
db2 list history backup all for `<database_name>`

# 示例:查看数据库sample的所有备份历史
db2 list history backup all for sample

# 示例:查看特定类型的备份历史
db2 list history backup online all for sample

# 示例:查看最近的备份历史
db2 list history backup all for sample | head -20

3. 恢复状态查询

查询数据库的恢复状态。

bash
# 基本语法
db2 get snapshot for database on `<database_name>`

# 示例:查看数据库恢复状态
db2 get snapshot for database on sample | grep -i "rollforward pending"

# 示例:使用db2pd查看恢复状态
db2pd -d sample -recovery

4. 取消恢复

取消正在进行的恢复操作。

bash
# 基本语法
db2 restore database `<database_name>` abort

# 示例:取消数据库恢复
db2 restore database sample abort

常用选项和参数

备份命令常用选项

选项描述
online在线备份,数据库保持可用
incremental增量备份,只备份变化的数据
delta差异备份,只备份自上次全量备份以来变化的数据
compress压缩备份映像,减少存储空间
include logs包含事务日志,用于前滚恢复
parallelism <n>使用n个并行进程进行备份
filename <name>指定备份映像文件名
to <path>指定备份目标路径
taken at <timestamp>指定备份时间戳

恢复命令常用选项

选项描述
from <path>指定备份映像来源路径
taken at <timestamp>指定要恢复的备份时间戳
into <database_name>恢复到新的数据库名称
redirect重定向恢复,允许修改容器路径
newlogpath <path>指定新的日志路径
newtbspacepath <path>指定新的表空间路径
continue继续重定向恢复
abort取消恢复操作

前滚命令常用选项

选项描述
to <point_in_time>前滚到指定时间点
to end of logs前滚到最后一个日志
to logseq <n>前滚到指定日志序列
using local time使用本地时间格式
and stop前滚后停止数据库
tablespace <tablespace_name>只前滚指定表空间

备份恢复策略示例

1. 日常备份策略

备份类型频率保留期限
全量备份每周日4周
增量备份周一至周六2周
日志备份每小时1个月

2. 备份恢复示例流程

场景:数据库崩溃,需要恢复到最新状态

bash
# 步骤1:查看最近的全量备份
db2 list history backup all for sample | head -30

# 步骤2:恢复最近的全量备份
db2 restore database sample from /db2backup taken at 20231015143045

# 步骤3:前滚到最后一个日志
db2 rollforward database sample to end of logs and stop

# 步骤4:验证数据库状态
db2 connect to sample
db2 list tablespaces show detail

场景:误删除表数据,需要恢复到删除前的时间点

bash
# 步骤1:确定删除时间点(假设为2023-10-15 15:30:00)

# 步骤2:恢复最近的全量备份
db2 restore database sample from /db2backup taken at 20231015143045

# 步骤3:前滚到删除前的时间点
db2 rollforward database sample to 2023-10-15-15.29.59.000000 using local time and stop

# 步骤4:验证数据是否恢复
db2 connect to sample
db2 select count(*) from deleted_table

版本差异

DB2 10.5及之前版本

  • 支持基本的备份恢复命令
  • 压缩备份选项有限
  • 并行度设置范围较小
  • 不支持部分表恢复

DB2 11.1版本

  • 增强了压缩备份功能
  • 支持更高的并行度
  • 改进了备份恢复性能
  • 支持表级恢复

DB2 11.5版本

  • 引入了快照备份功能
  • 支持增量备份的增量合并
  • 增强了备份加密功能
  • 支持云存储备份恢复
  • 改进了备份恢复的易用性

生产实践

1. 自动化备份脚本示例

bash
#!/bin/bash
# DB2自动备份脚本

DB_NAME="sample"
BACKUP_PATH="/db2backup"
LOG_PATH="/db2backup/logs"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="${LOG_PATH}/backup_${DB_NAME}_${DATE}.log"

# 创建日志目录
mkdir -p ${LOG_PATH}

# 记录开始时间
echo "===== DB2 Backup Started at $(date) =====

## 常见问题(FAQ)

### Q1: 如何选择合适的备份类型?

A1: 选择备份类型需要考虑以下因素:
- **备份窗口**:全量备份所需时间较长,增量和差异备份时间较短
- **恢复时间目标(RTO)**:全量备份恢复时间短,增量和差异备份恢复时间长
- **存储成本**:全量备份存储空间需求大,增量和差异备份存储空间需求小
- **业务需求**:根据业务对可用性和数据完整性的要求选择

建议结合使用不同类型的备份,如每周执行一次全量备份,每天执行一次增量或差异备份。

### Q2: 备份命令执行失败怎么办?

A2: 备份命令执行失败时,应:
1. 查看命令输出的错误信息
2. 检查db2diag.log获取详细错误日志
3. 根据错误信息分析原因(如权限问题、存储空间不足、I/O错误等)
4. 采取相应的解决措施(如释放存储空间、修复I/O问题、调整备份参数等)
5. 重新执行备份命令

### Q3: 如何验证备份是否成功?

A3: 可以通过以下方式验证备份是否成功:
- 检查备份命令的返回码是否为0
- 检查备份目录中是否生成了备份文件
- 使用db2ckbkp命令验证备份文件的完整性:`db2ckbkp backup_file`
- 定期执行恢复测试,验证备份可以正常恢复

### Q4: 如何优化备份性能?

A4: 可以通过以下方式优化备份性能:
- 使用并行备份:通过增加PARALLELISM参数值提高备份并行度
- 使用压缩备份:通过添加COMPRESS参数减少备份数据量
- 优化存储I/O:使用高性能存储设备,如SSD
- 选择合适的备份窗口:在系统负载较低时执行备份
- 调整备份缓冲区大小:通过DB2 registry变量DB2_BACKUP_BUFFER设置合适的缓冲区大小

### Q5: 如何确保备份数据的安全性?

A5: 确保备份数据安全性的措施包括:
- 使用加密备份:通过添加ENCRYPT参数加密备份数据
- 存储备份到安全位置:将备份存储到安全的存储设备,限制访问权限
- 定期测试备份恢复:确保备份可以正常恢复
- 实施备份保留策略:定期清理过期备份,同时确保保留足够的备份历史
- 考虑异地备份:将备份复制到异地存储,防止本地灾难导致备份丢失

### Q6: 恢复命令执行失败怎么办?

A6: 恢复命令执行失败时,应:
1. 查看命令输出的错误信息
2. 检查db2diag.log获取详细错误日志
3. 根据错误信息分析原因(如备份损坏、日志缺失、权限问题等)
4. 采取相应的解决措施(如使用备用备份、修复权限、补充缺失的日志等)
5. 重新执行恢复命令

### Q7: 如何缩短恢复时间?

A7: 可以通过以下方式缩短恢复时间:
- 使用并行恢复:通过增加PARALLELISM参数值提高恢复并行度
- 使用压缩备份:减少备份数据量,提高恢复速度
- 优化存储I/O:使用高性能存储设备
- 合理规划备份策略:减少需要恢复的备份数量
- 考虑使用快照恢复:DB2 11.5+支持快照恢复,可以显著缩短恢复时间

### Q8: 如何恢复到特定时间点?

A8: 恢复到特定时间点需要使用不完全恢复,步骤如下:
1. 恢复最近的全量备份
2. 前滚到特定时间点,使用UNTIL TIME参数
3. 数据库将处于滚后暂挂状态,需要执行ROLLFORWARD DATABASE ... COMPLETE结束恢复

示例命令:
```bash
db2 restore database sample from /db2backup taken at 20231015143045
db2 rollforward database sample to 2023-10-15-16.30.00.000000 using local time and stop
db2 rollforward database sample complete

Q9: 如何恢复单个表?

A9: DB2 11.1+支持表级恢复,步骤如下:

  1. 确保数据库处于归档日志模式
  2. 执行表级恢复命令,指定要恢复的表
  3. 验证恢复结果

示例命令:

bash
db2 restore database sample tables (schema.table1, schema.table2) from /db2backup taken at 20231015143045
db2 rollforward database sample to end of logs tables (schema.table1, schema.table2) and stop

Q10: 如何从云存储恢复数据库?

A10: DB2 11.5+支持从云存储恢复数据库,步骤如下:

  1. 配置云存储访问凭证
  2. 使用RESTORE命令从云存储恢复,指定云存储URL
  3. 前滚数据库到最新状态

示例命令:

bash
db2 restore database sample from "S3::us-east-1::my-bucket::/db2backup" taken at 20231015143045
db2 rollforward database sample to end of logs and stop