1. 首页 > DB2教程 > 正文

DB2教程FG095-DB2在线维护实战

风哥教程参考DB2官方文档Online Maintenance、Administration等内容,详细介绍在线维护、在线重组、在线备份等。更多视频教程www.fgedu.net.cn

目录大纲

Part01-在线维护概述

1.1 在线维护定义

在线维护是在不停止业务的情况下进行的维护操作:

  • 在线重组:重组表和索引
  • 在线备份:在线备份数据库
  • 在线统计信息收集:收集统计信息
  • 在线表修改:修改表结构

1.2 在线维护优势

  • 不影响业务运行
  • 减少停机时间
  • 提高系统可用性
  • 降低维护成本

Part02-在线重组

2.1 在线重组表

# 在线重组表
REORG TABLE ORDERS INPLACE ALLOW WRITE ACCESS;

# 在线重组表并重建索引
REORG TABLE ORDERS INPLACE ALLOW WRITE ACCESS INDEX IDX_ORDERS;

# 在线重组表并指定临时表空间
REORG TABLE ORDERS INPLACE ALLOW WRITE ACCESS USE TEMPSPACE1;

# 查看重组进度
db2pd -db FGEDB -reorgs

# 暂停重组
REORG TABLE ORDERS INPLACE PAUSE;

# 恢复重组
REORG TABLE ORDERS INPLACE RESUME;

# 终止重组
REORG TABLE ORDERS INPLACE STOP;

# 离线重组表
REORG TABLE ORDERS;

# 重组索引
REORG INDEXES ALL FOR TABLE ORDERS;

2.2 在线重组脚本

#!/bin/bash
# online_reorg.sh

DBNAME=FGEDB
TABLE_NAME=$1

if [ -z “$TABLE_NAME” ]; then
echo “Usage: $0
exit 1
fi

echo “Starting online reorg for table: $TABLE_NAME”
echo “Time: $(date)”

db2 connect to $DBNAME

