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

Oracle 11g R2用ASM的spfile

原创 ByteHouse 2025-03-06
369

Oracle 11gR2 ASM 实例启动过程

从Oracle 11gR2开始,GI集成了ASM,OCR/VOTEDISK也存放在ASM磁盘组了(11gR2以前需要存放于裸设备中),同时ASM的功能较10g也有很大增强。

ASM实例的启动过程大概有如下几个步骤:
1)$GRID_HOME/bin/oracle文件被调用,并读取ASM初始化参数文件。
2)根据ASM的初始化参数文件启动ASM实例。
3)本地ASM实例和远程实例进行通信,完成实力层面的重新配置。
4)挂载ASM磁盘组。

11gR2中,OCR/VOTEDISK存放在ASM磁盘组,这也就意味着在GI能够启动的前提是能够顺利启动ASM实例并且能够将相应磁盘组MOUNT起来;而ASM的spfile却放在ASM磁盘组里,这也同样意味着要先启动ASM实例并且能读到参数文件。那如何解决这个问题呢? 11gR2中引入了pgnp profile,用于存放ASM参数文件路径,这允许oracle在ASM实例启动以前读到参数文件。

11gR2的RAC环境中,ASM的参数文件存放于ASM磁盘组里面。ASM实例启动时候,寻找参数文件的顺序如下,直接找到为止:

  1. Grid Plug and Play (GPnP) profile
  2. spfile+ASM<node_number>.ora
  3. init+ASM<node_number>.ora

因此,11gR2中可以没有pfile,可以将ASM参数保存在gpnp profile中,在管理上省下了很多工作。

GPnP Profile 文件的作用:

GPnP Profile 文件是一个保存于 $GRID_HOME/gpnp/<hostname>/profiles/peer 目录下的小型 XML 文件,名称为 profile.xml。
其用于正确描述 RAC 每个节点的全局特性。每个节点上都会保存一个本地的 GPnP Profile,并且由 GPnP 守护进程(GPnPD)维护。

GPnP Profile 包含的内容:

GPnP Profile 的功能类似于 SPFILE,其用于保存启动数据库集群程序所需的必要信息,如下表所示。
GPnP Profile 参数

  • 集群名称(Cluster name)
  • 网络类型,包含业务及心跳网络(Network classifications, Public/Private)
  • 用于 CSS 进程的存储(Storage to be used for CSS)
  • 用于 ASM 的存储(Storage to be used for ASM : SPFILE location, ASM DiskString etc)
  • 数字签名信息(Digital signature information):GPnP Profile 对安全十分敏感,其可识别根分区的信息,并且保存了数据签名的配置权限。

GPnP Profile 信息的更新:

GPnP Profile 将会在以下情况被更新。
(1) GPnP 守护进程(GPnPD)将在软件安装、系统启动或 Profile 更新时复制 Profile 的变化,以此实现所有节点 GPnP Profile 的同步更新。
(2) 当由 oifcfg、crsctl、asmcmd 等命令更改集群配置时,GPnP Profile 都将被同步更新

集群软件对 GPnP Profile 配置信息的应用原理:

启动集群软件时,需要访问仲裁盘(Voting Disk)。当仲裁盘为 ASM 磁盘时,以上仲裁盘的信息需要从 GPnP Profile 中读取,其中 GPnP Profile 对仲裁盘信息描述如下。

<orcl:CSS-Profile id=”css” DiscoveryString=”+asm” LeaseDuration=”400″/>

