oracle
NinGoo's blog

ASM如何识别磁盘

在ASM中,要创建diskgroup或者往已有的diskgroup里添加新的disk,则该disk必须已经识别,也就是要在v$asm_disk里有记录。ASM会根据asm_diskstring指定的路径去检查所有的磁盘。另外,查询v$asm_diskgroup和v$asm_disk也会导致这个识别磁盘动作的发生,所以平时最好查询v$asm_disk_stat来替代v$asm_disk。

Oracle也提供了一个工具来手工识别磁盘,就是KFOD,注意不是KFED哦。

$kfod -h
_asm_a/llow_only_raw_disks KFOD allow only raw devices [_asm_allow_only_raw_disks=TRUE/(FALSE)]
_asm_l/ibraries ASM Libraries[_asm_libraries='lib1','lib2',...]
_asms/id ASM Instance[_asmsid=sid]
a/sm_diskstring ASM Diskstring [asm_diskstring='discoverystring', 'discoverystring' ...]
d/isks Disks to discover [disks=raw,asm,all]
g/roup Group discover [group=controlfile]
n/ohdr KFOD header suppression [nohdr=TRUE/(FALSE)]
o/p KFOD options type [OP=DISKS/GROUPS/ALL]
p/file ASM parameter file [pfile='parameterfile']
s/tatus Include disk header status [status=TRUE/(FALSE)]
v/erbose KFOD verbose errors [verbose=TRUE/(FALSE)]

可以看到KFOD使用起来还是比较简单的。一个实际执行的例子如下:

$kfod disks=all status=true
—————————————————————
Disk Size Header Path
==========================================================
1: 1023 Mb FOREIGN /dev/raw/raw1
2: 273708 Mb MEMBER /dev/raw/raw10
3: 273708 Mb MEMBER /dev/raw/raw11
4: 273708 Mb MEMBER /dev/raw/raw12

————————————————————–
ORACLE_SID ORACLE_HOME
=========================================================
+ASM4 /u01/oracle/product/10g/db
+ASM3 /u01/oracle/product/10g/db
+ASM2 /u01/oracle/product/10g/db
+ASM1 /u01/oracle/product/10g/db

Oracle数据库如何识别ASM磁盘组

假如使用ASM做为Oracle数据库的数据存储方式,那么Oracle数据库是怎么来识别ASM的diskgroup的呢,也就是数据库的instanc和ASM的instance之间是如何沟通的呢?简单的说,就是ocssd(Oracle Cluster Support Services daemon)。本文假设为Linux环境下的RAC+ASM系统。

对于ASM来说,ocssd是必须的,所以在使用dbca创建ASM Instance的时候,就会提示要先安装ocssd。如果是单机,执行$ORACLE_HOME/bin/localconfig add安装ocssd。ocssd通过inittab自动启动,在安装的时候就会在/etc/inittab中加入以下条目(rac环境):

h2:35:respawn:/etc/init.d/init.cssd fatal >/dev/null 2>&1

其中,35表示在os的运行级别(runlevel)为3或者5的时候启动/etc/init.d/init.cssd
respawn表示init.cssd进程如果异常终止,则自动重新启动

ocssd进程启动后会打开一系列的文件(通过/proc/pid/fd或者lsof -a -p pid可以获得filedescriptor的信息):
消息文件
– $CRS_HOME/srvm/mesg/procus.msb
– $CRS_HOME/css/mesg/clssus.msb
– $CRS_HOME/has/mesg/clsdus.msb
日志文件
– $CRS_HOME/log/hostname/cssd/cssdOUT.log
– $CRS_HOME/log/hostname/cssd/ocssd.log
– $CRS_HOME/log/hostname/alertSID.log
OCR(Oracle Cluster Registry),本例中在裸设备上,如果是单机也可能在本地文件系统中,典型路径$ORACLE_HOME/cdata/localhost/local.ocr
– /dev/raw/raw1
– /dev/raw/raw2
以及一些socket端口
– socket:[578057]
– socket:[578062]

ASM instace启动以后,通过gmon进程和osccd通信,将ASM的一些信息告诉给ocssd,而数据库则从ocssd获得这些信息,也就是说,ocssd是ASM Instance和Database之间的纽带。

ASM/ocssd/database之间具体通信的步骤,可以参考这里

Oracle10gR2 Logical Standby(六)逻辑备库的Failover

当主库由于某种原因不可用时,需要考虑将备库直接拉起来,这就是failover。基本原理和操作步骤和switchover差不多只是不管主库,直接将备库切换成新的主库。

一.切换前的检查

确保所有能应用的归档都已经应用。确保监听设置正确。确保切换后应用能连接到新的主库等。

二.停止SQL Apply

如果原来是停止的,那么可能还有部分最新的日志没有应用,则最好先应用一下日志,减少最终切换需要的时间:


alter database start logical standby apply finish;

alter database stop logical standby apply;

三.激活备库

以下命令会终止RFS,然后应用还未应用的日志,最后将数据库转换成primary角色。

alter database activate logical standby database finish apply;

至此,逻辑备库已经转换成主库,非常的简单。由于数据库本身是open的,转换后无须再作任何操作

select database_role from v$database;

DATABASE_ROLE
—————-
PRIMARY

四.处理其他备库

如果原来的DataGuard中还有不止一个逻辑备库,则其中一个逻辑备库failover成主库以后,其他的备库需要重新指向新的主库。首先在其他备库创建一个到新主库的database link

alter session disable guard;
create database link newprimary connect to user identified by password using ‘newprimary’;
alter session enable guard;

然后重新指向新的备库

alter database start logical standby apply new primary newprimary;

如果执行时出现ORA-16109: failed to apply log data from previous primary,则备库只有重做了。

Oracle10gR2 Logical Standby(五)逻辑备库的Switchover

相对物理备库的切换,逻辑备库的切换稍微复杂点,但只要按照步骤,整个操作过程也可以在很短的时间内完成。这里记录下主库正常时的switchover操作过程:

1.切换前的检查
包括主备库参数设置,主备库的TNS设置,以及应用连接数据库的TNS等,确保主备库角色转换后整个系统运行不受影响。

2.主库准备切换

alter database prepare to switchover to logical standby;

命令执行成功后,主库的状态

select switchover_status from v$database;

SWITCHOVER_STATUS
——————–
PREPARING SWITCHOVER

3.备库准备切换

alter database prepare to switchover to primary;

命令执行成功后,备库的状态

select switchover_status from v$database;

SWITCHOVER_STATUS
——————–
PREPARING SWITCHOVER

4.主库开始切换
执行完第3步后,现在的备库需要生成logminer所需要的数据字典信息,然后传送到现在的主库,所以要执行逻辑备库切换,必须在备库也设置到主库的归档路径,并且主备库监听都需要保持开启。否则,切换的状态就会一直停留在PREPARING SWITCHOVER。

备库数据字典信息传递到主库后,主库的状态变成TO LOGICAL STANDBY,这时才能执行实际的切换。

select switchover_status from v$database;

SWITCHOVER_STATUS
——————–
TO LOGICAL STANDBY

alter database commit to switchover to logical standby;

注:在PREPARING SWITCHOVER状态时,可以通过执行以下命令取消切换操作:

alter database prepare to switchover cancel;

5.从库切换
上一步成功后,备库的状态应该变成了TO PRIMARY,则可以执行切换

select switchover_status from v$database;

SWITCHOVER_STATUS
——————–
TO PRIMARY

alter database commit to switchover to primary;

6.在新的备库启动日志应用进程

alter database start logical standby apply;

如果是实时应用,则

alter database start logical standby apply immediate;