# 检查表是否需要重组
FRAG_PERCENT=$(db2 “SELECT REORG_ROWS FROM SYSIBMADM.ADMINTABINFO WHERE TABNAME=’$TABLE_NAME'” | tail -1 | awk ‘{print $1}’)

if [ -z “$FRAG_PERCENT” ] || [ “$FRAG_PERCENT” -lt 10 ]; then
echo “Table fragmentation is low, no reorg needed”
db2 connect reset
exit 0
fi

echo “Table fragmentation: $FRAG_PERCENT%”

# 执行在线重组
db2 “REORG TABLE $TABLE_NAME INPLACE ALLOW WRITE ACCESS”

# 检查重组状态
while true; do
STATUS=$(db2pd -db $DBNAME -reorgs | grep $TABLE_NAME | awk ‘{print $3}’)

if [ “$STATUS” = “COMPLETED” ]; then
echo “Reorg completed successfully”
break
elif [ “$STATUS” = “FAILED” ]; then
echo “Reorg failed”
break
else
echo “Reorg in progress: $STATUS”
sleep 60
fi
done

# 更新统计信息
db2 “RUNSTATS ON TABLE $TABLE_NAME WITH DISTRIBUTION AND INDEXES ALL”

db2 connect reset

echo “Online reorg completed”

Part03-在线备份

3.1 在线备份操作

# 在线全量备份
BACKUP DATABASE FGEDB ONLINE TO /db2backup COMPRESS;

# 在线增量备份
BACKUP DATABASE FGEDB ONLINE INCREMENTAL TO /db2backup COMPRESS;

# 在线表空间备份
BACKUP DATABASE FGEDB TABLESPACE USERSPACE1 ONLINE TO /db2backup;

# 在线备份到多个路径
BACKUP DATABASE FGEDB ONLINE TO /db2backup1, /db2backup2 COMPRESS;

# 在线备份并包括日志
BACKUP DATABASE FGEDB ONLINE TO /db2backup INCLUDE LOGS;

# 查看备份历史
LIST HISTORY BACKUP ALL FOR FGEDB;

# 查看备份状态
db2pd -db FGEDB -backup

3.2 在线备份脚本

#!/bin/bash
# online_backup.sh

DBNAME=FGEDB
BACKUP_DIR=/db2backup
DATE=$(date +%Y%m%d)
LOG_FILE=/db2/logs/backup_$DATE.log

echo “=== Online Backup ===” > $LOG_FILE
echo “Date: $(date)” >> $LOG_FILE

db2 connect to $DBNAME

# 检查数据库是否启用了归档日志
LOG_MODE=$(db2 “SELECT LOGARCHMETH1 FROM SYSIBMADM.DBMCFG” | tail -1 | awk ‘{print $1}’)

if [ “$LOG_MODE” = “OFF” ]; then
echo “Database is in circular logging mode, online backup not supported” >> $LOG_FILE
db2 connect reset
exit 1
fi

# 执行在线备份
echo “Starting online backup…” >> $LOG_FILE
db2 “BACKUP DATABASE $DBNAME ONLINE TO $BACKUP_DIR COMPRESS INCLUDE LOGS” >> $LOG_FILE 2>&1

if [ $? -eq 0 ]; then
echo “Backup completed successfully” >> $LOG_FILE

# 验证备份
BACKUP_FILE=$(ls -t $BACKUP_DIR/*.0 | head -1)
echo “Verifying backup: $BACKUP_FILE” >> $LOG_FILE
db2ckbkp $BACKUP_FILE >> $LOG_FILE 2>&1
else
echo “Backup failed” >> $LOG_FILE
fi

db2 connect reset

# 清理旧备份(保留7天)
find $BACKUP_DIR -name “*.0” -mtime +7 -exec rm -f {} \;

echo “Backup process completed” >> $LOG_FILE

Part04-在线维护脚本

4.1 在线统计信息收集

# 在线收集统计信息
RUNSTATS ON TABLE ORDERS WITH DISTRIBUTION AND INDEXES ALL;

# 在线收集表统计信息
RUNSTATS ON TABLE ORDERS ON ALL COLUMNS WITH DISTRIBUTION ON ALL COLUMNS;

# 在线收集索引统计信息
RUNSTATS ON TABLE ORDERS FOR INDEX IDX_ORDERS;

# 查看统计信息收集进度
db2pd -db FGEDB -runstats

# 自动统计信息收集脚本
#!/bin/bash
# auto_runstats.sh

DBNAME=FGEDB

db2 connect to $DBNAME

# 查找需要更新统计信息的表
db2 “SELECT TABNAME, CARD, STATS_TIME
FROM SYSCAT.TABLES
WHERE TABSCHEMA=’FGEDB’
AND (STATS_TIME IS NULL OR STATS_TIME < CURRENT TIMESTAMP - 7 DAYS) ORDER BY TABNAME" > /tmp/runstats_list.txt

# 对每个表执行统计信息收集
while read TABNAME CARD STATS_TIME; do
echo “Updating statistics for table: $TABNAME”
db2 “RUNSTATS ON TABLE FGEDB.$TABNAME WITH DISTRIBUTION AND INDEXES ALL”
done < /tmp/runstats_list.txt db2 connect reset

4.2 在线表修改

# 在线添加列
ALTER TABLE ORDERS ADD COLUMN DISCOUNT DECIMAL(5, 2) DEFAULT 0;

# 在线修改列
ALTER TABLE ORDERS ALTER COLUMN ORDER_AMOUNT SET DATA TYPE DECIMAL(20, 2);

# 在线添加索引
CREATE INDEX IDX_ORDERS_CUSTOMER ON ORDERS(CUSTOMER_ID);

# 在线删除索引
DROP INDEX IDX_ORDERS_OLD;

# 在线添加约束
ALTER TABLE ORDERS ADD CONSTRAINT CHK_ORDER_AMOUNT CHECK (ORDER_AMOUNT > 0);

# 在线修改表空间
ALTER TABLE ORDERS MOVE TO NEWTABLESPACE;

# 在线表维护脚本
#!/bin/bash
# online_table_maintenance.sh

DBNAME=FGEDB
TABLE_NAME=$1
OPERATION=$2

db2 connect to $DBNAME

case $OPERATION in
add_column)
db2 “ALTER TABLE $TABLE_NAME ADD COLUMN NEW_COLUMN VARCHAR(100)”
;;
modify_column)
db2 “ALTER TABLE $TABLE_NAME ALTER COLUMN OLD_COLUMN SET DATA TYPE VARCHAR(200)”
;;
add_index)
db2 “CREATE INDEX IDX_${TABLE_NAME}_NEW ON $TABLE_NAME(NEW_COLUMN)”
;;
drop_index)
db2 “DROP INDEX IDX_${TABLE_NAME}_OLD”
;;
add_constraint)
db2 “ALTER TABLE $TABLE_NAME ADD CONSTRAINT CHK_NEW CHECK (NEW_COLUMN IS NOT NULL)”
;;
*)
echo “Unknown operation: $OPERATION”
;;
esac

db2 connect reset

Part05-风哥经验总结与分享

5.1 在线维护要点

  • 选择低峰期执行
  • 监控维护进度
  • 评估性能影响
  • 制定回滚方案
  • 记录维护日志
  • 验证维护效果

5.2 维护建议

维护类型 执行频率 最佳时间
在线重组 每月 凌晨2-5点
在线备份 每日 凌晨1-3点
统计信息收集 每周 凌晨3-5点

5.3 运维要点

  • 制定维护计划
  • 选择低峰期执行
  • 监控维护进度
  • 评估性能影响
  • 记录维护日志
  • 验证维护效果
更多视频教程www.fgedu.net.cn
学习交流加群风哥微信: itpux-com
风哥Oracle/MySQL/PostgreSQL/Greenplum/DB2/Redis等数据库培训课程,10年一线实战经验,企业级培训,真正掌握数据库核心技术!

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息