即使 ASM 实例没有启动,仲裁盘的信息依旧可以通过 kfed 功能读取。(he voting disk is read using kfed utility even if ASM is not up.)
随后,集群软件将检查是否所有的 RAC 节点都更新了 GPnP Profile 信息,并且 RAC 各节点将依据 GPnP 的配置信息加入集群中。当一个节点加入集群或在集群中启动时,集群软件将在节点上启动 GPnP agent。当节点已经在集群内部时,GPnP agent 将读取已存在于节点内的 GPnP profile。当节点被新加至集群时,GPnP agent 将通过组播协议(mDNS)定位到一个已存在于集群的节点的 GPnP agent,并且从该源端的 agent 上获取 GPnP profile。
随后,CRSD 进程将需要读取 OCR 信息以启动节点上的多个资源,并根据资源状态更新 OCR 信息。(Next CRSD needs to read OCR to startup various resources on the node and hence update it as status of resources changes.)因为 OCR 信息保存于 ASM 磁盘内,所以 CRSD 读取 OCR 信息前需获知 ASM Spfile 参数文件的路径。需要在不同的参数文件中查找 ASM Spfile 路径,因此查找文件的顺序如下:
(1) GPnP Profile;
(2) ORACLE_HOME/dbs/spfile<sid.ora>;
(3) ORACLE_HOME/dbs/init<sid.ora>

GPnP Profile 维护工具:

可使用 gpnptool 工具对 GPnP Profile 进行维护,常见命令如下。
(1) $> gpnptool get:读取 GPnP Profile 内容(How to read the profile)
(2) $> gpnptool lfind:查看运行于本地节点的 GPnP 守护进程(How to find GPnP Deamons are running on the local node)
(3) $> gpnptool find:查看基于 mDNS 协议可以探测到的所有 GPnP 守护进程(How to find all RD-discoverable resources of given type)
(4) $> gpnptool getpval -<parameter_name>:查看 GPnP Profile 中对应参数的值,其中 <parameter_name> 为参数名称。

GPnP profile 内容

1)将集群的基本配置信息保存在本地,以便在启动集群时能够从本地文件中获得足够的信息,而不再需要完全依赖OCR
2)通过和mdnsd进行通信,更灵活的识别集群中的节点,使集群结构更加灵活,而不再需要从OCR中获取节点列表

gpnp组件由2部分组成:gpnp wallet和gpnp profile

  1. gpnp wallet
    功能是保存需要访问的gpnp profile文件的客户签名信息,当客户访问gpnp profile时通过wallet中的签名信息进行验证,确保只有指定的客户能访问profile文件。这部分内容不需要用户配置,在安装gi时,oracle会自动完成签名信息的初始化。

gpnp的wallet文件可在 <gi home>/gpnp/wallets/peer下找到

  1. gpnp profile
    是一个xml文件,用于保存启动(bootstrap)集群节点时所需的必要信息。gpnp profile中的信息类似数据库bootstrap时所需要的信息。
    gpnp profile保存在路径 <gi home>/gpnp/profiles/peer下

GPnP profile是一个XML文件,在Clusterware中,CSS、GPnP等服务的启动都需要依赖于GPnP profile文件,引导节点加入集群,GPnP profile提供了新节点的配置信息。GPnP profile还指定了整个集群的特性。如果该文件被破坏或丢失,Clusterware将无法正常启动。
在Clusterware启动期间,CSS守护进程使用GPnP profile发现表决文件(参数“DiscoveryString”)。一个不正确的Discovery字符串将阻止CSS守护进程启动,导致整个CRS无法启动。

Oracle不支持手动修改profile.xml文件,直接对它的修改可能导致无法修复的问题,最终导致在所有节点重建Clusterware。

GPnP profile文件保存的是集群的配置信息。默认的保存位置是:

$GRID_HOME/gpnp/$HOSTNAME/profile/peer/profile.xml
$GRID_HOME/gpnp/profile/peer/profile.xml(全局备份)

可通过gpnptool工具来获取gpnp profile的内容,下面是典型的GPnP profile内容:

