ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Oracle ADG 主备一键切换脚本

2026/10/8 13:19:14 拓冰建站 浏览量
Oracle ADG 主备一键切换脚本 以下脚本面向 Oracle 11gR2 及以上的 Active Data Guard 物理备库环境支持**计划内 switchover一键切换与计划外 failover主库不可用**两种模式。脚本由一台可同时连通主、备库的机器执行也可拆分为主备两侧分别执行。说明脚本中的连接串、SID、ORACLE_HOME 等需按实际环境替换ALTER DATABASE ... SWITCHOVER ...等命令为 Oracle 标准语法建议先在测试环境验证后再上生产。#!/bin/bash################################################################################ Oracle ADG 主备一键切换脚本# switchover : 计划内切换主库可用角色互换不丢数据# failover : 计划外切换主库不可用备库强制激活可能丢数据## 用法:# ./dg_switch.sh switchover# ./dg_switch.sh failover###############################################################################set-euopipefailMODE${1:-switchover}# switchover | failover# 按环境修改 PRIMARY_CONNsys/YourPwdPRIMARY_TNS# 主库 sysdba 连接串STANDBY_CONNsys/YourPwdSTANDBY_TNS# 备库 sysdba 连接串ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1STANDBY_DB_UNIQUE_NAMEorcl_std# 备库 db_unique_namefailover 后可用exportORACLE_HOMEexportPATH$ORACLE_HOME/bin:$PATHTS$(date%Y%m%d_%H%M%S)LOG_DIR/tmp/dg_switch_${TS}mkdir-p$LOG_DIRLOG${LOG_DIR}/switch.loglog(){echo[$(date%F %T)]$*|tee-a$LOG;}# ---------- 通用 SQL 执行函数 ----------run_sql(){# $1连接串 $2SQL $3标记localconn$1sql$2tag$3{echo$tagecho[SQL]$sql}$LOGif!sqlplus-s-L$conn$LOG21EOF set echo on feedback on pagesize 200 linesize 200 whenever sqlerror exit sql.sqlcode$sqlexit EOFthenlog❌ [$tag] 执行失败详见$LOG;exit1filog✅ [$tag] 完成}query_sql(){# 只返回查询结果localconn$1sql$2sqlplus-s-L$connEOF set heading off feedback off pagesize 0 linesize 300 trimspool on$sqlexit EOF}# ---------- 角色读取 ----------get_role(){query_sql$1select database_role from v\$database;|tr-d \r\n;}get_sw_status(){query_sql$1select switchover_status from v\$database;|tr-d \r\n;}# 前置检查 log 前置检查 P_ROLE$(get_role$PRIMARY_CONN)S_ROLE$(get_role$STANDBY_CONN)log主库角色:$P_ROLE| 备库角色:$S_ROLEif[[$MODEswitchover]];then[[$P_ROLE*PRIMARY*$S_ROLE*STANDBY*]]\||{log❌ 角色不匹配无法 switchover主库须为 PRIMARY备库须为 PHYSICAL STANDBY;exit1;}SW$(get_sw_status$PRIMARY_CONN)log主库 switchover_status $SWcase$SWinTO STANDBY|SESSIONS ACTIVE);;*)log❌ 主库 switchover_status$SW当前不可切换需为 TO STANDBY / SESSIONS ACTIVE;exit1;;esacfi# 模式一计划内 switchover if[[$MODEswitchover]];thenlog 开始 switchover # 1. 主库切换为物理备库run_sql$PRIMARY_CONN\alter database commit to switchover to physical standby with session shutdown;\主库-备库角色# 2. 原主库现备库重启到 mountrun_sql$PRIMARY_CONN\shutdown immediate; startup mount;\原主库 mount# 3. 原备库完成日志应用并切换为主库run_sql$STANDBY_CONN\alter database recover managed standby database finish;\备库应用至一致点run_sql$STANDBY_CONN\alter database commit to switchover to primary;\备库-主库角色# 4. 新主库打开run_sql$STANDBY_CONN\alter database open;\新主库 open# 5. 新备库原主库开启日志应用run_sql$PRIMARY_CONN\alter database recover managed standby database disconnect from session;\新备库开启 MRPlog switchover 完成 # 模式二计划外 failover elif[[$MODEfailover]];thenlog 开始 failover主库不可用 # 1. 停止备库日志应用run_sql$STANDBY_CONN\alter database recover managed standby database cancel;\备库 cancel MRP# 2. 尽力应用完已接收日志可能报错失败则强制激活ifsqlplus-s-L$STANDBY_CONN$LOG21EOF whenever sqlerror exit sql.sqlcode alter database recover managed standby database finish force; exit EOFthenlog✅ 已应用完现有日志elselog⚠️ finish force 未完全成功直接强制激活备库fi# 3. 激活备库为新主库run_sql$STANDBY_CONN\alter database activate physical standby database;\激活备库# 4. 打开新主库run_sql$STANDBY_CONN\alter database open;\新主库 openlog failover 完成请检查数据丢失情况 elselog❌ 未知模式:$MODE仅支持 switchover | failover;exit1fi# 结果验证 log 切换后验证 query_sql$PRIMARY_CONN\select database_role, open_mode, protection_mode from v\$database;|tee-a$LOGquery_sql$STANDBY_CONN\select database_role, open_mode, protection_mode from v\$database;|tee-a$LOGlog全部完成日志目录:$LOG_DIR若使用 Data Guard BrokerDGMGRL的一键切换环境已启用 Broker 时切换可进一步简化为一条命令推荐在 Broker 环境下使用避免 SQL 手工步骤顺序出错# 计划内切换在 DGMGRL 中执行dgmgrl sys/YourPwdPRIMARY_TNS DGMGRLswitchover tostandby_db_unique_name;DGMGRLshow configuration;注意使用 Broker 切换前建议监听中为主备库添加静态注册GLOBAL_DBNAME采用db_unique_name_DGMGRL格式否则切换过程可能报 ORA-12514。已启用 Broker 后官方建议统一通过 Broker 执行切换。关键使用说明与风险提示switchover_status 判定主库须为TO STANDBY或SESSIONS ACTIVE。若为SESSIONS ACTIVE且无法立即切换脚本已使用WITH SESSION SHUTDOWN强制断开活动会话⚠️ 会中断业务连接。版本差异11g 及以上均支持COMMIT TO SWITCHOVER TO PHYSICAL STANDBY12c 起部分语句可省略WITH SESSION SHUTDOWN。脚本命令以 11gR2 为基线兼容更高版本。SQL*Plus 会话完成切换后不要在原来的 sqlplus 会话中直接STARTUP可能因残留事件设置或废弃参数报 ORA-32004/ORA-49100/ORA-00972需退出后重新登录。切换失败常见原因备库存在归档间隙redo gap会导致COMMIT TO SWITCHOVER失败需先SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;定位并补传缺失归档后再切换。failover 风险⚠️ 计划外切换会丢失主库尚未传输的 redo 数据激活后的新主库无法再作为原主库的备库自动回切需重建 Data Guard。验证视图V$DATABASEdatabase_role/switchover_status/open_mode/protection_mode、V$DATAGUARD_STATUS传输与应用事件在 10gR2 至 26ai 各版本均可用。脚本默认将日志写入/tmp/dg_switch_时间戳/便于失败后回溯每一步执行情况。