暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

Oracle DataGuard高可用性解决方案详解

原创 孙莹 4天前
284

Oracle Data Guard 高可用性解决方案详解

dg1.png

1. Data Guard 核心概念

Oracle Data Guard 是 Oracle 数据库提供的一套完善的高可用性和灾难恢复解决方案,通过在主数据库和一个或多个备用数据库之间复制和同步数据,确保在主数据库发生故障时可以快速切换到备用数据库继续提供服务。

1.1 工作原理

Data Guard 的核心机制是基于 redo 日志的传输和应用:

  • 主库(Primary Database)产生的 redo 日志实时传输到备库(Standby Database)
  • 备库接收并应用这些 redo 日志,保持与主库的数据同步
  • 1.2 备库类型对比

    备库类型 同步机制 数据一致性 主要用途 切换能力
    物理备库 直接应用 redo 到数据文件 完全一致 高可用性、灾难恢复 可无缝切换
    逻辑备库 将 redo 转换为 SQL 语句执行 逻辑一致 报表查询、数据分析 可切换但需验证
    快照备库 定期同步,可临时读写 时间点一致 测试环境、临时报表 需转换为物理库

2. 重做传输模式详解

2.1 同步传输模式 (SYNC)

特点:

  • 主库提交事务前必须等待至少一个备库确认接收
  • 数据零丢失(Zero Data Loss)
  • 对主库性能影响较大

适用场景:

  • 金融交易系统
  • 对数据一致性要求极高的场景
  • 网络延迟低的局域网环境

2.2 异步传输模式 (ASYNC)

特点:

  • 主库提交事务后立即继续,不等待备库确认
  • 可能存在少量数据丢失风险
  • 对主库性能影响极小

适用场景:

  • 地理分布较远的灾备系统
  • 对性能要求高于一致性的场景
  • 允许分钟级数据丢失的业务

3. Data Guard 架构深度解析

Data Guard架构如下图

oracledataguard11garchitecture11.jpg

关键组件工作流程:

  1. LNS进程:主库的Log Network Service进程从重做日志缓冲区捕获redo数据
  2. RFS进程:备库的Remote File Server进程接收redo并写入备用重做日志
  3. MRP进程:物理备库的Managed Recovery Process应用redo到数据文件
  4. LSP进程:逻辑备库的Logical Standby Process将redo转换为SQL执行

异常处理机制:

  • 网络中断时自动检测归档间隙(Gap)
  • 支持自动或手动间隙解决(Gap Resolution)
  • 提供多种传输验证机制确保数据完整性

4. 物理 Data Guard 部署实践

本文讲解 Oracle 19C 环境通过RMAN Duplicate 复制搭建单机 DataGuard 的完整步骤

4.1 环境规划建议

准备两台主机,一台作为主库安装Oracle 19c软件并且创建orcl实例,另一台作为备库仅安装Oracle 19c软件

角色 主机名 IP地址 操作系统 数据库版本 实例名 db_unique_name
主库 primary 192.168.17.26 CentOS7.9 19.26 orcl orcl
备库 standby 192.168.17.27 CentOS7.9 19.26 orcldg orcldg

4.2 详细配置步骤

4.2.1 主库配置

主库开启归档和强制日志

--开启归档模式 shutdown immediate startup mount alter database archivelog; alter database open; --主库检查是否开启归档和强制日志 SQL> select log_mode,force_logging from v$database; LOG_MODE FORCE_LOGGING ------------ --------------------------------------- ARCHIVELOG NO SQL> alter database force logging; Database altered. SQL>
复制

查看主库数据文件和在线日志数量以及大小

SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/ORCL/system01.dbf /u01/app/oracle/oradata/ORCL/sysaux01.dbf /u01/app/oracle/oradata/ORCL/undotbs01.dbf /u01/app/oracle/oradata/ORCL/users01.dbf SQL> set line 1000 SQL> col member for a60 SQL> select t2.thread#,t1.group#,t1.member,t2.bytes/1024/1024 MB from v$logfile t1,v$log t2 where t1.group#=t2.group# order by 1,2; THREAD# GROUP# MEMBER MB ---------- ---------- ------------------------------------------------------------ ---------- 1 1 /u01/app/oracle/oradata/ORCL/redo01.log 1024 1 2 /u01/app/oracle/oradata/ORCL/redo02.log 1024 1 3 /u01/app/oracle/oradata/ORCL/redo03.log 1024 SQL>
复制

主库添加4组 standby redo log

SQL> alter database add standby logfile group 4 '/u01/app/oracle/oradata/ORCL/standbyredo04.log' size 1024m; Database altered. SQL> alter database add standby logfile group 5 '/u01/app/oracle/oradata/ORCL/standbyredo05.log' size 1024m; Database altered. SQL> alter database add standby logfile group 6 '/u01/app/oracle/oradata/ORCL/standbyredo06.log' size 1024m; Database altered. SQL> alter database add standby logfile group 7 '/u01/app/oracle/oradata/ORCL/standbyredo07.log' size 1024m; Database altered. SQL>
复制

