在测试使用脚本清理数据库日志的时候,不小心误删了正在使用的活动日志,以至于再次登录数据库报错如下:

1
2
S0L1273N    An operation reading the logs on database "XXXX" cannot continue
because of a missing log file "S0000096.L0G" on database partition "o" and log stream "O".

从网络查询并找其他同事咨询,均无济于事;因为在此之前只是备份了部分关键表的数据,得到的结果都是需要重装然后追平数据;好在使用的云主机有快照功能,能恢复…

相关脚本

由于策略还没定,而恢复快照需要走流程,所以临时使用以下脚本统计并备份表数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash
DB_NAME="XXXX"
DB_USER="test"
DB_PASSWORD="123456"
SCHEMAS=("S1" "S2" "S3" "S4")

#登录数据库
db2 connect to ${DB_NAME} user ${DB_USER} using ${DB_PASSWORD}

#遍历每个模式
for SCHEMA_NAME in "${SCHEMAS[@]}"; do
echo "当前模式为:${SCHEMA_NAME}"

#查询当前模式下的所有表信息
TABLES=$(db2 -x "SELECT TABNAME FROM SYSCAT.TABLES WHERE TABSCHEMA='${SCHEMA_NAME}'")

for TABLE in ${TABLES}; do
echo "开始统计【${SCHEMA_NAME}】模式下的【${TABLE}】表"
#获取行数
ROW_COUNT=$(db2 -x "SELECT COUNT(*) FROM ${SCHEMA_NAME}.${TABLE}")
#获取字段数量
#COLUMN_COUNT=$(db2 -x "SELECT COUNT(*) FROM SYSCAT.COLUMNS WHERE TABSCHEMA='${SCHEMA_NAME}' AND TABNAME='${TABLE}'")
#获取最新的更新日期(假设有一个时间戳字段UPDATE_TIMESTAMP记录更新时间)
#LAST_UPDATE=$(db2 -x "SELECT MAX(UPDATE_TIMESTAMP) FROM ${SCHEMA_NAME}.${TABLE}")
LAST_UPDATE=$(db2 -x "SELECT STATS_TIME FROM SYSIBM.SYSTABLES WHERE CREATOR='${SCHEMA_NAME}' AND NAME='${TABLE}'")
echo "${SCHEMA_NAME}.${TABLE} 表最后更新日期为:${LAST_UPDATE},共有 ${ROW_COUNT} 行"
echo "${SCHEMA_NAME}.${TABLE} 表最后更新日期为:${LAST_UPDATE},共有 ${ROW_COUNT} 行" >> $(date +%Y%m%d).txt
echo "-------------------------------------"
#备份表(使用 EXPORT 命令:DEL 只导出数据不包含表结构信息、IXF 包含数据和表结构(元数据),使其更适合完整的数据迁移)
BACKUP_FILE="${SCHEMA_NAME}_${TABLE}_$(date +%Y%m%d%H%M%S).del"
db2 "EXPORT TO ${BACKUP_FILE} OF DEL SELECT * FROM ${SCHEMA_NAME}.${TABLE}"
echo "文件备份 ${BACKUP_FILE}"
echo "-------------------------------------"
done
done
#断开数据库连接
db2 terminate
echo "已完成所有表的统计和备份"

而清理日志脚本修改如下(如果有需要可以设置定时任务):
1
2
3
4
5
6
#获取日志存档路径
db2 get db cfg for ZXZXAMS | grep "First log archive method"
#替换以下 /path/to/log/ 的部分
cd /path/to/log/NODE0000/LOGSTREAM0000/C0000000
#删除 7 天前的数据
find -type f -mtime +7 -name "*.LOG" | xargs rm -rf

备份策略

经过了解,DB2 常见的备份策略总结如下:

完整备份 (Full Backup)

定义:备份整个数据库,包括所有表、数据和数据库对象。
优点:完整恢复快,适合小型数据库或每日业务低谷时备份。
缺点:对大型数据库,备份文件大,耗时较长。

增量备份 (Incremental Backup)

定义:仅备份自上次备份后发生更改的数据。
优点:减少备份时间和存储空间。
缺点:恢复时间长,因为需要从最后一次完整备份和所有增量备份恢复。

