找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1745

积分

0

好友

235

主题
发表于 12 小时前 | 查看: 2| 回复: 0

Oracle 12c 推出了 Oracle Flex ASM,这是一项旨在提升数据库集群存储管理灵活性与高可用性的重要特性。

Flex ASM 可在 GI (Grid Infrastructure) 的初始安装过程中启用。具体操作是选择“Advanced Installation”,然后选择“Use Oracle Flex ASM for Storage”。需要注意的是,这个选项仅在安装集群时出现,不适用于单实例配置。对于已经存在的非 Flex 标准集群,也可以通过图形化管理工具 asmca 将其转换成 Flex 模式。但是,一旦选择了 Flex ASM,就无法再转换回标准的 ASM 集群了。

可以通过以下命令验证 Flex 模式是否已开启:

ASMCMD> showclustermode
ASM cluster : Flex mode enabled
ASMCMD>
ASMCMD> showclusterstate
Normal

Oracle Flex ASM 的核心价值在于,它允许数据库客户端在本地 ASM 实例发生故障时,自动连接到远端的、正常运行的 ASM 实例。为了实现这一点,在配置 Flex ASM 时,需要增加一个私有的 ASM 网络,专门用于集群内 ASM 实例间的通信。这样一来,当某个节点上的 ASM 实例宕机,运行在该实例上的数据库便能通过 ASM 网络无缝切换到其他健康的 ASM 实例。强烈建议为 ASM 配置独立的网络接口,即便它与私有集群互联网络共用,也需要确保 ASM 通信的正常进行。

在 Flex 配置下,如果某个 ASM 实例发生故障,Oracle 集群软件会尝试在另一台可用服务器上启动一个新的 ASM 实例,以满足预先设定的基数(Cardinality)要求。ASM 基数设置决定了集群中任意时刻需要保持可用的 ASM 实例数量,其默认值为 3,并且可以通过 srvctl 命令进行修改。

要显示当前的 ASM 基数配置,可以执行:

[oracle@Linux71 ~]$ srvctl config asm
ASM home:<CRS home>
Password file:+OCR_DISK/orapwASM
ASM listener: LISTENER
ASM instance count: 3
Cluster ASM listener:ASMNET1LSNR_ASM
[oracle@Linux71 ~]$

从上面的输出可以看到,“ASM instance count:3” 就是默认的基数设置。这个值可以通过 srvctl modify asm -count <value> 命令动态修改:

[oracle@Linux71 ~]$srvctl modify asm -count 2
[oracle@Linux71 ~]$
[oracle@Linux71 ~]$ srvctl config asm
ASM home:<CRS home>
Password file:+OCR_DISK/orapwASM
ASM listener:LISTENER
ASM instance count: 2
Cluster ASM listener:ASMNET1LSNR_ASM
[oracle@Linux71 ~]$

修改基数后,集群软件会自动调整集群中 ASM 实例的数量。例如,在将基数从默认的 3 改为 2 之前,一个两节点的、配置了 Flex ASM 的测试 RAC 环境中,可能会显示第三个 ASM 实例状态为 OFFLINE,这正是因为默认基数为 3。即使物理上没有第三个节点,集群软件的逻辑视图也会显示 3 个 ASM 条目。如果将基数设为 5,则会显示 5 个条目,其中 3 个是 OFFLINE 状态。这一切都是由集群软件动态管理的,为实现高可用与弹性伸缩提供了基础。

下面的例子演示了将基数设置为 5,但实际只有两台物理服务器的情况:

srvctl modify asm -count 5
crsctl stat res -t
ora.asm
1  ONLINE ONLINE linux71   Started, STABLE
2 ONLINE ONLINE linux72    Started,STABLE
3 OFFLINE OFFLINE          STABLE
4 OFFLINE OFFLINE           STABLE
5 OFFLINE OFFLINE           STABLE

Oracle Flex ASM三节点部署架构图

图1:3节点的Flex ASM配置(基数设置为2)

基数的最小值不能小于 2,尝试设置为 1 会报错:

[oracle@Linux71 ~]$ srvctl modify asm -count 1
PRCA-1123 : The specified ASM cardinality 1 is less than the minimum cardinality of 2.

图1展示了一个 3 节点 Flex ASM 集群,其基数设置为 2。ASM 实例实际运行在 Server1 和 Server3 上,这与基数 2 的规则一致。Server2 上并未运行 ASM 实例,它作为一台纯粹的数据库服务器(客户端),通过 ASM 网络与 Flex ASM 服务器通信以获取存储元数据。如果 Server3 上的 ASM 实例发生故障,集群软件会自动在 Server2 上启动一个新的 ASM 实例,以满足“至少两个 ASM 实例在线”的基数要求。与此同时,原来在 Server3 上的数据库会自动切换到其他可用的 ASM 实例。

