#!/bin/bash
# Oracle 11g 物理备库自动启动脚本(含日志应用)
# 适用场景:Data Guard物理备库,需配合主库使用
# 最后更新:2025-04-02
# 环境配置(请根据备库实际环境修改)
ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
ORACLE_SID=xxxx # 备库SID
LISTENER_NAME=LISTENER # 备库监听
# 加载Oracle环境
source /home/oracle/.bash_profile
# 定义日志文件
LOG_FILE=/home/oracle/log/standby_start_$(date +%Y%m%d).log
# 启动监听(备库可能需要独立监听)
check_listener() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 检查备库监听..." | tee -a $LOG_FILE
lsnrctl status $LISTENER_NAME >/dev/null 2>&1
if [ $? -ne 0 ]; then
lsnrctl start $LISTENER_NAME | tee -a $LOG_FILE
[ $? -ne 0 ] && echo "[ERROR] 备库监听启动失败!" | tee -a $LOG_FILE && exit 1
fi
}
# 启动数据库到OPEN状态
start_db() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 检查数据库状态..." | tee -a $LOG_FILE
DB_STATUS=$(sqlplus -S / as sysdba <<-EOF | awk 'NR==2 {print $1}'
set heading off
select status from v\$instance;
exit
EOF
)
if [ "$DB_STATUS" != "OPEN" ]; then
echo "[WARN] 数据库未处于OPEN状态,开始启动..." | tee -a $LOG_FILE
sqlplus -S / as sysdba <<-EOF | tee -a $LOG_FILE
startup
exit
EOF
[ $? -ne 0 ] && echo "[ERROR] 备库启动失败!" | tee -a $LOG_FILE && exit 1
fi
}
# 启动日志应用(MRP)
start_log_apply() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 检查MRP状态..." | tee -a $LOG_FILE
MRP_STATUS=$(sqlplus -S / as sysdba <<EOF | awk 'NR==2 {print $1}'
set heading off
select process from v\$managed_standby where process='MRP0';
exit
EOF
)
if [ "$MRP_STATUS" != "MRP0" ]; then
echo "[WARN] MRP未启动,开始应用日志..." | tee -a $LOG_FILE
sqlplus -S / as sysdba <<EOF | tee -a $LOG_FILE
alter database recover managed standby database using current logfile disconnect from session;
exit
EOF
[ $? -ne 0 ] && echo "[ERROR] MRP启动失败!" | tee -a $LOG_FILE && exit 1
else
echo "[INFO] MRP已运行(状态:$MRP_STATUS)" | tee -a $LOG_FILE
fi
}
# 检查数据同步状态
check_sync_status() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] 开始同步检查..." | tee -a $LOG_FILE
FIRST_SCN=$(sqlplus -S / as sysdba@primary <<EOF | awk 'NR==2 {print $1}'
set heading off
select to_char(current_scn) from v\$database;
exit
EOF
)
sleep 1
SECOND_SCN=$(sqlplus -S / as sysdba <<EOF | awk 'NR==2 {print $1}'
set heading off
select to_char(current_scn) from v\$database;
exit
EOF
)
if [ -z "$FIRST_SCN" ] || [ -z "$SECOND_SCN" ]; then
echo "[WARN] 主库/备库SCN获取失败,跳过同步检查" | tee -a $LOG_FILE
return
fi
SYNC_DELAY=$(( (SECOND_SCN - FIRST_SCN) )) # 简化的延迟计算(实际需结合时间戳)
if [ $SYNC_DELAY -gt $MAX_SYNC_DELAY ]; then
echo "[WARN] 数据scn未增长" | tee -a $LOG_FILE
else
echo "[INFO] 数据scn增长$SYNC_DELAY" | tee -a $LOG_FILE
fi
}
# 主流程
echo "==================================================" | tee -a $LOG_FILE
echo "$(date '+%Y-%m-%d %H:%M:%S') 启动数据库" | tee -a $LOG_FILE
# 环境检查
[ -z "$ORACLE_SID" ] && echo "[ERROR] ORACLE_SID未设置!" | tee -a $LOG_FILE && exit 1
check_listener
start_db
#start_log_apply
#check_sync_status # 建议延迟检查在启动5分钟后执行(可通过cron调度)
echo "$(date '+%Y-%m-%d %H:%M:%S') 数据库启动完成" | tee -a $LOG_FILE
echo "==================================================" | tee -a $LOG_FILE
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




