理解standby redo log

在创建Oracle Dataguard的时候,难免会碰到Standby Redo Log(SRL),它和ORL到底有何不同,下面是我自己的一点理解,大部分都是翻的Oracle官方文档:

1. SRL只有在数据库是standby角色是才起作用,Oracle建议我们为primary也配置SRL只是为了以后主从切换时不用人为干预

2. standby上SRL完全等同与primary上的ORL,在primary发生日志切换时,Remote File System(RFS)进程把primary上的ORL写到standby的SRL,同时standby归档上一个SRL

3. standby通过应用并归档SRL以达到与primary一致。


如果standby log应用服务会等待单个归档文件全部接收之后再启动应用(在前面redo传输服务中我们介绍了不同形式的传输方式),如果standby端使 用了standby redologs,就可以打开实时应用(real-time apply),这样dg就不需要再等待接收完归档文件,只要rfs将 redo数据写入standby redologs,即可通过MRP/LSP实时写向standby。



物理standby启用实时应用通过下列语句:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE ;


逻辑standby启用实时应用通过下列语句:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;


2、REDO数据延迟应用
有 实时就有延迟,某些情况下你可能不希望standby与primary太过同步:),那就可以在log_archive_dest_n参数中指定 delay属性(单位为分钟,如果指定了delay属性,但没有指定值,则默认是30分钟)。注意,该属性并不是说延迟发送redo数据到standby,而是指明归档到standby后,开始应用的时候。


不过,即使在log_archive_dest_n中指定了delay属性,但如果你应用数据时指定了实时应用,则standby会忽略delay属性。另外Oracle 11g,standby端还可以通过下列的语句取消延迟应用。


物理standby取消延迟应用可以通过下列语句:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE NODELAY;


逻辑standby取消延迟应用可以通过下列语句:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY NODELAY;


提示:flashback database也可视为延迟应用的一种方式。


二、应用redo数据到物理standby
注意:启动redo应用,物理standby需要首先启动到mount状态,然后再执行下列语句启动,或者停止redo应用。
1、启动redo应用
v 前台应用
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE;


v 后台应用
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;Oracle数据库


v 启动实时应用,附加USING CURRENT LOGFILE子句即可
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE;


SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 停止redo应用
<think>我们正在处理一个Oracle RAC环境中的问题:如何删除备用重做日志(Standby Redo Log, SRL)。备用重做日志在Data Guard环境中用于接收主库传递过来的重做数据,在物理备库上使用。当不再需要备用重做日志时,我们可以将其删除。 操作步骤: 1. 确认当前备用重做日志的状态和组信息。 2. 删除备用重做日志组。 注意:在删除之前,确保这些日志组没有被使用(即没有活动的事务正在写入)。在RAC环境中,每个实例都可能有自己的线程,因此需要确保所有实例的备用重做日志都被删除。 具体步骤: a. 查询当前备用重做日志信息: ```sql SELECT GROUP#, THREAD#, SEQUENCE#, BYTES, MEMBERS, STATUS FROM V$STANDBY_LOG; ``` 如果STATUS为ACTIVE或CURRENT,表示正在使用,不能立即删除。需要等待其状态变为UNUSED或INACTIVE。 b. 删除备用重做日志组: 对于每个组,执行: ```sql ALTER DATABASE DROP STANDBY LOGFILE GROUP <group_number>; ``` 在RAC环境中,需要确保删除所有实例的备用重做日志组。注意,每个实例的线程(THREAD)对应的组都需要删除。 但是,在RAC环境中,备用重做日志组通常是所有实例共享的(每个组有多个成员,每个成员位于不同的存储上,以支持所有实例的访问)。实际上,在RAC中配置备用重做日志时,我们为每个线程(对应一个实例)创建相同数量的组。因此,删除时需要删除所有组的日志。 另一种做法是,我们可以先删除每个组的成员,然后再删除组。但是,Oracle允许直接删除整个组。 重要:在删除之前,确保数据库处于打开状态(备库通常是处于打开状态,但应用日志可能暂停)。建议在维护窗口进行,并暂停日志应用。 步骤详细: 1. 连接到备库(如果是物理备库,确保以只读方式打开或处于应用日志的状态)。 2. 检查日志组状态,确保没有活动日志。 3. 逐个删除每个组。 例如,删除组5: ```sql ALTER DATABASE DROP STANDBY LOGFILE GROUP 5; ``` 注意:在RAC环境中,每个节点都应该能够访问到这些日志文件,因此删除操作在任意一个节点执行即可(因为RAC共享存储),但操作会作用于整个数据库。 但是,根据Oracle文档,在RAC环境中,删除日志文件的操作需要在所有实例上都执行吗?实际上,不需要。因为日志文件是数据库级的,而不是实例级的。所以在一个实例上执行删除即可。 然而,为了安全,最好在每个实例上都检查一下V$STANDBY_LOG视图,确保没有实例在使用要删除的日志组。 另外,删除物理文件:上述命令只会从数据库控制文件中删除日志组,并不会删除操作系统上的文件。因此,在删除日志组后,需要手动删除操作系统上的日志文件。 因此,完整的步骤包括: 1. 暂停日志应用(如果备库正在应用日志): ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ``` 2. 检查日志组状态,确保所有备用重做日志组都是未激活状态(UNUSED或INACTIVE)。 3. 逐个删除备用重做日志组。 4. 手动删除操作系统上的备用重做日志文件。 5. 如果需要,重新启动日志应用: ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; ``` 注意:在RAC环境中,步骤1和步骤5需要在所有实例上执行吗?实际上,暂停日志应用只需要在一个实例上执行(因为恢复进程是全局的),同样,重新启动日志应用也只需要在一个实例上执行。 但是,为了确保一致性,建议在主节点(或者通常运行恢复进程的节点)上执行这些操作。 另外,如果备用重做日志组正在使用(比如由于主库还在传输日志),那么删除操作会报错。因此,确保在删除前,主库已经停止向该备库传输日志(或者将备库置为未保护模式),或者等待备用重做日志组不再活动。 然而,在正常的操作中,我们可能不希望停止主库的传输。因此,可以选择在备库上临时停止重做传输服务(这需要协调主备库)。但更简单的方法是在备库上等待备用重做日志组变为非活动状态。 总结步骤: 1. 在备库上停止日志应用(可选,如果日志应用正在运行,可能会持续写入日志,导致日志组状态变化,但为了安全,停止应用可以避免状态变化): ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ``` 2. 等待所有备用重做日志组变为INACTIVE或UNUSED(可以通过反复查询V$STANDBY_LOG来确认)。 3. 使用ALTER DATABASE DROP STANDBY LOGFILE GROUP命令删除每个组。 4. 手动删除操作系统上的日志文件(注意:在RAC环境中,文件可能位于共享存储上,确保所有节点都不可访问这些文件)。 5. 重新启动日志应用(如果之前停止了): ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; ``` 注意:在RAC环境中,如果备用重做日志组配置了多个成员(每个成员位于不同的磁盘路径),那么每个成员都需要在操作系统中删除。 引用说明:以上操作参考了Oracle Data Guard的常见管理方法,但具体操作细节可参考Oracle官方文档[^1]。 根据用户提供的引用,我们注意到引用[1]提到了主库只向本地备库传输重做日志,但归档到远程备库。引用[2]则是在备库上创建监听器的配置。这些引用与当前问题关联不大,因此我们主要依据标准操作流程。 相关问题: §§相关问题§§ 1. 在删除备用重做日志之前,如何确认它们没有被使用? 2. 在Oracle RAC环境中,备用重做日志的配置与单实例有什么不同? 3. 删除备用重做日志后,对Data Guard的运行会有什么影响?</think>### 在Oracle RAC环境中删除备用重做日志(Standby Redo Log)的操作方法 #### 1. **确认备用重做日志状态** 在删除前,先检查日志组状态,确保没有活动日志: ```sql SELECT GROUP#, THREAD#, SEQUENCE#, BYTES, MEMBERS, STATUS FROM V$STANDBY_LOG; ``` - 若状态为 `ACTIVE` 或 `CURRENT`,需等待其变为 `UNUSED` 或 `INACTIVE`[^1]。 - 在RAC环境中需检查所有实例的线程(`THREAD#`)。 #### 2. **暂停日志应用(可选)** 为避免数据不一致,建议在物理备库暂停日志应用: ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ``` #### 3. **删除备用重做日志组** 通过SQL命令逐组删除(以组号5为例): ```sql ALTER DATABASE DROP STANDBY LOGFILE GROUP 5; ``` - **RAC注意事项**: - 需删除所有线程(Thread)关联的日志组。 - 若日志组跨多个路径,需确保所有路径下的文件被清除。 #### 4. **手动删除操作系统文件** 从数据库控制文件删除后,需手动清理物理文件: ```bash rm /u01/oradata/SRL/standby_redo01.log # 根据实际路径删除 ``` #### 5. **重启日志应用(若已暂停)** ```sql ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; ``` #### 6. **验证删除结果** ```sql SELECT * FROM V$STANDBY_LOG; -- 应无返回结果 SELECT NAME FROM V$LOGFILE WHERE TYPE='STANDBY'; -- 确认无残留 ``` ### 关键注意事项 1. **RAC环境特殊性**: - 操作需在**所有实例**上验证状态。 - 确保共享存储(如ASM/GPFS)中的文件被完全清除。 2. **影响范围**: - 删除后主库仍可传输redo,但备库失去实时恢复能力,需重新配置SRL恢复[^1]。 3. **文件权限**: - 操作需由`oracle`用户执行,确保对日志文件路径有写权限。 > 示例:删除组号5的SRL后控制文件更新 > ```sql > ALTER DATABASE DROP STANDBY LOGFILE GROUP 5; > -- 返回 "Database altered" 表示成功 > ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值