<?xml version="1.0" encoding="UTF-8"?>
<gpnp:GPnP-Profile Version="1.0" xmlns="http://www.grid-pnp.org/2005/11/gpnp-profile" xmlns:gpnp="http://www.grid-pnp.org/2005/11/gpnp-profile" xmlns:orcl="http://www.oracle.com/gpnp/2005/11/gpnp-profile" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.grid-pnp.org/2005/11/gpnp-profile gpnp-profile.xsd" ProfileSequence="8" ClusterUId="544e8a6d114c6f1fbfec2667d0bf7c85" ClusterName="vmac-cluster" PALocation="">
<gpnp:Network-Profile>
<gpnp:HostNetwork id="gen" HostName="*">
<gpnp:Network id="net1" IP="192.168.1.0" Adapter="eth1" Use="public"/>
<gpnp:Network id="net2" IP="192.168.1.0" Adapter="eth2" Use="cluster_interconnect"/>
<gpnp:Network id="net3" Adapter="eth2" IP="172.168.1.0" Use="cluster_interconnect"/>
</gpnp:HostNetwork>
</gpnp:Network-Profile>
<orcl:CSS-Profile id="css" DiscoveryString="+asm" LeaseDuration="400"/>
<orcl:ASM-Profile id="asm" DiscoveryString="/dev/asm*" <span style="background-color: rgb(255, 0, 0);">SPFile="/g01/11ggrid/app/11.2.0/grid/dbs/old_ora.bak"/></span>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="gpnp orcl xsi"/>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>jkauDoZrfXw8N12JHcb69wPJpyo=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>X/G6cdsov/cPqZmmFCOWGIf6AMM4adp31DhC0jqzAFbn2bfdakp7IvRwCNc9vjJ0nGDaukCjQnbdGmWs2DiCBNI2zd1OuoZ3/pCKKo0hR3GHcL73A1sQ++50b0NJTeo+SDIYgwTnsHu+vbjoVBqAEuJlSE5t6EfmBBSZvihhRxE=</ds:SignatureValue>
</ds:Signature>
</gpnp:GPnP-Profile>

profilesequence表示该gpnp profile的序列号,该文件做一次修改,序列号+1.
clusteruid表示集群的global id。12c开始gi通过clusteruid来唯一标识一个集群。随机生成,无法修改。
clustername表示集群名称。12c前gi通过集群名称来标识集群。
gpnp:network id=“net1” IP="...0" adapter=“eth0” use=“public"表示集群公网信息。use用于区分网络,这个选项只能是public或者cluster_interconnect。
gpnp:network id=“net2” IP=”
...0" adapter=“eth1” use=“cluster_interconnect"表示集群的私网信息。id表示网络资源的名称,ip指定子网信息,adapter为网卡信息。
orcl:CSS-profile id=“css” discoverystring=”+asm" leaseduration=“400” 其中id=“css"表示这部分信息是css需要的。discoverystring=”+asm"表示表决盘(VF)保存的路径,cssd在启动时会在这个路径下扫描表决盘,上面例子中,cssd会扫描ASM的disk_string发现表决盘。leaseduration=“400"定义了节点号的租借有效期。
orcl:ASM-profile id=“asm” discoverystring=”" SPFile="+DATA/test-cluster/asmparameterfile/register.253.827833411"

其中 id="asm"表示这部分信息是ASM需要使用的。spfile指定了asm实例启动时需要访问的spfile位置。

通过上面的例子可以看出,GPnP profile保存的是RAC的配置信息,包括集群名称、网络类型信息(public/private)、ASM和CSS的存储信息、安全的数字签名,以及ASM实例的SPFILE文件位置。当集群配置发生变化时,所有节点的该文件会被自动更新。

在安装、系统引导或者当使用标准的集群工具更新期间,这些活动包括:oifcfg 改变网络信息、crsctl 改变css设备、ASM额外的存储等,会通过gpdpd进程复制GPnP profile到所有的其他节点。

如果GPnP出现问题,可以使用cluvfy comp gpnp组件验证命令检查在集群中所有节点网格即插即用的完整性。

cluvfy comp gpnp [-n node_list] [-verbose]

gpnpd守护进程

gpnp是一个多线程的进程,主要线程包括:

  • gpnp主线程(clsgpnpd_mainwork):该线程负责主要工作,例如,访问gpnp profile,对该文件进行读取。
  • push线程(clsgpnpd_pushthread):当本地gpnp profile发生改变or需要向远程节点推送gpnp profile,该线程负责传输gpnp profile。
  • 派遣线程(clsgpnpd_dispathThread):该线程负责接受gpnpd收到的各种信息并分派给对应的线程。
  • OCR线程(clsgpnp_ocrDetectThread):该线程在发现OCR中相关的信息发生改变时通知派遣线程。

