FAL_CLIENT和FAL_SERVER 不设置也能apply redo

本文探讨了在未配置FAL_CLIENT和FAL_SERVER的情况下,数据库如何通过自动归档和RFS进程处理归档日志间隙。实验表明,即使不设置这些参数,主备库间的GAP仍可通过常规流程得以解决,但FAL参数的作用和配置在高可用场景中的最佳实践被详细解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FAL_CLIENT和FAL_SERVER是配置dataguard用到的两个参数,FAL指获取归档日志(Fetch Archived Log)

正常情况MRP进程负责FAL,出现GAP使用RFS进程读取FAL_SERVER=pri,设置FAL_CLIENT=dg 因为主库可能反向查询dg的信息,这两个值就是TNS中的,和rman duplicate时一样的。

在一定的条件下,或者因为网络失败,或者因为资源紧张,会在primary和standby之间产生裂隙,也就是有些归档日志没有及时的传输并应用到standby库。因为MRP(managed recovery process)/LSP(logical standby process)没有与primary直接通讯的能力来获取丢失的归档日志。因此这些gaps通过FAL客户和服务器来解决,由初始化参数定义FAL_CLIENT和FAL_SERVER。

FAL_SERVER指定一个Oracle Net service name,standby数据库使用这个参数连接到FAL server,这个参数适用于standby站点。比如,FAL_SERVER = PrimaryDB,此处PrimaryDB是一个TNS name,指向primary库。

FAL_CLIENT指定一个FAL客户端的名字,以便FAL Server可以引用standby库,这也是一个TNS name,primary库必须适当配置此TNS name指向stanby库。这个参数也是在standby库端设置。比如,FAL_CLIENT = StandbyDB,StandbyDB是standby库的TNS name。

FAL_CLIENT和FAL_SERVER应该成对设置或改变。

这两个参数只需在standby库设置,但也可以在primary库设置这两个参数,以方便switchover或failover时primary库转变为standby角色。
 

做了几个实验,主备库都是没有配置FAL参数,GAP也能解决。 实验过程如下:

1.主备库  并且没有配置FAL

SQL> show parameter fal

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

fal_client string

fal_server string

2.接下来 DOWN掉备库, 主库并且重启DB  然后切换多次主库归档

SQL> archive log list;

Database log mode Archive Mode

Automatic archival Enabled

Archive destination /u01/arch

Oldest online log sequence 594

Next log sequence to archive 596

Current log sequence 596

…多次切换 …

SQL> archive log list;

Database log mode Archive Mode

Automatic archival Enabled

Archive destination /u01/arch

Oldest online log sequence 603

Next log sequence to archive 605

Current log sequence 605

3.开启备库监听和DB并接受应用日志

Sat Oct 10 10:39:54 2015

Managed Standby Recovery not using Real Time Apply

Parallel Media Recovery started with 4 slaves

Waiting for all non-current ORLs to be archived...

All non-current ORLs have been archived.

Media Recovery Waiting for thread 1 sequence 596

FAL[client]: Error fetching gap sequence, no FAL server specified

Completed: alter database recover managed standby database disconnect from session

此时会看到GAP信息,但是归档还是可以传过来并被应用的。

Sat Oct 10 10:41:07 2015

Using STANDBY_ARCHIVE_DEST parameter default value as /u01/app/oracle/product/11.2.0/db_1/dbs/arch

RFS[1]: Assigned to RFS process 12075

RFS[1]: Opened log for thread 1 sequence 598 dbid 1651635937 branch 886845731

Archived Log entry 80 added for thread 1 sequence 598 rlc 886845731 ID 0x62727be1 dest 2:

Sat Oct 10 10:41:08 2015

RFS[2]: Assigned to RFS process 12079

RFS[2]: Opened log for thread 1 sequence 596 dbid 1651635937 branch 886845731

RFS[1]: Opened log for thread 1 sequence 599 dbid 1651635937 branch 886845731