在 Flex ASM 环境下,数据库实例与可用 ASM 节点之间的连接是自动且无缝的。我们可以通过强制关闭某个 ASM 实例来进行故障转移测试。但要注意,如果某个数据库实例正连接到该 ASM 实例,简单的关闭命令会失败,因为磁盘组需要被安全迁移。

[oracle@Linux72 ~]s srvctl stop asm -n Linux72
PRCR-1014 : Failed to stop resource ora.asm
PRCR-1065 : Failed to stop resource ora.asm
CRS-2529:Unable to act on ‘ora.asm’ because that would require stopping or relocating
‘Ora.DB_DISK01.dg’, but the force option was not specified

如上所示,此时需要使用带 -force 选项的命令来完成强制关闭。非常重要的一点是:此测试需在已启用 Flex ASM 的 Oracle 12.1 或更高版本数据库环境中进行。如果数据库版本低于 12.1,ASM 实例必须与数据库运行在同一节点,强制停止 ASM 会导致数据库一同关闭。而在 Flex ASM 搭配 Oracle 12c 数据库的环境中,在某个节点上执行以下强制关闭命令后,数据库会自动连接到其他可用 ASM 实例:

srvctl stop asm -node Linux72 -stopoption abort -force

强制关闭 Flex ASM 实例后,数据库的告警日志会显示它已经成功注册到另一个可用的 Flex ASM 节点:

NOTE:ASMB registering with ASM instance as Flex client 0x10001 (reg:3617686277)(reconnect)
NOTE:ASMB connected to ASM instance +ASM1 osid: 14953 (F1ex mode; client id 0x10001)
NOTE: ASMB rebuilding ASM server state
NOTE: ASMB rebuilt 1 (of 1) groups
NOTE:ASMB rebuilt 19 (of 19) allocated files
NoTE: fetching new locked extents from server
NOTE: 0 locks established; 0 pending writes sent to server
success:ASMB reconnected & completed ASM server state

一旦数据库成功切换到备用 Flex ASM 实例,所有元数据操作都将通过这个新实例进行。关闭操作完成后,crsctl stat res -t 命令的输出会显示被关闭的 ASM 及其磁盘组状态为“OFFLINE”。可以通过查询 V$ASM_CLIENT 视图来确认数据库当前连接到了哪个 ASM 实例,这个视图可以在数据库实例或 ASM 实例上查询:

select
inst_id,instance_Name,db_name,status,COMPATIBLE_VERSION
from
gv$asm_client;
INST_ID INSTANCE_NAME DB_NAME STATUS COMPATIBLE
--------  -------------------  ----------- --------- ---------------
2           +ASM1      oradb_cd CONNECTED  12.0.0.0.0
1           +ASM1      oradb_cd  CoNNECTED  12.0.0.0.0

上面的输出显示了一个两节点 RAC 的两个数据库实例 (INST_ID 1 和 2) 目前都连接到了 +ASM1 实例。在正常情况下,我们通常会看到实例1连 +ASM1,实例2连 +ASM2。这里因为节点2上的 +ASM2 实例被关闭,Flex ASM 使得节点2的数据库实例能够故障转移到节点1上的 +ASM1 实例。即使后来节点2上故障的 ASM 实例恢复了,数据库也不会自动切回,它会一直保持在实例1的连接上,直到被手动重定位或集群重启。

为了将数据库实例重新定位回它原本的 ASM 实例,需要先确认目标 ASM 实例及其磁盘组已在线,然后执行 RELOCATE 命令。

重定位前的客户端视图:

select
inst_id,instance_Name,db_name,status,COMPATIBLE_VERSION
from
gv$asm_client;
INST_ID INSTANCE_NAME DB_NAME STATUS COMPATIBLE
--------  -------------------  ----------- --------- ---------------
2           +ASM1      oradb_cd CONNECTED  12.0.0.0.0
1           +ASM1      oradb_cd  CoNNECTED  12.0.0.0.0

首先,在节点 2 上启动 ASM 实例:

[oracle@Linux72 ~]$ srvctl start asm -n Linux72
[oracle@Linux72 ~]$
[oracle@Linux72 ~]$ ps -ef|grep smon
root 3649 1 0 13:52 ?00:01:21 /u01/app/12.1.0/grid/bin/osysmond.bin
oracle 9977 1 0 16:13? 00:00:00 asm_smon_+ASM2

然后,连接到数据库希望迁回的目标 ASM 实例(这里是 +ASM2),使用 SYSASM 权限用户执行重定位命令。例如,我们要把 oradbcd2 数据库实例重定位回 ASM2 实例。

在 ASM 实例中查询当前客户端连接:

select
inst_id,instance_Name,db_name, status,COMPATIBLE_VERSION
from
gv$asm_client;
INST_ID INSTANCE_NAME DB_NAME STATUS COMPATIBLE
--------  -------------------  ----------- --------- ---------------
1          oradbcd1      oradb_cd CONNECTED  12.1.0.2.0
1          oradbcd2   oradb_cd CONNECTED  12.1.0.2.0
1           +ASM1       +ASM      CONNECTED    12.1.0.2.0
1           +ASM1       +ASM      CONNECTED    12.1.0.2.0