主库设置DG参数

SQL> alter system set log_archive_config='dg_config=(orcl,orcldg)' scope=both; System altered. SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/flash_recovery_area/ORCL/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=orcl' scope=both; System altered. SQL> alter system set log_archive_dest_2='service=orcldg async valid_for=(online_logfiles,primary_role) db_unique_name=orcldg' scope=both; System altered. SQL> alter system set log_archive_dest_state_2=enable scope=both; System altered. SQL> alter system set log_archive_format='%t_%s_%r.dbf' scope=spfile; System altered. SQL> alter system set log_archive_max_processes=4 scope=both; System altered. SQL> alter system set remote_login_passwordfile=exclusive scope=spfile; System altered. SQL> alter system set fal_server=orcldg scope=both; System altered. SQL> alter system set fal_client=orcl scope=both; System altered. SQL> alter system set db_file_name_convert='/u01/app/oracle/oradata/ORCLDG','/u01/app/oracle/oradata/ORCL' scope=spfile; System altered. SQL> alter system set log_file_name_convert='/u01/app/oracle/oradata/ORCLDG','/u01/app/oracle/oradata/ORCL' scope=spfile; System altered. SQL> alter system set standby_file_management=auto scope=both; System altered. SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 1979711112 bytes Fixed Size 8941192 bytes Variable Size 1442840576 bytes Database Buffers 520093696 bytes Redo Buffers 7835648 bytes Database mounted. Database opened. SQL>
复制

生成备库pfile文件并修改,复制参数文件和密码文件至备库

SQL> create pfile from spfile; File created. SQL> exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.26.0.0.0 [oracle@primary ~]$ cd $ORACLE_HOME/dbs [oracle@primary dbs]$ scp {initorcl.ora,orapworcl} 192.168.17.27:/u01/app/oracle/product/19.3.0/db_1/dbs The authenticity of host '192.168.17.27 (192.168.17.27)' can't be established. ECDSA key fingerprint is SHA256:V9ygCB0dK31V2fp1l6XTzOepaiuN4bOUSg8Yu7tPdcQ. ECDSA key fingerprint is MD5:9f:84:0a:65:1c:6f:86:95:a9:b2:99:8f:f3:50:9d:cd. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.17.27' (ECDSA) to the list of known hosts. oracle@192.168.17.27's password: initorcl.ora 100% 2862 3.6MB/s 00:00 orapworcl 100% 2048 3.8MB/s 00:00 [oracle@primary dbs]$
复制

如果密码文件有问题,重新生成密码文件

[oracle@primary ~]$ orapwd file=/u01/app/oracle/product/19.3.0/db_1/dbs/orapworcl password=oracle format=12 force=y [oracle@primary ~]$
复制

主库配置 hosts 文件以及 tnsnames.ora

#设置hosts文件 [root@primary ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.17.26 primary 192.168.17.27 standby [root@primary ~]# #添加如下tnsnames.ora [oracle@primary ~]$ cd $ORACLE_HOME/network/admin [oracle@primary admin]$ cat tnsnames.ora ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.17.26)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) ORCLDG = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.17.27)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcldg) (UR=A) ) ) [oracle@primary admin]$
复制

4.2.2 备库配置

修改备库pfile