Archived Log entry 81 added for thread 1 sequence 599 rlc 886845731 ID 0x62727be1 dest 2:

Sat Oct 10 10:41:08 2015

RFS[3]: Assigned to RFS process 12077

RFS[3]: Opened log for thread 1 sequence 597 dbid 1651635937 branch 886845731

Archived Log entry 82 added for thread 1 sequence 596 rlc 886845731 ID 0x62727be1 dest 2:

Archived Log entry 83 added for thread 1 sequence 597 rlc 886845731 ID 0x62727be1 dest 2:

RFS[1]: Opened log for thread 1 sequence 600 dbid 1651635937 branch 886845731

RFS[2]: Opened log for thread 1 sequence 601 dbid 1651635937 branch 886845731

Archived Log entry 84 added for thread 1 sequence 600 rlc 886845731 ID 0x62727be1 dest 2:

RFS[3]: Opened log for thread 1 sequence 602 dbid 1651635937 branch 886845731

Archived Log entry 85 added for thread 1 sequence 601 rlc 886845731 ID 0x62727be1 dest 2:

Archived Log entry 86 added for thread 1 sequence 602 rlc 886845731 ID 0x62727be1 dest 2:

RFS[1]: Opened log for thread 1 sequence 603 dbid 1651635937 branch 886845731

Archived Log entry 87 added for thread 1 sequence 603 rlc 886845731 ID 0x62727be1 dest 2:

RFS[2]: Opened log for thread 1 sequence 604 dbid 1651635937 branch 886845731

Archived Log entry 88 added for thread 1 sequence 604 rlc 886845731 ID 0x62727be1 dest 2:

RFS[2]: Opened log for thread 1 sequence 605 dbid 1651635937 branch 886845731

Archived Log entry 89 added for thread 1 sequence 605 rlc 886845731 ID 0x62727be1 dest 2:

Sat Oct 10 10:41:11 2015

Primary database is in MAXIMUM PERFORMANCE mode

RFS[4]: Assigned to RFS process 12081

RFS[4]: No standby redo logfiles created

RFS[4]: Opened log for thread 1 sequence 606 dbid 1651635937 branch 886845731

Sat Oct 10 10:41:14 2015

Media Recovery Log /u01/app/oracle/product/11.2.0/db_1/dbs/arch1_596_886845731.dbf

Media Recovery Log /u01/app/oracle/product/11.2.0/db_1/dbs/arch1_597_886845731.dbf

Media Recovery Log /u01/app/oracle/product/11.2.0/db_1/dbs/arch1_598_886845731.dbf

Media Recovery Log /u01/app/oracle/product/11.2.0/db_1/dbs/arch1_599_886845731.dbf

Media Recovery Log /u01/app/oracle/product/11.2.0/db_1/dbs/arch1_600_886845731.dbf

Media Recovery Log /u01/app/oracle/product/11.2.0/db_1/dbs/arch1_601_886845731.dbf

Media Recovery Log /u01/app/oracle/product/11.2.0/db_1/dbs/arch1_602_886845731.dbf

Media Recovery Log /u01/app/oracle/product/11.2.0/db_1/dbs/arch1_603_886845731.dbf

Media Recovery Log /u01/app/oracle/product/11.2.0/db_1/dbs/arch1_604_886845731.dbf

Media Recovery Log /u01/app/oracle/product/11.2.0/db_1/dbs/arch1_605_886845731.dbf

Media Recovery Waiting for thread 1 sequence 606 (in transit)

然后,他又尝试备库断掉之后,将主库的归档日志MV移动到其他地方,备库启动后,提示GAP,但是将归档MV回去后,又可以自动同步,这些都是在主备库没有设置FAL参数的情况想完成的,那么FAL参数到底有什么作用呢?

以下是我在没有设置FAL参数时的实验,数据库版本同样是11.2.0.4.0,备库无法read only模式打开。

