Oracle Data Guard 高可用性解决方案详解
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架构如下图
关键组件工作流程:
- LNS进程:主库的Log Network Service进程从重做日志缓冲区捕获redo数据
- RFS进程:备库的Remote File Server进程接收redo并写入备用重做日志
- MRP进程:物理备库的Managed Recovery Process应用redo到数据文件
- 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 ~]$
复制