在集群部分信息发生变更时,本地gpnpd的派遣线程通知所有远程节点的派遣线程,发生了配置改变。本地gpnpd的push线程将新版本的gpnp profile发送给所有远程节点。远程节点的派遣线程收到信息后,开始接收新版本的gpnp profile。

gpnpd被启动时:
1)gpnpd的主线程访问gpnp profile,并加载到cache中打开。如果本地的gpnp profile丢失,可以通过OLR中的信息重新构建gpnp profile。
2)派遣线程向集群的所有节点发送信息,并确认最新的gpnp profile位置。
3)拥有最新版本gpnp profile的节点向该节点发送信息。
4)本地节点收到最新版本的gpnp profile后,开始向外提供服务。

如何将ASM的spfile重新保存至ASM磁盘组?

11gR2 RAC环境中,ASM的参数文件支持备份(spbackup),拷贝(spcopy),移动(spmove),查询gpnp profile(spget),设置(spset)等操作特别需要注意一点,ASM的参数文件最好放在ASM磁组里,同时确保每个集群成员的gpnp都为同一个路径

ASMCMD> ls -l
Type              Redund  Striped  Time            Sys  Name
ASMPARAMETERFILE  UNPROT  COARSE  DEC 14 15:00:00  Y    REGISTRY.253.866303695
N   spfileasm.ora => +OCR_VOTE/rac-cluster/ASMPARAMETERFILE/REGISTRY.253.866303695 ----注意这里是链接

ASMCMD> pwd
+OCR_VOTE/rac-cluster/ASMPARAMETERFILE

ASMCMD> spcopy +OCR_VOTE/rac-cluster/ASMPARAMETERFILE/REGISTRY.253.866303695 +OCR_VOTE/rac-cluster/ASMPARAMETERFILE/spcopy.ora

ORA-15056: additional error message
ORA-17502: ksfdcre:4 Failed to create file +OCR_VOTE/rac-cluster/ASMPARAMETERFILE/spcopy.ora
ORA-15268: internal Oracle file +OCR_VOTE.253.1 already exists.
ORA-06512: at line 7 (DBD ERROR: OCIStmtExecute)

ASMCMD> spget
/home/grid/registry.253.839197161  --当前gpnp profile配置。该spfile是用spcopy命令生成的
ASMCMD> spmove REGISTRY.253.866303695 old_ora.bak  ---删除默认的SPFILE将导致路径缺失
ASMCMD>

重启实例生效

ASMCMD> shutdown --abort

ASM instance shutdown
Connected to an idle instance.

ASMCMD>
ASMCMD> startup

ASM instance started
Total System Global Area 1135747072 bytes
Fixed Size      2260728 bytes
Variable Size  1108320520 bytes
ASM Cache    25165824 bytes
ASM diskgroups mounted
ASM diskgroups volume enabled

ASMCMD> lsdg

State    Type    Rebal  Sector  Block      AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N        512  4096  1048576      4094      926                0            926              0            N  DATA/
MOUNTED  EXTERN  N        512  4096  4194304      2032    1592                0            1592              0            Y  OCR_VOTE/
ASMCMD> spget
+OCR_VOTE/rac-cluster/ASMPARAMETERFILE/REGISTRY.253.866316081

SQL> show parameter spfile;
NAME        TYPE                VALUE
---------------------------------------------------------------------------
spfile        string            +OCR_VOTE/rac-cluster/asmparameterfile/registry.253.866316081

同样,其他数据库节点需要spset更新spfile路径,重启生效即可

可以通过ASM alter.log来看一下具体ASM启动过程

SQL> show parameter dump; --查看ASM日志所在位置

NAME TYPE VALUE
----------------------------------------------- ---------------------------
background_core_dump string partial
background_dump_dest string /u01/app/grid/diag/asm/+asm/+A
SM1/trace
[grid@rac1 trace]$ tail -f alert_+ASM1.log