使用 SYSASM 用户连接并执行重定位:

SQL> alter system relocate client 'oradbcd2:oradb_cdb';
System altered.

执行 RELOCATE 命令后,再次查询,可以看到 oradbcd2INST_ID 已变为 2,说明它已成功连接回 ASM2

INST_ID INSTANCE_NAME DB_NAME STATUS COMPATIBLE
--------  -------------------  ----------- --------- ---------------
1          oradbcd1      oradb_cd CONNECTED  12.1.0.2.0
1           +ASM1       +ASM      CONNECTED    12.1.0.2.0
1           +ASM1       +ASM      CONNECTED    12.1.0.2.0
2          oradbcd2   oradb_cd CONNECTED  12.1.0.2.0

我们也可以直接连接到 oradbcd2 数据库实例,通过本地视图 V$ASM_CLIENT 进行验证:

select
instance_Name,db_name,status,COMPATIBLE_VERSION
from   v$asm_client;
INSTANCE_NAME DB_NAME   STATUS COMPATIBLE
-------------------- ------------  --------- ----------------
+ASM2                oradb_cd CONNECTED  12.0.0.0.0

Flex ASM 在安装过程中会配置专用的 ASM 网络,并启用一个新的 ASM 监听器(默认端口 1522),用于接收来自远端服务器的 ASM 连接请求。同时,每个运行 Flex ASM 实例的节点上也有一个本地 ASM 监听器,共同在 ASM 集群内实现连接负载均衡。

[oracle@Linux71bin]$ Isnrctl services ASMNET1LSNR_ASM
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOI-IPC)(KEY-ASMNET1LSNR_ASM)))
Services Summary...
Service “+ASM” has 2 instance(s)。
Instance “+ASMI”, status READY, has 2 handler(s) for this service...
Handler(s);
“DEDICATED” established:0 refused:O state:ready
REMOTE SERVER
“DEDICATED” established:0 refused:O state:ready
(DESCRIPTION-(ADDRESS-(PROTOCOL-TCP)(HOST=192.168.1.120)(PORT=1522)))
LOCAL SERVER
Instance “+ASM2”, status READY, has 1 handler(s) for this service...
Handler(s):
“DEDICATED” established:0 refused:O state:ready
REMOTE SERVER
(DESCRIPTION-(ADDRESS-(PROTOCOL-TCP)(HOST=192.168.1.121)(PORT=1522)))
The command completed successfully

连接到远端 ASM 实例需要使用 ASM 密码文件。在 Oracle 12c 中,ASM 密码文件在安装时会自动生成,并保存在 ASM 磁盘组中,从而实现集群范围内的共享。如果需要手动创建,新的 orapwd 工具支持直接在磁盘组上创建 ASM 密码文件。

创建一个 ASM 密码文件:

orapwd file ='+OCR_DISK' asm=y

创建一个数据库密码文件:

orapwd file='+OCR_DISK' password=****** dbuniquename=orcl

可以通过 ASMCMD 查看 Flex ASM 密码文件:

ASMCMD> pwd
+ocR_DISR
AsMCMD> 1s -1
Type Redund Striped Time Sys  Name
                                             Y    ASM/
                                              Y  Linux-cluster/
                                                Y _ MGMTDB/
PASSWORD UNPROT COARSE MAR 10 11:00:00 N   orapwasm =>
+OCR_DISK/ASM/PASSWORD/pwdasm.256.906118657

还有一个关键点:为了能在 ASM 磁盘组中存储密码文件,Oracle 12c 要求该磁盘组的 COMPATIBLE.ASM 属性设置为 12.1.0.0 或更高。可以通过 asmca 图形工具或执行 SQL 命令来修改:

alter diskgroup <diskgroup name> attribute 'compatible.ams'='12.1';

如果存储密码文件的磁盘组兼容性设置不正确,创建数据库时可能会报错。

最后,对于已经存在的 Oracle 12c 标准 ASM 集群,可以使用 asmca 命令以静默方式将其转换为 Flex ASM:

asmca -silent -convertToFlexASM -asmNetworks eth1/ 192.168.1.121-asmlistenerPort 1522

命令执行后会生成一个脚本,需要在本地节点以特权用户身份运行该脚本来完成转换:

/u01/app/12.1.0/grid/cfgtoollogs/asmca/scripts/converttoFlexASM.sh

掌握 Flex ASM 的配置与运维,对于构建更灵活、更健壮的 Oracle 数据库高可用环境至关重要。希望本文的实战讲解能帮助你更好地理解和运用这一特性。如果你在实践过程中遇到其他有趣的数据库运维问题,欢迎来云栈社区交流探讨。




上一篇:FreeRTOS调度器核心机制解析:抢占式调度与时间片轮转
下一篇:Anthropic MCP金融插件深度解析:AI Agent如何重塑金融软件行业
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-1 21:56 , Processed in 0.385819 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表