cat > $ORACLE_HOME/dbs/initorcldg.ora << "EOF" *._ash_size=266338304 *._cleanup_rollback_entries=10000 *._clusterwide_global_transactions=FALSE *._cursor_obsolete_threshold=100 *._gc_policy_time=0 *._gc_undo_affinity=FALSE *._optim_peek_user_binds=FALSE *._optimizer_adaptive_cursor_sharing=FALSE *._optimizer_extended_cursor_sharing_rel='NONE' *._optimizer_extended_cursor_sharing='NONE' *._optimizer_use_feedback=FALSE *._PX_use_large_pool=TRUE *._rollback_segment_count=500 *._undo_autotune=FALSE *.archive_lag_target=1800 *.audit_file_dest='/u01/app/oracle/admin/orcl/adump' *.audit_trail='NONE' *.compatible='19.0.0' *.control_file_record_keep_time=60 *.db_block_checking='MEDIUM' *.db_block_checksum='FULL' *.db_block_size=8192 *.db_files=2048 *.db_lost_write_protect='TYPICAL' *.db_name='orcl' *.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area' *.db_recovery_file_dest_size=15672m *.db_writer_processes=8 *.deferred_segment_creation=FALSE *.diagnostic_dest='/u01/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.enable_ddl_logging=TRUE *.event='10949 trace name context forever,level 1','28401 trace name context forever,level 1','10503 trace name context forever, level 4000' *.inmemory_query='DISABLE' *.inmemory_size=0 *.log_archive_dest_state_2='ENABLE' *.log_archive_format='%t_%s_%r.dbf' *.log_archive_max_processes=4 *.max_dump_file_size='102400000' *.max_idle_blocker_time=15 *.nls_language='AMERICAN' *.nls_territory='AMERICA' *.open_cursors=300 *.optimizer_adaptive_plans=FALSE *.optimizer_adaptive_statistics=FALSE *.parallel_degree_policy='MANUAL' *.parallel_force_local=TRUE *.parallel_max_servers=128 *.pga_aggregate_target=410m *.processes=6000 *.remote_login_passwordfile='EXCLUSIVE' *.sga_target=1888m *.standby_file_management='AUTO' *.undo_retention=86400 *.undo_tablespace='UNDOTBS1' #修改部分 *.audit_file_dest='/u01/app/oracle/admin/orcldg/adump' *.control_files='/u01/app/oracle/oradata/ORCLDG/control01.ctl','/u01/app/oracle/flash_recovery_area/ORCLDG/control02.ctl' *.log_archive_config='dg_config=(orcl,orcldg)' *.db_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCLDG' *.log_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCLDG' *.fal_client='ORCLDG' *.fal_server='ORCL' *.db_unique_name=orcldg *.log_archive_dest_1='location=/u01/app/oracle/flash_recovery_area/ORCLDG/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=orcldg' *.log_archive_dest_2='service=orcl async valid_for=(online_logfiles,primary_role) db_unique_name=orcl' EOF [oracle@standby dbs]$ cat initorcldg.ora *._ash_size=266338304 *._cleanup_rollback_entries=10000 *._clusterwide_global_transactions=FALSE *._cursor_obsolete_threshold=100 *._gc_policy_time=0 *._gc_undo_affinity=FALSE *._optim_peek_user_binds=FALSE *._optimizer_adaptive_cursor_sharing=FALSE *._optimizer_extended_cursor_sharing_rel='NONE' *._optimizer_extended_cursor_sharing='NONE' *._optimizer_use_feedback=FALSE *._PX_use_large_pool=TRUE *._rollback_segment_count=500 *._undo_autotune=FALSE *.archive_lag_target=1800 *.audit_trail='NONE' *.compatible='19.0.0' *.control_file_record_keep_time=60 *.db_block_checking='MEDIUM' *.db_block_checksum='FULL' *.db_block_size=8192 *.db_files=2048 *.db_lost_write_protect='TYPICAL' *.db_name='orcl' *.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area' *.db_recovery_file_dest_size=15672m *.db_writer_processes=8 *.deferred_segment_creation=FALSE *.diagnostic_dest='/u01/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.enable_ddl_logging=TRUE *.event='10949 trace name context forever,level 1','28401 trace name context forever,level 1','10503 trace name context forever, level 4000' *.inmemory_query='DISABLE' *.inmemory_size=0 *.log_archive_dest_state_2='ENABLE' *.log_archive_format='%t_%s_%r.dbf' *.log_archive_max_processes=4 *.max_dump_file_size='102400000' *.max_idle_blocker_time=15 *.nls_language='AMERICAN' *.nls_territory='AMERICA' *.open_cursors=300 *.optimizer_adaptive_plans=FALSE *.optimizer_adaptive_statistics=FALSE *.parallel_degree_policy='MANUAL' *.parallel_force_local=TRUE *.parallel_max_servers=128 *.pga_aggregate_target=410m *.processes=6000 *.remote_login_passwordfile='EXCLUSIVE' *.sga_target=1888m *.standby_file_management='AUTO' *.undo_retention=86400 *.undo_tablespace='UNDOTBS1' *.audit_file_dest='/u01/app/oracle/admin/orcl/adump' *.control_files='/u01/app/oracle/oradata/ORCLDG/control01.ctl','/u01/app/oracle/flash_recovery_area/ORCLDG/control02.ctl' *.log_archive_config='dg_config=(orcl,orcldg)' *.db_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCLDG' *.log_file_name_convert='/u01/app/oracle/oradata/ORCL','/u01/app/oracle/oradata/ORCLDG' *.fal_client='ORCLDG' *.fal_server='ORCL' *.db_unique_name=orcldg *.log_archive_dest_1='location=/u01/app/oracle/flash_recovery_area/ORCLDG/archivelog valid_for=(all_logfiles,all_roles) db_unique_name=orcldg' *.log_archive_dest_2='service=orcl async valid_for=(online_logfiles,primary_role) db_unique_name=orcl' #创建目录 [oracle@standby dbs]$ mkdir -p /u01/app/oracle/flash_recovery_area/ORCLDG/archivelog [oracle@standby dbs]$ mkdir -p /u01/app/oracle/oradata/ORCLDG [oracle@standby dbs]$ mkdir -p /u01/app/oracle/admin/orcldg/adump [oracle@standby dbs]$
复制

备库修改password文件或者创建password文件

[oracle@standby dbs]$ mv orapworcl orapworcldg [oracle@standby dbs]$ orapwd file=/u01/app/oracle/product/19.3.0/db_1/dbs/orapworcldg password=oracle format=12 force=y [oracle@standby dbs]$
复制

备库启动监听