[oracle@SL010M6-DB-PROMSTD2 admin]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Fri Oct 16 17:44:29 2015

Copyright (c) 1982, 2013, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select status from v$instance;

STATUS

------------

MOUNTED

SQL> alter database open;

当OPEN备库的时候,需要介质恢复,由于没有设置FAL参数,备库不知道去哪取日志,命令将会夯住,告警日志会提示没有设置FAL参数。

alter database open

AUDIT_TRAIL initialization parameter is changed to OS, as DB is NOT compatible for database opened with read-only access

Signalling error 1152 for datafile 1!

Beginning Standby Crash Recovery.

Serial Media Recovery started

Managed Standby Recovery starting Real Time Apply

Media Recovery Waiting for thread 1 sequence 36

FAL[client]: Error fetching gap sequence, no FAL server specified

Fri Oct 16 17:44:53 2015

FAL[client]: Error fetching gap sequence, no FAL server specified

Fri Oct 16 17:45:03 2015

FAL[client]: Error fetching gap sequence, no FAL server specified

Fri Oct 16 17:45:13 2015

FAL[client]: Error fetching gap sequence, no FAL server specified

Fri Oct 16 17:45:23 2015

FAL[client]: Error fetching gap sequence, no FAL server specified

设置FAL参数后,备库就可以READ ONLY模式打开。

SQL> alter system set fal_client=promstd2;

System altered.

SQL> alter system set fal_server=promotion;

System altered.

SQL>

备库告警日志信息如下:

Fri Oct 16 17:47:16 2015

alter database open

Signalling error 1152 for datafile 1!

Beginning Standby Crash Recovery.

Serial Media Recovery started

Managed Standby Recovery starting Real Time Apply

Media Recovery Log /u01/app/oracle/arch/1_38_892918972.arc

Incomplete Recovery applied until change 1243923 time 10/16/2015 17:42:31

Completed Standby Crash Recovery.

### 关于 `fal_partition_write` 函数的实现细节 在分析 `fal_partition_write` 的具体实现时,该函数主要用于向指定分区写入数据。通常情况下,此操作会涉及到底层闪存驱动程序以及文件抽象层 (FAL) 组件之间的交互。 #### FAL 分区写入机制概述 当调用 `fal_partition_write` 时,系统会执行一系列验证准备动作来确保即将发生的写入操作安全可靠: - **参数校验**:确认传入的目标地址、长度等参数合法有效。 - **锁定资源**:防止并发访问引起的数据竞争条件。 - **实际写入过程**:通过调用具体的 flash 设备接口完成物理存储单元上的数据更新[^1]。 对于提到的具体位置即第470行附近的问题,这可能涉及到了某些特定平台下的优化处理或是异常情况捕获逻辑。由于同版本间可能存在差异,在 `packages\fal-v1.0.0\samples\porting\fal_cfg.h` 文件中的定义可能会有所同。 考虑到报告中提及的 `(init_ok)` 断言失败发生在 `fal_partition_find` 调用期间,这意味着初始化阶段未能成功创建预期的对象实例或配置项。此类问题往往源于环境设置当或者是依赖关系缺失所造成的影响[^2]。 为了更精确地定位并解决问题,建议采取如下措施: - 审查当前使用的 RT-Thread 版本及其配套库是否匹配最新稳定版; - 检查硬件连接状态及启动脚本内有关 Flash 初始化的部分是否有误; - 尝试简化测试场景以排除其他因素干扰,专注于基本功能验证; ```c // 示例代码片段展示如何正确使用 fal_partition_write 进行写入操作 #include "fal.h" int main(void){ uint8_t data[] = {0x1, 0x2, 0x3}; // 假设已经有一个有效的 partition 句柄名为 part_handle int result = fal_partition_write(part_handle, 0, data, sizeof(data)); if(result != FAL_OK){ printf("Write failed with error code %d\n", result); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值