差异备份 (Delta Backup)

定义:备份自上次完整备份后发生更改的数据。
优点:恢复比增量备份快,只需最后一次完整备份和最后一次差异备份。
缺点:备份文件比增量备份大。

日志备份 (Log Backup)

定义:备份事务日志,这样即使没有运行增量备份,也能恢复到某一特定时间点。
优点:支持时间点恢复,提高数据保护。
缺点:需要管理和定期清理日志备份,以防止存储空间耗尽。

压缩备份 (Compressed Backup)

定义:对备份文件进行压缩以减少存储需求。
优点:减少备份存储空间需求,特别是对于大型数据库。
缺点:压缩过程会消耗一定的 CPU 资源。

镜像备份 (Mirrored Backup)

定义:在备份时,将备份数据复制到多个存储位置。
优点:提高数据冗余,防止单点故障。
缺点:需要额外的存储和资源。

在线备份 (Online Backup)

定义:在数据库运行时进行备份,无需关闭数据库。
优点:业务连续性高,特别适合 24/7 运行的数据库。
缺点:备份期间数据库性能可能会下降。

备份方案

DB2 备份方案的选择和实施取决于数据库大小、可用资源、数据恢复时间要求以及业务连续性计划。

备份数据

全备份 (Full Backup)

频率:每周一次。

1
db2 BACKUP DATABASE yourdb TO /backup/path WITH 2 BUFFERS BUFFER 1024 PARALLELISM 1 WITHOUT PROMPTING

增量备份 (Incremental Backup)

频率:每天一次(全备份之外的其他时间)。

1
db2 BACKUP DATABASE yourdb INCREMENTAL TO /backup/path WITHOUT PROMPTING

日志备份 (Log Backup)

频率:每小时一次。

1
db2 BACKUP DATABASE yourdb ONLINE USE LOGS TO /backup/path WITHOUT PROMPTING

压缩备份 (Compressed Backup)

频率:适用于所有类型的备份(全备份、增量备份、日志备份),按需

1
db2 BACKUP DATABASE yourdb TO /backup/path COMPRESS YES WITHOUT PROMPTING

备份存储与管理

多副本备份:将备份文件存储在多个位置,包括本地和远程存储,以防止单点故障。
备份文件检查:定期使用 db2ckbkp 命令检查备份文件的完整性。

1
db2ckbkp -h /backup/path/yourdb.0.db2inst1.NODE0000.CATN0000.20240814.221402.001

异地备份:将备份文件复制到异地存储,确保在物理灾难情况下的数据安全。

恢复备份

数据库崩溃恢复 (Crash Recovery)

适用场景:数据库突然崩溃,需要从最近的日志备份中恢复。

1
2
3
4
5
6
##恢复最近的全备份
db2 RESTORE DATABASE yourdb FROM /backup/path TAKEN AT timestamp WITHOUT ROLLING FORWARD
##应用增量备份(如有)
db2 RESTORE DATABASE yourdb INCREMENTAL FROM /backup/path TAKEN AT timestamp
##应用日志备份
db2 ROLLFORWARD DATABASE yourdb TO END OF LOGS AND COMPLETE

时间点恢复 (Point-in-Time Recovery)

适用场景:需要将数据库恢复到某一特定时间点。

1
2
3
4
5
6
恢复最近的全备份
db2 RESTORE DATABASE yourdb FROM /backup/path TAKEN AT timestamp WITHOUT ROLLING FORWARD
应用增量备份(如有)
db2 RESTORE DATABASE yourdb INCREMENTAL FROM /backup/path TAKEN AT timestamp
应用日志备份,指定时间点
db2 ROLLFORWARD DATABASE yourdb TO timestamp USING LOCAL TIME AND STOP

表空间恢复 (Tablespace Recovery)

适用场景:特定表空间损坏或数据丢失。

1
2
3
4
5
##将表空间置为恢复模式
db2 RESTORE TABLESPACE tablespace_name ONLINE
db2 RESTORE DATABASE yourdb TABLESPACE (tablespace_name) FROM /backup/path TAKEN AT timestamp
##应用日志备份
db2 ROLLFORWARD DATABASE yourdb TO END OF LOGS AND COMPLETE TABLESPACE (tablespace_name)