ASM实例被启动,根据gpnp profile中的信息找到了集群的网络信息(主要是集群的私网)

Starting ORACLE instance (normal)
LICENSE_MAX_SESSION = 0
LICENSE_SESSIONS_WARNING = 0
Initial number of CPU is 1
Private Interface 'eth1' configured from GPnP for use as a private interconnect.
[name='eth1', type=1, ip=10.10.10.1, mac=00-0c-29-30-bb-a6, net=10.10.10.0/24, mask=255.255.255.0, use=cluster_interconnect/6]
Public Interface 'eth0' configured from GPnP for use as a public interface.
[name='eth0', type=1, ip=192.168.11.100, mac=00-0c-29-30-bb-9c, net=192.168.11.0/24, mask=255.255.255.0, use=public/1]

可以看到ASM参数文件被发现了

Starting up:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Real Application Clusters and Automatic Storage Management options.
ORACLE_HOME = /u01/app/11.2.0/grid
System name: Linux
Node name: rac1
Release: 2.6.32-358.el6.x86_64
Version: #1 SMP Tue Jan 29 11:47:41 EST 2013
Machine: x86_64
VM name: VMWare Version: 6
Using parameter settings in server-side spfile +FRA/rac-cluster/ASMPARAMETERFILE/REGISTRY.253.1034189293

可以看到ASM实例的参数被读取,使用HAIP和集群中其他的ASM实例进行通讯

System parameters with non-default values:
large_pool_size = 12M
instance_type = "asm"
remote_login_passwordfile= "EXCLUSIVE"
asm_diskstring = "/dev/raw/raw*"
asm_diskgroups = "DATA"
asm_diskgroups = "FRA"
asm_power_limit = 1
diagnostic_dest = "/u01/app/grid"
Cluster communication is configured to use the following interface(s) for this instance
10.10.10.1
cluster interconnect IPC version:Oracle UDP/IP (generic)

ASM实例后台进程被启动

IPC Vendor 1 proto 2
Thu Mar 05 22:53:40 2020
PMON started with pid=2, OS id=6565
Thu Mar 05 22:53:40 2020
PSP0 started with pid=3, OS id=6567
Thu Mar 05 22:53:42 2020
VKTM started with pid=4, OS id=6574 at elevated priority
VKTM running at (1)millisec precision with DBRM quantum (100)ms
Thu Mar 05 22:53:42 2020
GEN0 started with pid=5, OS id=6578

实例级别Reconfiguration结束

List of instances:
1 (myinst: 1)
Global Resource Directory frozen
* allocate domain 0, invalid = TRUE
Communication channels reestablished
Master broadcasted resource hash value bitmaps
Non-local Process blocks cleaned out
LMS 0: 0 GCS shadows cancelled, 0 closed, 0 Xw survived
Set master node info
Submitted all remote-enqueue requests
Dwn-cvts replayed, VALBLKs dubious
All grantable enqueues granted
Post SMON to start 1st pass IR
Submitted all GCS remote-cache requests
Post SMON to start 1st pass IR
Fix write in gcs resources
Reconfiguration complete

ASM实例启动之后开始挂载所发现的所有磁盘组

Thu Mar 05 22:53:46 2020
SQL> ALTER DISKGROUP ALL MOUNT
NOTE: Diskgroups listed in ASM_DISKGROUPS are
DATA
FRA
NOTE: Diskgroup used for Voting files is:
DATA
Diskgroup with spfile:FRA
Diskgroup used for OCR is:ARCHIVE

磁盘组挂载成功

NOTE: cache registered group ARCHIVE number=1 incarn=0xcaca6a74
NOTE: cache began mount (first) of group ARCHIVE number=1 incarn=0xcaca6a74
NOTE: cache registered group DATA number=2 incarn=0xcaca6a75
NOTE: cache began mount (first) of group DATA number=2 incarn=0xcaca6a75
NOTE: cache registered group FRA number=3 incarn=0xcaea6a76
NOTE: cache began mount (first) of group FRA numbe
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论