GoldenGate教程FG059-OGG进程监控与自动重启脚本开发实战
本文档风哥主要介绍Oracle GoldenGate进程监控与自动重启脚本开发实战方法,包括监控概念、关键指标、监控脚本开发、自动重启脚本、监控系统集成等内容,风哥教程参考GoldenGate官方文档监控管理、运维最佳实践等内容,适合需要建立OGG监控运维体系的运维人员参考。
Part01-基础概念与理论知识
1.1 OGG进程监控概念
OGG进程监控是保障数据同步稳定运行的重要手段。通过监控可以及时发现和处理问题,确保数据同步的连续性和一致性。更多视频教程www.fgedu.net.cn
- 及时发现进程异常
- 监控同步延迟
- 预警潜在问题
- 支持快速故障恢复
- 保障数据一致性
# 1. Manager进程
功能:管理其他OGG进程
监控重点:
– 进程运行状态
– 端口监听状态
– 资源使用情况
– 日志错误信息
# 2. Extract进程
功能:捕获源端数据变更
监控重点:
– 进程运行状态
– 延迟时间(Lag)
– Trail文件生成
– 数据库日志读取位置
– 错误队列
# 3. Data Pump进程
功能:传输Trail文件
监控重点:
– 进程运行状态
– 网络传输状态
– Trail文件发送位置
– 传输延迟
# 4. Replicat进程
功能:应用数据到目标端
监控重点:
– 进程运行状态
– 延迟时间(Lag)
– Trail文件读取位置
– 数据应用速度
– 冲突和错误
# 监控架构示意
+——————-+
| 监控中心 |
| (Zabbix/Prometheus)|
+——————-+
|
v
+——————-+
| 监控Agent |
| (自定义脚本) |
+——————-+
|
v
+——————-+
| OGG进程 |
| Manager/Extract/ |
| Replicat |
+——————-+
1.2 关键监控指标
建立完善的监控指标体系是监控工作的基础:
| 指标名称 | 说明 | 告警阈值 | 采集方式 |
|——————|————————|—————-|————|
| 进程状态 | RUNNING/STOPPED/ABENDED| 非RUNNING告警 | GGSCI INFO |
| 进程PID | 操作系统进程ID | 不存在告警 | GGSCI INFO |
| 运行时间 | 进程持续运行时间 | – | GGSCI INFO |
# 延迟指标
| 指标名称 | 说明 | 告警阈值 | 采集方式 |
|——————|————————|—————-|————|
| Checkpoint Lag | 检查点延迟 | >60秒警告 | GGSCI INFO |
| Time Since Chkpt | 距上次检查点时间 | >300秒告警 | GGSCI INFO |
| Total Lag | 总延迟时间 | >300秒严重告警 | GGSCI LAG |
# 性能指标
| 指标名称 | 说明 | 告警阈值 | 采集方式 |
|——————|————————|—————-|————|
| 每秒事务数 | TPS处理能力 | <阈值警告 | GGSCI STATS|
| 每秒记录数 | RPS处理能力 | <阈值警告 | GGSCI STATS|
| 内存使用 | 进程内存占用 | >80%警告 | 操作系统 |
| CPU使用 | 进程CPU占用 | >80%警告 | 操作系统 |
# 存储指标
| 指标名称 | 说明 | 告警阈值 | 采集方式 |
|——————|————————|—————-|————|
| Trail文件大小 | Trail目录总大小 | >80%容量警告 | 文件系统 |
| Trail文件数量 | Trail文件数量 | 过多警告 | 文件系统 |
| 磁盘空间 | 存储空间使用率 | >80%警告 | 文件系统 |
| 磁盘IO | IO等待时间 | >50ms警告 | 操作系统 |
# 错误指标
| 指标名称 | 说明 | 告警阈值 | 采集方式 |
|——————|————————|—————-|————|
| 错误日志条数 | 错误日志中的错误数量 | >0告警 | 日志分析 |
| 丢弃记录数 | 被丢弃的记录数 | >0告警 | GGSCI STATS|
| 重试次数 | 操作重试次数 | >阈值警告 | 日志分析 |
1.3 监控方法分类
OGG提供多种监控方法,可根据需求选择:
优点:
– 原生支持
– 信息详细
– 实时性好
缺点:
– 需要手动执行
– 不便于集成
常用命令:
GGSCI> INFO ALL # 查看所有进程状态
GGSCI> INFO EXTRACT E_FGEDU01 # 查看Extract详情
GGSCI> LAG EXTRACT E_FGEDU01 # 查看延迟
GGSCI> STATS EXTRACT E_FGEDU01 # 查看统计信息
GGSCI> VIEW REPORT E_FGEDU01 # 查看报告
# 方法2:OGG监控代理
优点:
– 自动采集
– 支持多种监控平台
– 配置灵活
缺点:
– 需要额外安装
– 配置复杂
支持平台:
– Oracle Enterprise Manager
– Zabbix
– Prometheus
– Nagios
# 方法3:自定义脚本监控
优点:
– 灵活定制
– 可集成告警
– 自动化程度高
缺点:
– 需要开发维护
– 功能依赖开发
常用技术:
– Shell脚本
– Python脚本
– GGSCI命令
– REST API
# 方法4:OGG内置告警
优点:
– 配置简单
– 实时告警
缺点:
– 功能有限
– 依赖邮件服务
配置方式:
— Manager参数文件
MAILPROG /usr/sbin/sendmail
MAILALERTS ALL
MAILOPTIONS FROM “ogg@fgedu.net.cn” TO “dba@fgedu.net.cn”
Part02-生产环境规划与建议
2.1 监控体系规划
建立完善的监控体系需要系统规划:
- 确定监控对象和范围
- 设计监控指标体系
- 选择监控工具平台
- 制定告警策略
- 建立响应机制
# 第一层:基础监控
– 服务器资源监控(CPU、内存、磁盘、网络)
– 操作系统监控(进程、日志、服务)
– 数据库监控(连接、会话、性能)
# 第二层:OGG进程监控
– Manager进程监控
– Extract进程监控
– Data Pump进程监控
– Replicat进程监控
# 第三层:业务监控
– 数据同步延迟监控
– 数据一致性监控
– 业务指标监控
# 第四层:告警通知
– 邮件告警
– 短信告警
– 企业微信/钉钉告警
– 自动化处理
# 监控采集频率规划
| 监控项 | 采集频率 | 告警检查频率 |
|—————-|———–|—————|
| 进程状态 | 30秒 | 30秒 |
| 延迟指标 | 1分钟 | 1分钟 |
| 性能指标 | 5分钟 | 5分钟 |
| 存储指标 | 5分钟 | 5分钟 |
| 错误日志 | 1分钟 | 实时 |
# 监控数据保留策略
| 数据类型 | 保留时间 | 存储方式 |
|—————-|———–|—————|
| 实时数据 | 24小时 | 内存 |
| 历史数据 | 30天 | 数据库 |
| 告警记录 | 90天 | 数据库 |
| 日志文件 | 30天 | 文件系统 |
2.2 告警策略规划
合理的告警策略可以及时发现和处理问题:
| 级别 | 名称 | 说明 | 响应时间 | 通知方式 |
|——-|———|————————|———–|—————|
| P1 | 严重 | 数据同步中断 | 5分钟 | 电话+短信+邮件 |
| P2 | 高 | 进程异常/延迟过大 | 15分钟 | 短信+邮件 |
| P3 | 中 | 性能下降/资源告警 | 30分钟 | 邮件 |
| P4 | 低 | 信息通知 | 24小时 | 邮件 |
# 告警规则配置
# 进程状态告警
规则:进程状态非RUNNING
级别:P1
条件:连续3次检测异常
动作:自动重启+告警通知
# 延迟告警
规则1:Checkpoint Lag > 60秒
级别:P3
条件:持续5分钟
动作:告警通知
规则2:Checkpoint Lag > 300秒
级别:P2
条件:持续5分钟
动作:告警通知+自动处理
规则3:Checkpoint Lag > 600秒
级别:P1
条件:持续5分钟
动作:告警通知+升级处理
# 存储告警
规则:磁盘使用率 > 80%
级别:P3
条件:持续10分钟
动作:告警通知
规则:磁盘使用率 > 90%
级别:P2
条件:持续5分钟
动作:告警通知+自动清理
# 告警抑制策略
– 同一告警5分钟内不重复发送
– 夜间(22:00-08:00)P3/P4级别告警延迟发送
– 维护窗口期间暂停告警
– 告警恢复后发送恢复通知
2.3 自动化运维规划
自动化运维可以提高效率,减少人为错误:
# 场景1:进程自动重启
触发条件:进程异常停止
执行动作:
1. 检查进程状态
2. 尝试自动重启
3. 记录操作日志
4. 发送告警通知
# 场景2:延迟自动处理
触发条件:延迟超过阈值
执行动作:
1. 分析延迟原因
2. 调整进程参数
3. 增加处理资源
4. 发送处理报告
# 场景3:存储自动清理
触发条件:磁盘空间不足
执行动作:
1. 清理过期Trail文件
2. 清理过期日志文件
3. 清理临时文件
4. 发送清理报告
# 场景4:健康检查
触发条件:定时执行
执行动作:
1. 检查所有进程状态
2. 检查延迟情况
3. 检查存储空间
4. 生成健康报告
# 自动化脚本目录结构
/GoldenGate/app/scripts/
├── monitor/
│ ├── ogg_status_check.sh # 状态检查
│ ├── ogg_lag_check.sh # 延迟检查
│ └── ogg_health_check.sh # 健康检查
├── auto/
│ ├── ogg_auto_restart.sh # 自动重启
│ ├── ogg_auto_cleanup.sh # 自动清理
│ └── ogg_auto_tuning.sh # 自动调优
├── alert/
│ ├── send_email.sh # 邮件告警
│ ├── send_sms.sh # 短信告警
│ └── send_wechat.sh # 微信告警
└── report/
├── daily_report.sh # 日报生成
└── weekly_report.sh # 周报生成
Part03-生产环境项目实施方案
3.1 进程监控脚本开发实战
3.1.1 基础状态监控脚本
#!/bin/bash
# ogg_status_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
OGG_HOME=/GoldenGate/app
LOG_FILE=/GoldenGate/app/logs/monitor.log
ALERT_SCRIPT=/GoldenGate/app/scripts/alert/send_alert.sh
log_message() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” >> $LOG_FILE
}
# 获取OGG进程状态
get_ogg_status() {
cd $OGG_HOME
echo “INFO ALL” | ./ggsci | grep -E “MANAGER|EXTRACT|REPLICAT” | while read line; do
program=$(echo $line | awk ‘{print $1}’)
status=$(echo $line | awk ‘{print $2}’)
group=$(echo $line | awk ‘{print $3}’)
lag=$(echo $line | awk ‘{print $4}’)
echo “$program|$status|$group|$lag”
done
}
# 检查进程状态
check_status() {
get_ogg_status | while IFS=’|’ read program status group lag; do
if [ “$status” != “RUNNING” ]; then
log_message “告警: $program $group 状态异常: $status”
$ALERT_SCRIPT “P1” “OGG进程异常” “$program $group 状态: $status”
fi
# 检查延迟
if [ “$lag” != “00:00:00” ] && [ -n “$lag” ]; then
lag_seconds=$(echo $lag | awk -F: ‘{print ($1*3600)+($2*60)+$3}’)
if [ $lag_seconds -gt 300 ]; then
log_message “告警: $program $group 延迟过大: $lag”
$ALERT_SCRIPT “P2” “OGG延迟告警” “$program $group 延迟: $lag”
fi
fi
done
}
# 主程序
log_message “开始OGG状态检查”
check_status
log_message “OGG状态检查完成”
# 步骤2:设置执行权限
$ chmod +x /GoldenGate/app/scripts/monitor/ogg_status_check.sh
# 步骤3:测试执行
$ /GoldenGate/app/scripts/monitor/ogg_status_check.sh
[2026-04-10 10:00:00] 开始OGG状态检查
[2026-04-10 10:00:01] OGG状态检查完成
# 步骤4:设置定时任务
$ crontab -e
*/1 * * * * /GoldenGate/app/scripts/monitor/ogg_status_check.sh >> /GoldenGate/app/logs/cron.log 2>&1
3.1.2 详细监控脚本
# ogg_detail_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
OGG_HOME=/GoldenGate/app
LOG_FILE=/GoldenGate/app/logs/detail_monitor.log
METRICS_FILE=/GoldenGate/app/logs/ogg_metrics.txt
log_message() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” >> $LOG_FILE
}
# 获取Extract进程详细信息
get_extract_info() {
local extract_name=$1
cd $OGG_HOME
info_output=$(echo “INFO EXTRACT $extract_name, DETAIL” | ./ggsci 2>/dev/null)
# 解析关键信息
status=$(echo “$info_output” | grep “Status” | awk ‘{print $2}’)
checkpoint_lag=$(echo “$info_output” | grep “Checkpoint Lag” | awk ‘{print $3}’)
time_since=$(echo “$info_output” | grep “Time Since Chkpt” | awk ‘{print $4}’)
trail_seq=$(echo “$info_output” | grep “Trail File Seqno” | awk ‘{print $4}’)
trail_rba=$(echo “$info_output” | grep “Trail File RBA” | awk ‘{print $4}’)
echo “EXTRACT|$extract_name|$status|$checkpoint_lag|$time_since|$trail_seq|$trail_rba”
}
# 获取Replicat进程详细信息
get_replicat_info() {
local replicat_name=$1
cd $OGG_HOME
info_output=$(echo “INFO REPLICAT $replicat_name, DETAIL” | ./ggsci 2>/dev/null)
status=$(echo “$info_output” | grep “Status” | awk ‘{print $2}’)
checkpoint_lag=$(echo “$info_output” | grep “Checkpoint Lag” | awk ‘{print $3}’)
time_since=$(echo “$info_output” | grep “Time Since Chkpt” | awk ‘{print $4}’)
trail_rba=$(echo “$info_output” | grep “Trail File RBA” | awk ‘{print $4}’)
echo “REPLICAT|$replicat_name|$status|$checkpoint_lag|$time_since|$trail_rba”
}
# 获取统计信息
get_stats() {
local process_name=$1
cd $OGG_HOME
stats_output=$(echo “STATS $process_name, TOTALSONLY” | ./ggsci 2>/dev/null)
total_inserts=$(echo “$stats_output” | grep “Total inserts” | awk ‘{print $3}’)
total_updates=$(echo “$stats_output” | grep “Total updates” | awk ‘{print $3}’)
total_deletes=$(echo “$stats_output” | grep “Total deletes” | awk ‘{print $3}’)
echo “$process_name|$total_inserts|$total_updates|$total_deletes”
}
# 收集所有指标
collect_metrics() {
echo “timestamp=$(date ‘+%Y-%m-%d %H:%M:%S’)” > $METRICS_FILE
# 获取所有进程列表
cd $OGG_HOME
processes=$(echo “INFO ALL” | ./ggsci | grep -E “EXTRACT|REPLICAT” | awk ‘{print $3}’)
for proc in $processes; do
proc_type=$(echo “INFO ALL” | ./ggsci | grep $proc | awk ‘{print $1}’)
if [ “$proc_type” = “EXTRACT” ]; then
get_extract_info $proc >> $METRICS_FILE
elif [ “$proc_type” = “REPLICAT” ]; then
get_replicat_info $proc >> $METRICS_FILE
fi
get_stats $proc >> $METRICS_FILE
done
}
# 主程序
log_message “开始详细监控采集”
collect_metrics
log_message “详细监控采集完成”
# 输出指标文件内容
cat $METRICS_FILE
# 执行结果示例
timestamp=2026-04-10 10:00:00
EXTRACT|E_FGEDU01|RUNNING|00:00:00|00:00:05|123|456789
E_FGEDU01|10000|5000|1000
REPLICAT|R_FGEDU01|RUNNING|00:00:00|00:00:03|456789
R_FGEDU01|10000|5000|1000
3.2 自动重启脚本开发实战
3.2.1 进程自动重启脚本
# ogg_auto_restart.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
OGG_HOME=/GoldenGate/app
LOG_FILE=/GoldenGate/app/logs/auto_restart.log
MAX_RETRIES=3
RETRY_INTERVAL=60
log_message() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” >> $LOG_FILE
}
# 检查进程状态
check_process_status() {
local process_name=$1
cd $OGG_HOME
status=$(echo “INFO EXTRACT $process_name” | ./ggsci 2>/dev/null | grep “Status” | awk ‘{print $2}’)
if [ -z “$status” ]; then
status=$(echo “INFO REPLICAT $process_name” | ./ggsci 2>/dev/null | grep “Status” | awk ‘{print $2}’)
fi
echo $status
}
# 启动进程
start_process() {
local process_name=$1
local process_type=$2
cd $OGG_HOME
if [ “$process_type” = “EXTRACT” ]; then
echo “START EXTRACT $process_name” | ./ggsci
elif [ “$process_type” = “REPLICAT” ]; then
echo “START REPLICAT $process_name” | ./ggsci
fi
sleep 5
new_status=$(check_process_status $process_name)
if [ “$new_status” = “RUNNING” ]; then
log_message “成功: $process_name 已重启”
return 0
else
log_message “失败: $process_name 重启失败”
return 1
fi
}
# 自动重启逻辑
auto_restart() {
local process_name=$1
local process_type=$2
log_message “检测到 $process_name 状态异常,尝试自动重启”
retry_count=0
while [ $retry_count -lt $MAX_RETRIES ]; do
retry_count=$((retry_count + 1))
log_message “第 $retry_count 次尝试重启 $process_name”
if start_process $process_name $process_type; then
# 发送成功通知
/GoldenGate/app/scripts/alert/send_alert.sh “P2” “OGG进程自动重启成功” “$process_name 已自动重启成功”
return 0
fi
sleep $RETRY_INTERVAL
done
# 重启失败,发送严重告警
log_message “严重: $process_name 自动重启失败,已达最大重试次数”
/GoldenGate/app/scripts/alert/send_alert.sh “P1” “OGG进程自动重启失败” “$process_name 自动重启失败,需要人工介入”
return 1
}
# 主监控循环
main() {
log_message “开始OGG进程自动监控”
cd $OGG_HOME
processes=$(echo “INFO ALL” | ./ggsci | grep -E “EXTRACT|REPLICAT” | awk ‘{print $1″ “$3}’)
while read proc_type proc_name; do
status=$(check_process_status $proc_name)
if [ “$status” != “RUNNING” ]; then
log_message “告警: $proc_type $proc_name 状态: $status”
auto_restart $proc_name $proc_type
fi
done <<< "$processes"
log_message "OGG进程自动监控完成"
}
main
# 执行结果示例
[2026-04-10 10:00:00] 开始OGG进程自动监控
[2026-04-10 10:00:01] 告警: EXTRACT E_FGEDU01 状态: STOPPED
[2026-04-10 10:00:01] 检测到 E_FGEDU01 状态异常,尝试自动重启
[2026-04-10 10:00:01] 第 1 次尝试重启 E_FGEDU01
[2026-04-10 10:00:06] 成功: E_FGEDU01 已重启
[2026-04-10 10:00:06] OGG进程自动监控完成
3.2.2 延迟自动处理脚本
# ogg_lag_handler.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
OGG_HOME=/GoldenGate/app
LOG_FILE=/GoldenGate/app/logs/lag_handler.log
LAG_THRESHOLD=300
log_message() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” >> $LOG_FILE
}
# 获取延迟秒数
get_lag_seconds() {
local process_name=$1
cd $OGG_HOME
lag=$(echo “LAG $process_name” | ./ggsci 2>/dev/null | grep “Last record lag” | awk ‘{print $4}’)
if [ -n “$lag” ]; then
# 转换为秒
hours=$(echo $lag | cut -d: -f1)
minutes=$(echo $lag | cut -d: -f2)
seconds=$(echo $lag | cut -d: -f3)
echo $((hours*3600 + minutes*60 + seconds))
else
echo 0
fi
}
# 分析延迟原因
analyze_lag_cause() {
local process_name=$1
cd $OGG_HOME
log_message “分析 $process_name 延迟原因…”
# 检查数据库性能
db_status=$(echo “INFO $process_name” | ./ggsci 2>/dev/null | grep -i “error” | head -5)
if [ -n “$db_status” ]; then
log_message “发现数据库相关错误: $db_status”
return 1
fi
# 检查网络状态
if echo “INFO $process_name” | ./ggsci 2>/dev/null | grep -qi “network”; then
log_message “发现网络相关问题”
return 2
fi
# 检查资源使用
cpu_usage=$(top -bn1 | grep “Cpu(s)” | awk ‘{print $2}’ | cut -d% -f1)
if [ $(echo “$cpu_usage > 80” | bc) -eq 1 ]; then
log_message “CPU使用率过高: $cpu_usage%”
return 3
fi
log_message “未发现明显延迟原因”
return 0
}
# 自动处理延迟
handle_lag() {
local process_name=$1
local lag_seconds=$2
log_message “开始处理 $process_name 延迟,当前延迟: ${lag_seconds}秒”
# 分析延迟原因
analyze_lag_cause $process_name
cause=$?
case $cause in
1)
log_message “数据库问题,尝试优化参数”
# 调整Extract参数
cd $OGG_HOME
echo “SEND EXTRACT $process_name, TRANLOGOPTIONS MAXBUFSIZE 1048576” | ./ggsci
;;
2)
log_message “网络问题,尝试重连”
cd $OGG_HOME
echo “STOP EXTRACT $process_name” | ./ggsci
sleep 10
echo “START EXTRACT $process_name” | ./ggsci
;;
3)
log_message “资源问题,尝试优化”
# 清理临时文件
find /GoldenGate/app/dirtmp -type f -mtime +1 -delete
;;
*)
log_message “未知原因,发送告警”
/GoldenGate/app/scripts/alert/send_alert.sh “P2” “OGG延迟告警” “$process_name 延迟 ${lag_seconds}秒,原因未知”
;;
esac
}
# 主程序
main() {
log_message “开始OGG延迟监控”
cd $OGG_HOME
processes=$(echo “INFO ALL” | ./ggsci | grep -E “EXTRACT|REPLICAT” | awk ‘{print $3}’)
for proc in $processes; do
lag_seconds=$(get_lag_seconds $proc)
if [ $lag_seconds -gt $LAG_THRESHOLD ]; then
log_message “告警: $proc 延迟 ${lag_seconds}秒,超过阈值 ${LAG_THRESHOLD}秒”
handle_lag $proc $lag_seconds
fi
done
log_message “OGG延迟监控完成”
}
main
# 执行结果示例
[2026-04-10 10:00:00] 开始OGG延迟监控
[2026-04-10 10:00:01] 告警: E_FGEDU01 延迟 350秒,超过阈值 300秒
[2026-04-10 10:00:01] 开始处理 E_FGEDU01 延迟,当前延迟: 350秒
[2026-04-10 10:00:01] 分析 E_FGEDU01 延迟原因…
[2026-04-10 10:00:02] 未发现明显延迟原因
[2026-04-10 10:00:02] OGG延迟监控完成
from GoldenGate视频:www.itpux.com
3.3 监控系统集成实战
3.3.1 Zabbix监控集成
#!/bin/bash
# zabbix_ogg_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
OGG_HOME=/GoldenGate/app
case “$1” in
discovery)
# 发现所有OGG进程
cd $OGG_HOME
echo “{”
echo ” \”data\”:[”
first=1
echo “INFO ALL” | ./ggsci | grep -E “EXTRACT|REPLICAT” | while read line; do
proc_type=$(echo $line | awk ‘{print $1}’)
proc_name=$(echo $line | awk ‘{print $3}’)
if [ $first -eq 1 ]; then
first=0
else
echo “,”
fi
echo -n ” {\”{#OGG_PROCESS}\”:\”$proc_name\”,\”{#OGG_TYPE}\”:\”$proc_type\”}”
done
echo “”
echo ” ]”
echo “}”
;;
status)
# 获取进程状态
proc_name=$2
cd $OGG_HOME
status=$(echo “INFO EXTRACT $proc_name 2>/dev/null || INFO REPLICAT $proc_name” | ./ggsci | grep “Status” | awk ‘{print $2}’)
case $status in
RUNNING) echo 1 ;;
STOPPED) echo 0 ;;
ABENDED) echo 2 ;;
*) echo -1 ;;
esac
;;
lag)
# 获取延迟秒数
proc_name=$2
cd $OGG_HOME
lag=$(echo “LAG $proc_name” | ./ggsci 2>/dev/null | grep “Last record lag” | awk ‘{print $4}’)
if [ -n “$lag” ]; then
hours=$(echo $lag | cut -d: -f1)
minutes=$(echo $lag | cut -d: -f2)
seconds=$(echo $lag | cut -d: -f3)
echo $((hours*3600 + minutes*60 + seconds))
else
echo 0
fi
;;
*)
echo “用法: $0 {discovery|status|lag} [process_name]”
exit 1
;;
esac
# 步骤2:配置Zabbix Agent
$ vi /etc/zabbix/zabbix_agentd.d/ogg.conf
UserParameter=ogg.discovery,/GoldenGate/app/scripts/zabbix_ogg_monitor.sh discovery
UserParameter=ogg.status[*],/GoldenGate/app/scripts/zabbix_ogg_monitor.sh status $1
UserParameter=ogg.lag[*],/GoldenGate/app/scripts/zabbix_ogg_monitor.sh lag $1
# 步骤3:重启Zabbix Agent
$ systemctl restart zabbix-agent
# 步骤4:测试Zabbix监控
$ zabbix_get -s 127.0.0.1 -k ogg.discovery
{
“data”:[
{“{#OGG_PROCESS}”:”E_FGEDU01″,”{#OGG_TYPE}”:”EXTRACT”},
{“{#OGG_PROCESS}”:”R_FGEDU01″,”{#OGG_TYPE}”:”REPLICAT”}
]
}
$ zabbix_get -s 127.0.0.1 -k “ogg.status[E_FGEDU01]”
1
$ zabbix_get -s 127.0.0.1 -k “ogg.lag[E_FGEDU01]”
0
3.3.2 告警通知脚本
# send_alert.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
ALERT_LEVEL=$1
ALERT_TITLE=$2
ALERT_MESSAGE=$3
LOG_FILE=/GoldenGate/app/logs/alert.log
log_alert() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] [$ALERT_LEVEL] $ALERT_TITLE: $ALERT_MESSAGE” >> $LOG_FILE
}
# 发送邮件告警
send_email() {
local subject=”[$ALERT_LEVEL] OGG告警: $ALERT_TITLE”
local body=”告警级别: $ALERT_LEVEL\n告警标题: $ALERT_TITLE\n告警内容: $ALERT_MESSAGE\n告警时间: $(date)\n服务器: $(hostname)”
echo -e “$body” | mail -s “$subject” dba@fgedu.net.cn
}
# 发送企业微信告警
send_wechat() {
local webhook=”https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your-key”
local json_data=$(cat <
}
}
EOF
)
curl -s -X POST -H ‘Content-Type: application/json’ -d “$json_data” $webhook
}
# 发送短信告警
send_sms() {
local phones=”13800138000,13900139000″
local message=”【OGG告警】[$ALERT_LEVEL] $ALERT_TITLE: $ALERT_MESSAGE”
# 调用短信接口
curl -s “http://sms-api/send?phones=$phones&message=$message”
}
# 根据告警级别发送通知
case $ALERT_LEVEL in
P1)
send_email
send_wechat
send_sms
;;
P2)
send_email
send_wechat
;;
P3|P4)
send_email
;;
*)
send_email
;;
esac
log_alert
# 执行示例
$ ./send_alert.sh P1 “进程异常” “E_FGEDU01进程已停止”
[2026-04-10 10:00:00] [P1] 进程异常: E_FGEDU01进程已停止
Part04-生产案例与实战讲解
4.1 企业级监控方案案例
某大型企业OGG监控方案实施案例:
– 环境:10套OGG同步链路
– 要求:7×24小时监控
– 告警:5分钟内响应
# 监控架构
+——————-+
| Grafana仪表板 |
+——————-+
|
+——————-+
| Prometheus |
| 数据存储 |
+——————-+
|
+——————-+
| Node Exporter |
| OGG Exporter |
+——————-+
|
+——————-+
| OGG进程 |
+——————-+
# 监控指标配置
# prometheus.yml
scrape_configs:
– job_name: ‘ogg’
static_configs:
– targets: [‘192.168.1.100:9101’, ‘192.168.1.101:9101’]
metrics_path: /metrics
scrape_interval: 30s
# 告警规则
# alert_rules.yml
groups:
– name: ogg_alerts
rules:
– alert: OGGProcessDown
expr: ogg_process_status != 1
for: 1m
labels:
severity: critical
annotations:
summary: “OGG进程异常”
description: “进程 {{ $labels.process }} 状态异常”
– alert: OGGLagHigh
expr: ogg_process_lag_seconds > 300
for: 5m
labels:
severity: warning
annotations:
summary: “OGG延迟过高”
description: “进程 {{ $labels.process }} 延迟 {{ $value }}秒”
# 监控效果
– 实时监控所有OGG进程
– 延迟超过阈值自动告警
– 自动重启异常进程
– 历史数据可追溯
– 可视化仪表板展示
4.2 监控常见问题处理
# 现象
脚本执行时间过长,导致监控数据延迟
# 解决方案
# 1. 优化脚本执行效率
# 2. 设置超时时间
timeout 30s ./ogg_status_check.sh
# 3. 使用后台执行
./ogg_status_check.sh &
# 问题2:告警风暴
# 现象
同一告警重复发送多次
# 解决方案
# 1. 添加告警抑制逻辑
ALERT_CACHE=/tmp/ogg_alert_cache
CACHE_EXPIRE=300
check_alert_cache() {
local alert_key=$1
local cache_file=”${ALERT_CACHE}/${alert_key}”
if [ -f “$cache_file” ]; then
last_time=$(cat $cache_file)
current_time=$(date +%s)
if [ $((current_time – last_time)) -lt $CACHE_EXPIRE ]; then
return 1
fi
fi
echo $(date +%s) > $cache_file
return 0
}
# 问题3:自动重启失败
# 现象
进程自动重启后仍然异常
# 解决方案
# 1. 检查进程错误日志
GGSCI> VIEW REPORT process_name
# 2. 检查数据库连接
sqlplus fgedu/fgedu@fgedudb
# 3. 检查Trail文件
ls -la /GoldenGate/app/dirdat/
# 4. 手动处理
GGSCI> STOP process_name
GGSCI> START process_name
4.3 监控解决方案
#!/bin/bash
# ogg_complete_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
OGG_HOME=/GoldenGate/app
LOG_FILE=/GoldenGate/app/logs/complete_monitor.log
METRICS_DIR=/GoldenGate/app/logs/metrics
mkdir -p $METRICS_DIR
log_message() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1″ >> $LOG_FILE
}
# 收集所有监控数据
collect_all_metrics() {
local timestamp=$(date ‘+%Y%m%d_%H%M%S’)
local metrics_file=”${METRICS_DIR}/metrics_${timestamp}.txt”
cd $OGG_HOME
# 进程状态
echo “=== 进程状态 ===” > $metrics_file
echo “INFO ALL” | ./ggsci >> $metrics_file
# 延迟信息
echo “” >> $metrics_file
echo “=== 延迟信息 ===” >> $metrics_file
for proc in $(echo “INFO ALL” | ./ggsci | grep -E “EXTRACT|REPLICAT” | awk ‘{print $3}’); do
echo “LAG $proc” | ./ggsci >> $metrics_file
done
# 统计信息
echo “” >> $metrics_file
echo “=== 统计信息 ===” >> $metrics_file
for proc in $(echo “INFO ALL” | ./ggsci | grep -E “EXTRACT|REPLICAT” | awk ‘{print $3}’); do
echo “STATS $proc, TOTALSONLY” | ./ggsci >> $metrics_file
done
# 系统资源
echo “” >> $metrics_file
echo “=== 系统资源 ===” >> $metrics_file
echo “CPU: $(top -bn1 | grep ‘Cpu(s)’ | awk ‘{print $2}’)” >> $metrics_file
echo “内存: $(free -m | grep Mem | awk ‘{print $3″/”$2″MB”}’)” >> $metrics_file
echo “磁盘: $(df -h /GoldenGate | tail -1 | awk ‘{print $5}’)” >> $metrics_file
# Trail文件
echo “” >> $metrics_file
echo “=== Trail文件 ===” >> $metrics_file
ls -lh /GoldenGate/app/dirdat/ >> $metrics_file
echo $metrics_file
}
# 分析监控数据
analyze_metrics() {
local metrics_file=$1
# 检查异常进程
abnormal=$(grep -E “STOPPED|ABENDED” $metrics_file | grep -v “^===”)
if [ -n “$abnormal” ]; then
log_message “发现异常进程: $abnormal”
/GoldenGate/app/scripts/auto/ogg_auto_restart.sh
fi
# 检查延迟
high_lag=$(grep “Lag at Chkpt” $metrics_file | awk ‘$4 ~ /^[0-9]+$/ && $4 > 60’)
if [ -n “$high_lag” ]; then
log_message “发现高延迟: $high_lag”
/GoldenGate/app/scripts/auto/ogg_lag_handler.sh
fi
}
# 清理旧指标文件
cleanup_old_metrics() {
find $METRICS_DIR -name “metrics_*.txt” -mtime +7 -delete
}
# 主程序
main() {
log_message “开始完整监控”
metrics_file=$(collect_all_metrics)
analyze_metrics $metrics_file
cleanup_old_metrics
log_message “完整监控完成”
}
main
Part05-风哥经验总结与分享
5.1 监控运维最佳实践
根据多年OGG监控运维经验,总结以下最佳实践:
- 建立完善的监控体系
- 设置合理的告警阈值
- 实现自动化运维
- 定期检查监控效果
- 持续优化监控策略
– 多层次监控:进程、延迟、性能、存储
– 多维度告警:邮件、短信、微信
– 自动化处理:自动重启、自动清理
# 最佳实践2:告警策略
– 分级告警:P1/P2/P3/P4
– 告警抑制:避免告警风暴
– 告警升级:超时自动升级
# 最佳实践3:运维策略
– 定期巡检:每日检查
– 定期演练:故障恢复演练
– 文档维护:及时更新文档
5.2 监控运维检查清单
[ ] 监控脚本正常运行
[ ] 告警通知正常发送
[ ] 自动重启功能正常
[ ] 监控数据正常采集
[ ] 历史数据正常保留
# 日常运维检查清单
[ ] 所有进程状态正常
[ ] 延迟在正常范围内
[ ] 存储空间充足
[ ] 日志无异常错误
[ ] 性能指标正常
# 定期检查清单
[ ] 每周检查告警记录
[ ] 每月检查监控效果
[ ] 每季度优化监控策略
[ ] 每半年进行演练
5.3 风哥实战经验总结
在多年OGG监控运维过程中,总结以下实战经验:
- 监控是运维的基础
- 告警要及时准确
- 自动化要谨慎实施
- 文档要持续更新
- 团队要定期培训
– 从简单到复杂
– 从手动到自动
– 从被动到主动
# 经验2:告警管理
– 告警要有价值
– 告警要及时处理
– 告警要有记录
# 经验3:自动化运维
– 先测试后生产
– 先简单后复杂
– 先监控后自动
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