[oracle@standby dbs]$ cd $ORACLE_HOME/network/admin [oracle@standby admin]$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.17.26 primary 192.168.17.27 standby [oracle@standby admin]$ cat listener.ora # listener.ora Network Configuration File: /u01/app/oracle/product/19.3.0/db_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) [oracle@standby admin]$ lsnrctl start LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 24-MAR-2025 23:08:19 Copyright (c) 1991, 2024, Oracle. All rights reserved. Starting /u01/app/oracle/product/19.3.0/db_1/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 19.0.0.0.0 - Production System parameter file is /u01/app/oracle/product/19.3.0/db_1/network/admin/listener.ora Log messages written to /u01/app/oracle/diag/tnslsnr/standby/listener/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=standby)(PORT=1521))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=standby)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production Start Date 24-MAR-2025 23:08:20 Uptime 0 days 0 hr. 0 min. 4 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/19.3.0/db_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/standby/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=standby)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) The listener supports no services The command completed successfully [oracle@standby admin]$
复制

备库配置hosts 文件以及 tnsnames.ora

[root@standby ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.17.26 primary 192.168.17.27 standby [root@standby ~]# [oracle@standby ~]$ cd $ORACLE_HOME/network/admin [oracle@standby admin]$ cat tnsnames.ora ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.17.26)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) ORCLDG = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.17.27)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcldg) (UR=A) ) ) [oracle@standby admin]$ [oracle@standby ~]$ tnsping orcl TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 24-MAR-2025 23:12:11 Copyright (c) 1997, 2024, Oracle. All rights reserved. Used parameter files: /u01/app/oracle/product/19.3.0/db_1/network/admin/sqlnet.ora Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.17.26)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl))) OK (0 msec) [oracle@standby ~]$ tnsping orcldg TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 24-MAR-2025 23:12:14 Copyright (c) 1997, 2024, Oracle. All rights reserved. Used parameter files: /u01/app/oracle/product/19.3.0/db_1/network/admin/sqlnet.ora Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.17.27)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcldg) (UR=A))) OK (0 msec) [oracle@standby ~]$
复制

修改备库环境变量的 ORACLE_SID 为指定值

vi .bash_profile # 修改以下部分 export ORACLE_SID=oracldg [oracle@standby ~]$ source .bash_profile [oracle@standby ~]$ echo $ORACLE_SID orcldg [oracle@standby ~]$
复制

启动备库到 nomount 状态

[oracle@standby ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Mon Mar 24 23:16:06 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to an idle instance. SQL> create spfile from pfile; File created. SQL> startup nomount; ORACLE instance started. Total System Global Area 1979711112 bytes Fixed Size 8941192 bytes Variable Size 1442840576 bytes Database Buffers 520093696 bytes Redo Buffers 7835648 bytes SQL>
复制

4.3 RMAN Duplicate技巧

主库RMAN Duplicate 复制

[oracle@primary ~]$ rman target sys/oracle@orcl auxiliary sys/oracle@orcldg Recovery Manager: Release 19.0.0.0.0 - Production on Mon Mar 24 23:22:44 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. connected to target database: ORCL (DBID=1722574991) connected to auxiliary database: ORCL (not mounted) RMAN> duplicate target database for standby from active database nofilenamecheck; duplicate target database for standby from active database nofilenamecheck; Starting Duplicate Db at 2025-03-24 23:24:16 using target database control file instead of recovery catalog allocated channel: ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: SID=6774 device type=DISK contents of Memory Script: { backup as copy reuse passwordfile auxiliary format '/u01/app/oracle/product/19.3.0/db_1/dbs/orapworcldg' ; } executing Memory Script Starting backup at 2025-03-24 23:24:17 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=1141 device type=DISK Finished backup at 2025-03-24 23:24:18 contents of Memory Script: { restore clone from service 'orcl' standby controlfile; } executing Memory Script Starting restore at 2025-03-24 23:24:18 using channel ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: starting datafile backup set restore channel ORA_AUX_DISK_1: using network backup set from service orcl channel ORA_AUX_DISK_1: restoring control file channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01 output file name=/u01/app/oracle/oradata/ORCLDG/control01.ctl output file name=/u01/app/oracle/flash_recovery_area/ORCLDG/control02.ctl Finished restore at 2025-03-24 23:24:21 contents of Memory Script: { sql clone 'alter database mount standby database'; } executing Memory Script sql statement: alter database mount standby database Using previous duplicated file /u01/app/oracle/oradata/ORCLDG/system01.dbf for datafile 1 with checkpoint SCN of 3144397 Using previous duplicated file /u01/app/oracle/oradata/ORCLDG/sysaux01.dbf for datafile 3 with checkpoint SCN of 3144401 contents of Memory Script: { set newname for tempfile 1 to "/u01/app/oracle/oradata/ORCLDG/temp01.dbf"; switch clone tempfile all; set newname for datafile 1 to "/u01/app/oracle/oradata/ORCLDG/system01.dbf"; set newname for datafile 3 to "/u01/app/oracle/oradata/ORCLDG/sysaux01.dbf"; set newname for datafile 4 to "/u01/app/oracle/oradata/ORCLDG/undotbs01.dbf"; set newname for datafile 7 to "/u01/app/oracle/oradata/ORCLDG/users01.dbf"; restore from nonsparse from service 'orcl' clone datafile 4, 7 ; sql 'alter system archive log current'; } executing Memory Script executing command: SET NEWNAME renamed tempfile 1 to /u01/app/oracle/oradata/ORCLDG/temp01.dbf in control file executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME Starting restore at 2025-03-24 23:24:25 using channel ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: starting datafile backup set restore channel ORA_AUX_DISK_1: using network backup set from service orcl channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set channel ORA_AUX_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/ORCLDG/undotbs01.dbf channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01 channel ORA_AUX_DISK_1: starting datafile backup set restore channel ORA_AUX_DISK_1: using network backup set from service orcl channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set channel ORA_AUX_DISK_1: restoring datafile 00007 to /u01/app/oracle/oradata/ORCLDG/users01.dbf channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01 Finished restore at 2025-03-24 23:24:28 sql statement: alter system archive log current contents of Memory Script: { restore clone force from service 'orcl' archivelog from scn 3144397; catalog clone datafilecopy "/u01/app/oracle/oradata/ORCLDG/system01.dbf", "/u01/app/oracle/oradata/ORCLDG/sysaux01.dbf"; switch clone datafile 1 to datafilecopy "/u01/app/oracle/oradata/ORCLDG/system01.dbf"; switch clone datafile 3 to datafilecopy "/u01/app/oracle/oradata/ORCLDG/sysaux01.dbf"; switch clone datafile all; } executing Memory Script Starting restore at 2025-03-24 23:24:28 using channel ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: starting archived log restore to default destination channel ORA_AUX_DISK_1: using network backup set from service orcl channel ORA_AUX_DISK_1: restoring archived log archived log thread=1 sequence=253 channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01 Finished restore at 2025-03-24 23:24:29 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/ORCLDG/system01.dbf RECID=13 STAMP=1196637870 cataloged datafile copy datafile copy file name=/u01/app/oracle/oradata/ORCLDG/sysaux01.dbf RECID=14 STAMP=1196637870 datafile 1 switched to datafile copy input datafile copy RECID=13 STAMP=1196637870 file name=/u01/app/oracle/oradata/ORCLDG/system01.dbf datafile 3 switched to datafile copy input datafile copy RECID=14 STAMP=1196637870 file name=/u01/app/oracle/oradata/ORCLDG/sysaux01.dbf datafile 4 switched to datafile copy input datafile copy RECID=15 STAMP=1196637870 file name=/u01/app/oracle/oradata/ORCLDG/undotbs01.dbf datafile 7 switched to datafile copy input datafile copy RECID=16 STAMP=1196637870 file name=/u01/app/oracle/oradata/ORCLDG/users01.dbf Finished Duplicate Db at 2025-03-24 23:24:34 RMAN> exit exit Recovery Manager complete. [oracle@primary ~]$
复制

备库开启日志应用

[oracle@standby ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Mon Mar 24 23:26:30 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.26.0.0.0 SQL> alter database open read only; Database altered. SQL> alter database recover managed standby database using current logfile disconnect from session; Database altered. SQL> select database_role,protection_mode,open_mode from v$database; DATABASE_ROLE PROTECTION_MODE OPEN_MODE ---------------- -------------------- -------------------- PHYSICAL STANDBY MAXIMUM PERFORMANCE READ ONLY WITH APPLY SQL>
复制

5. Data Guard Broker高级管理

5.1 Data Guard 核心概念

Data Guard Broker 是一个分布式管理框架,它自动化和集中化Oracle数据保护配置的创建、维护和监视。

下面列出自动化和简化的一些操作:

  • 创建 DG,包括一个主库和零个或多个备库。数据库可以是单实例、RAC 或RAC One Node 数据库。
  • 将备库添加到现有 Data Guard 配置。
  • 管理配置的保护模式。
  • 使用单个命令调用switchover或failover,以启动和控制配置中所有数据库的复杂角色更改。
  • 将failover配置为在主库丢失时自动发生,无需人工干预即可提高可用性。
  • 监控整个配置的状态,捕获诊断信息,redo apply率和redo生成率等统计信息,并通过集中监控、测试和性能工具快速检测问题。
  • 评估数据库是否可以switchover成为主库。
  • 评估是否在数据库之间正确配置了网络。

您可以通过代理的易于使用的接口在本地或远程执行所有管理操作:Cloud Control中的Oracle Data Guard管理页面,以及名为DGMGRL的Oracle Data Guard命令行接口。

配置DG Broker之前需要将DG搭建好

5.2 配置最佳实践

5.2.1 主备库启用Broker特性

主备库同时开启

SQL> alter system set dg_broker_start=true scope=both; System altered. SQL> show parameter dg_broker_start; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ dg_broker_start boolean TRUE SQL>
复制

5.2.2 命令行DGMGRL配置步骤

主库登录

[oracle@primary ~]$ dgmgrl sys/oracle DGMGRL for Linux: Release 19.0.0.0.0 - Production on Tue Mar 25 14:53:03 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. Welcome to DGMGRL, type "help" for information. Connected to "orcl" Connected as SYSDBA. DGMGRL>
复制

创建primary库

#dg_config是configuration名称可随意命名,orcl是主库db_unique_name,第二个orcl是主库tnsnames名称 DGMGRL> create configuration dg_config as primary database is orcl connect identifier is orcl; Configuration "dg_config" created with primary database "orcl" DGMGRL>
复制

添加standby备库

#orcldg是备库db_unique_name,orcldg是备库tnsnames名称 DGMGRL> add database orcldg as connect identifier is orcldg maintained as physical; Error: ORA-16698: member has a LOG_ARCHIVE_DEST_n parameter with SERVICE attribute set Failed. DGMGRL>
复制

这里添加备库前,需要提前清空主备库 log_archive_dest_n 的参数配置,交给 DG Broker 来管理,否则报错 ORA-16698

主库备库都执行

SQL> alter system set log_archive_dest_2='' scope=both; System altered. SQL>
复制
DGMGRL> add database orcldg as connect identifier is orcldg maintained as physical; Database "orcldg" added DGMGRL>
复制

启用配置

DGMGRL> enable configuration; Enabled. DGMGRL> enable database orcl; Enabled. DGMGRL> enable database orcldg; Enabled. DGMGRL>
复制

查看配置

DGMGRL> show configuration; Configuration - dg_config Protection Mode: MaxPerformance Members: orcl - Primary database orcldg - Physical standby database Fast-Start Failover: Disabled Configuration Status: SUCCESS (status updated 20 seconds ago) DGMGRL>
复制

查看主库状态

DGMGRL> show database orcl Database - orcl Role: PRIMARY Intended State: TRANSPORT-ON Instance(s): orcl Database Status: SUCCESS DGMGRL>
复制

查看备库状态

DGMGRL> show database orcldg Database - orcldg Role: PHYSICAL STANDBY Intended State: APPLY-ON Transport Lag: 0 seconds (computed 1 second ago) Apply Lag: 0 seconds (computed 1 second ago) Average Apply Rate: 2.00 KByte/s Real Time Query: ON Instance(s): orcldg Database Status: SUCCESS DGMGRL>
复制

5.2.3 主备切换

使用 DG Broker 进行主备切换建议配置监听,否则切换成功但是会报错 ORA-12514

#注意GLOBAL_DBNAME是db_unique_name + _DGMGRL #主库操作 [oracle@primary admin]$ cat listener.ora # listener.ora Network Configuration File: /u01/app/oracle/product/19.3.0/db_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.17.26)(PORT = 1521)) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = orcl) (ORACLE_HOME = /u01/app/oracle/product/19.3.0/db_1) (GLOBAL_DBNAME = orcl_DGMGRL) ) ) [oracle@primary admin]$ lsnrctl reload LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 25-MAR-2025 23:07:02 Copyright (c) 1991, 2024, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.17.26)(PORT=1521))) The command completed successfully [oracle@primary admin]$ #备库操作 [oracle@standby admin]$ cat listener.ora # listener.ora Network Configuration File: /u01/app/oracle/product/19.3.0/db_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.17.27)(PORT = 1521)) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = orcldg) (ORACLE_HOME = /u01/app/oracle/product/19.3.0/db_1) (GLOBAL_DBNAME = orcldg_DGMGRL) ) ) [oracle@standby admin]$ lsnrctl reload LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 25-MAR-2025 23:08:01 Copyright (c) 1991, 2024, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.17.27)(PORT=1521))) The command completed successfully [oracle@standby admin]$
复制

进行切换

DGMGRL> switchover to orcldg Performing switchover NOW, please wait... Operation requires a connection to database "orcldg" Connecting ... Connected to "orcldg" Connected as SYSDBA. New primary database "orcldg" is opening... Operation requires start up of instance "orcl" on database "orcl" Starting instance "orcl"... Connected to an idle instance. ORACLE instance started. Connected to "orcl" Database mounted. Database opened. Switchover succeeded, new primary is "orcldg" DGMGRL> show database orcl; Database - orcl Role: PHYSICAL STANDBY Intended State: APPLY-ON Transport Lag: 0 seconds (computed 1 second ago) Apply Lag: 0 seconds (computed 1 second ago) Average Apply Rate: 4.00 KByte/s Real Time Query: ON Instance(s): orcl Database Status: SUCCESS DGMGRL> show database orcldg; Database - orcldg Role: PRIMARY Intended State: TRANSPORT-ON Instance(s): orcldg Database Status: SUCCESS DGMGRL>
复制

切换后检查主库

[oracle@primary admin]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Tue Mar 25 23:09:38 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.26.0.0.0 SQL> select database_role,protection_mode,open_mode from v$database; DATABASE_ROLE PROTECTION_MODE OPEN_MODE ---------------- -------------------- -------------------- PHYSICAL STANDBY MAXIMUM PERFORMANCE READ ONLY WITH APPLY --发现切换后已经变成备库 SQL>
复制

切换后检查备库

[oracle@standby admin]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Tue Mar 25 23:12:11 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.26.0.0.0 SQL> select database_role,protection_mode,open_mode from v$database; DATABASE_ROLE PROTECTION_MODE OPEN_MODE ---------------- -------------------- -------------------- PRIMARY MAXIMUM PERFORMANCE READ WRITE --发现切换后已经变成主库 SQL>
复制

6. DG手动切换

6.1 主库验证是否能切换

[oracle@primary admin]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 26 20:34:51 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.26.0.0.0 --数据库12.1以上直接用alter database switchover to <备库> verify; SQL> alter database switchover to orcldg verify; Database altered. SQL> set linesize 1000 SQL> select open_mode, database_role, switchover_status, force_logging, dataguard_broker, guard_status from v$database; OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS FORCE_LOGGING DATAGUAR GUARD_S -------------------- ---------------- -------------------- --------------------------------------- -------- ------- READ WRITE PRIMARY TO STANDBY YES DISABLED NONE SQL>
复制

注意验证命令出现如下报错

ORA-16470: Redo Apply is not running on switchover target报错,这种情况说明数据没有正常同步,需要同步完成后,再进行切换。

ORA-16475: succeeded with warnings, check alert log for more details,这种情况查看主库和备库的alter文件

6.2 切换操作

在12c版本之前,具体切换如下操作

主库操作

[oracle@primary admin]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 26 21:19:58 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.26.0.0.0 SQL> alter database commit to switchover to standby with session shutdown; Database altered. SQL> exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.26.0.0.0 #注意等待备库切换完成后执行下面操作 [oracle@primary admin]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 26 21:23:44 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to an idle instance. SQL> startup mount; ORACLE instance started. Total System Global Area 1979711112 bytes Fixed Size 8941192 bytes Variable Size 1442840576 bytes Database Buffers 520093696 bytes Redo Buffers 7835648 bytes Database mounted. SQL> alter database open read only; Database altered. SQL> alter database recover managed standby database using current logfile disconnect; Database altered. SQL> select database_role,protection_mode,open_mode from v$database; DATABASE_ROLE PROTECTION_MODE OPEN_MODE ---------------- -------------------- -------------------- PHYSICAL STANDBY MAXIMUM PERFORMANCE READ ONLY WITH APPLY SQL>
复制

备库执行

[oracle@standby ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 26 21:25:30 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.26.0.0.0 SQL> alter database recover managed standby database cancel; Database altered. SQL> alter database commit to switchover to primary with session shutdown; Database altered. SQL> shutdown immediate ORA-01109: database not open Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 1979711112 bytes Fixed Size 8941192 bytes Variable Size 1442840576 bytes Database Buffers 520093696 bytes Redo Buffers 7835648 bytes Database mounted. Database opened. SQL> select database_role,protection_mode,open_mode from v$database; DATABASE_ROLE PROTECTION_MODE OPEN_MODE ---------------- -------------------- -------------------- PRIMARY MAXIMUM PERFORMANCE READ WRITE SQL>
复制

6.3 一命令切换

12c版本后简化切换操作,通过一条命令进行切换

主库操作

[oracle@primary ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 26 21:39:49 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.26.0.0.0 SQL> alter database switchover to orcldg; Database altered. SQL> exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.26.0.0.0 #注意等待备库打开完成后执行下面操作 [oracle@primary ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 26 21:48:36 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to an idle instance. SQL> startup mount; ORACLE instance started. Total System Global Area 1979711112 bytes Fixed Size 8941192 bytes Variable Size 1442840576 bytes Database Buffers 520093696 bytes Redo Buffers 7835648 bytes Database mounted. SQL> select database_role,protection_mode,open_mode from v$database; DATABASE_ROLE PROTECTION_MODE OPEN_MODE ---------------- -------------------- -------------------- PHYSICAL STANDBY MAXIMUM PERFORMANCE MOUNTED SQL> alter database open read only; Database altered. SQL> alter database recover managed standby database using current logfile disconnect; Database altered. SQL> select database_role,protection_mode,open_mode from v$database; DATABASE_ROLE PROTECTION_MODE OPEN_MODE ---------------- -------------------- -------------------- PHYSICAL STANDBY MAXIMUM PERFORMANCE READ ONLY WITH APPLY SQL>
复制

备库操作

[oracle@standby ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 26 21:48:52 2025 Version 19.26.0.0.0 Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.26.0.0.0 SQL> select database_role,protection_mode,open_mode from v$database; DATABASE_ROLE PROTECTION_MODE OPEN_MODE ---------------- -------------------- -------------------- PRIMARY MAXIMUM PERFORMANCE MOUNTED SQL> alter database open; Database altered. SQL> select database_role,protection_mode,open_mode from v$database; DATABASE_ROLE PROTECTION_MODE OPEN_MODE ---------------- -------------------- -------------------- PRIMARY MAXIMUM PERFORMANCE READ WRITE SQL>
复制

7. DG 运维管理命令

7.1 管理MRP进程

关闭开启MRP进程,备库执行

--关闭 MRP alter database recover managed standby database cancel; --开启 MRP 非实时同步 alter database recover managed standby database disconnect; --ADG 开启 MRP 实时同步 alter database recover managed standby database using current logfile disconnect; --开启延迟同步1小时 alter database recover managed standby database delay 60 disconnect; --取消延迟同步 alter database recover managed standby database nodelay;
复制

手工注册归档日志,备库执行

alter database register logfile '/u01/app/oracle/fast_recovery_area/ORCLDG/archivelog/1_5752_952275269.dbf';
复制

7.2 检查 DG 同步情况

主库执行

--查看db_name,打开模式,数据库角色,保护模式,保护级别,是否能切换状态为TO STANDBY或者SESSION ACTIVE都代表可以切换 set linesize 1000 select name,open_mode,database_role,protection_mode,protection_level,switchover_status from v$database; --查当前日志的传输情况 set linesize 1000 col error for a20 select dest_id,status,error,archiver,transmit_mode,affirm,net_timeout,delay_mins,async_blocks from v$archive_dest where target='STANDBY'; --查看主库状态 set line 1000 col status for a10 col type for a10 col error for a20 col gap_status for a20 col synchronization_status for a30 col recovery_mode for a60 select inst_id,status,dest_id,type,database_mode,error,gap_status,synchronized,synchronization_status,recovery_mode from gv$archive_dest_status where status <> 'INACTIVE' and type = 'PHYSICAL'; --查redo应用情况 如果2个值一样 说明redo全部应用成功 select max(al.sequence#) "Last Seq Recieved", max(lh.sequence#) "Last Seq Applied" from v$archived_log al, v$log_history lh; --查最新的序列号 select ads.dest_id, max(sequence#) "Current Sequence", max(log_sequence) "Last Archived", max(applied_seq#) "Last Sequence Applied" from v$archived_log al, v$archive_dest ad, v$archive_dest_status ads where ad.dest_id=al.dest_id and al.dest_id=ads.dest_id group by ads.dest_id;
复制

备库执行

--查看db_name,打开模式,数据库角色,保护模式,保护级别,是否能切换,状态为NOT ALLOWED代表正常 set linesize 1000 select name,open_mode,database_role,protection_mode,protection_level,switchover_status from v$database; --查看相应的进程是否正常,主要是看MRP进程还有sequence# set linesize 1000 select process,client_process,sequence#,status from v$managed_standby; --查看备库gap情况 select * from v$archive_gap;
复制

8. 自动化运维备库脚本

很多情况下备库都需要人工清理归档日志,另外重启备机还要启动备库实例和MRP进程。这些我们都用以下脚本来操作

8.1 备库自启动脚本

[oracle@standby ~]$ cat autostart_dg.sh #!/bin/sh source /home/oracle/.bash_profile lsnrctl start sqlplus / as sysdba << EOF startup alter database recover managed standby database using current logfile disconnect from session; exit EOF [oracle@standby ~]$ chmod +775 autostart_dg.sh [oracle@standby ~]$ exit logout [root@standby ~]# cat /etc/rc.local #!/bin/bash # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES # # It is highly advisable to create own systemd services or udev rules # to run scripts during boot instead of using this file. # # In contrast to previous versions due to parallel execution during boot # this script will NOT be run after all other services. # # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure # that this script will be executed during boot. touch /var/lock/subsys/local su - oracle -c '/home/oracle/autostart_dg.sh' [root@standby ~]# chmod +x /etc/rc.d/rc.local [root@standby ~]#
复制

8.2 备库自动清理归档日志脚本

每天1点rman自动删除7天前的归档日志

[oracle@standby ~]$ cat delete_dg_archivelog.sh #!/bin/bash source /home/oracle/.bash_profile rman target / << EOF > /home/oracle/del_`date +%Y%m%d`.log delete noprompt archivelog all completed before 'sysdate-7'; exit; EOF [oracle@standby ~]$ chmod +775 delete_dg_archivelog.sh [oracle@standby ~]$ crontab -l 0 1 * * * /home/oracle/delete_dg_archivelog.sh [oracle@standby ~]$
复制
最后修改时间:2025-03-27 09:36:16
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

目录
  • Oracle Data Guard 高可用性解决方案详解
    • 1. Data Guard 核心概念
      • 1.1 工作原理
      • 1.2 备库类型对比
    • 2. 重做传输模式详解
      • 2.1 同步传输模式 (SYNC)
      • 2.2 异步传输模式 (ASYNC)
    • 3. Data Guard 架构深度解析
    • 4. 物理 Data Guard 部署实践
      • 4.1 环境规划建议
      • 4.2 详细配置步骤
      • 4.3 RMAN Duplicate技巧
    • 5. Data Guard Broker高级管理
      • 5.1 Data Guard 核心概念
      • 5.2 配置最佳实践
    • 6. DG手动切换
      • 6.1 主库验证是否能切换
      • 6.2 切换操作
      • 6.3 一命令切换
    • 7. DG 运维管理命令
      • 7.1 管理MRP进程
      • 7.2 检查 DG 同步情况
    • 8. 自动化运维备库脚本
      • 8.1 备库自启动脚本
      • 8.2 备库自动清理归档日志脚本