一套RHEL上的10G RAC,半年前丢了一块磁盘。 原有系统是3块150G的磁盘做的NORMAL冗余。前几天巡检的时候发现少了盘(~~~~~此处省略200字)。这个环境里面,ASMLIB, RAW都配了。 8块盘, 64条路径。

    目前数据库的容量已经200G了。 从asmcmd里面看的到的信息。2块磁盘组总空间300G,可用空间3G。目前存储也只有300G的可用空间。稳妥起见,直接把原来的问题磁盘组中的数据库迁移到新的300G的外部冗余的磁盘组中。

1  环境信息描述

1.1硬件环境

操作系统

RHEL 5.5 X86_64

主机

HP刀片

存储

HP ESV400

 

1.2数据库软件

集群软件版本

Oracle  Clusterware 10.2.0.1 x86_64

数据库版本

Oracle Database  10.2.0.1 企业版 x86_64

数据库补丁

10.2.0.5 x86_64

 

1.3存储信息

多路径设备

容量(GB

用途

裸设备信息

ocr1

1

OCR 磁盘

raw1

ocr2

1

OCR 镜像磁盘

raw2

votingdisk1

1

表决磁盘

raw3

votingdisk2

1

表决磁盘镜像1

raw4

votingdisk3

1

表决磁盘镜像2

raw5

asmdisk1

150

ASM数据磁盘

raw6

asmdisk2

150

ASM数据磁盘

raw7

asmdisk3

150

ASM数据磁盘

raw8

 

MOUNT_S

HEADER_STATU

MODE_ST

STATE

TOTAL

FREE

NAME

FAILGROUP

PATH

CLOSED

MEMBER

ONLINE

NORMAL

153597

0



/dev/raw/raw7

CLOSED

FOREIGN

ONLINE

NORMAL

1019

0



/dev/raw/raw5

CLOSED

FOREIGN

ONLINE

NORMAL

1019

0



/dev/raw/raw4

CLOSED

FOREIGN

ONLINE

NORMAL

1019

0



/dev/raw/raw3

CLOSED

FOREIGN

ONLINE

NORMAL

1019

0



/dev/raw/raw2

CLOSED

FOREIGN

ONLINE

NORMAL

1019

0



/dev/raw/raw1

CACHED

MEMBER

ONLINE

NORMAL

153597

3229

BHPSDB_ASM_0000

BHPSDB_ASM_0000

/dev/raw/raw6

MISSING

UNKNOWN

OFFLINE

HUNG

153597

13761

BHPSDB_ASM_0001

BHPSDB_ASM_0001


CACHED

MEMBER

ONLINE

NORMAL

153597

3230

BHPSDB_ASM_0002

BHPSDB_ASM_0002

/dev/raw/raw8

    /dev/raw/raw7为故障磁盘,该盘的状态已经为MISSING

 

1.4迁移规划

由于原有磁盘组使用的是NORMAL冗余方式。剩余的空间只有3G。数据库空间为200G。ASM磁盘组空间不足以存放数据库。而且新增的磁盘只有一块300G的盘。为避免磁盘REBALANCE出现异常。因此将300G的磁盘做成EXTERNAL冗余方式,并采用RMAN COPY的方式,将数据库迁移到新的磁盘组。迁移成功后,在将原有的3块150G的磁盘删除。并创建一个新的EXTERNAL磁盘组备用。

2  数据库备份

该操作由备份厂家完成。

3  ASM识别磁盘

3.1停集群环境

原有环境中使用了多路径,裸设备映射,ASMLIB配置。ASM添加磁盘时需要进行多路径和裸设备信息配置,为安全起见,停数据库和集群环境后进行操作。

[oracle@bhpsdb1~]$ crs_stat –t

[oracle@bhpsdb1~]$ srvctl stop database -d bhspdb

[root@bhpsdb1 ~]#crsctl stop crs

 

3.2操作系统识别磁盘

由于该系统的磁盘路径较多,因此识别出的磁盘设备也比较多。但是原有的磁盘都做了分区操作。因此不包含分区信息的磁盘。就是新添加的磁盘。

[root@bhpsdb1 ~]#ls -la /dev/sd* | grep -v '[0-9]$'

 

3.3配置磁盘多路径(所有节点)

新增磁盘的WWID信息,可以通过/scsi_id –gus /block/sdnew ls -la /dev/disk/by-id 中获取。

 

[root@bhpsdb1 ~]#scsi_id -gus /block/sdf

[root@bhpsdb1 ~]#ls -la /dev/disk/by-id

 

    新增红色部分内容。

[root@bhpsdb1 ~]# vi /etc/multipath.conf

multipaths {

……

multipath{

wwid    36001438005deda610000600001040000

alias   asmdisk4

}

 

}

 

3.4重启多路径服务(所有节点)

[root@bhpsdb1 ~]#service multipathd restart

 

3.5检测多路径设备状态(所有节点)

确保新增的磁盘asmdisk4配置可以查询到。

[root@bhpsdb1 ~]#multipath -ll

asmdisk4(36001438005deda610000600000f80000) dm-0 HP,HSV400

[size=300G][features=1queue_if_no_path][hwhandler=0][rw]

\_round-robin 0 [prio=200][active]

 \_ 0:0:3:3 sdaa 65:160 [active][ready]

 \_ 1:0:1:3 sdaq 66:160 [active][ready]

 \_ 1:0:3:3 sdbg 67:160 [active][ready]

 \_ 0:0:1:3 sdk 8:160  [active][ready]

\_round-robin 0 [prio=40][enabled]

 \_ 1:0:0:3 sdai 66:32  [active][ready]

 \_ 1:0:2:3 sday 67:32  [active][ready]

 \_ 0:0:0:3 sdc 8:32   [active][ready]

 \_ 0:0:2:3 sds 65:32  [active][ready]

 

3.6格式化多路径设备

格式化设备的目的是和原有的磁盘设备保持一致。SD设备格式化以后,会有一个分区信息,用于区分新挂载的普通sd磁盘。

 

    单个节点执行格式化操作:

[root@bhpsdb1 ~]#ls -la /dev/mapper/*

[root@bhpsdb1 ~]#kpartx /dev/mapper/asmdisk4

 

    其他节点进行分区设备发现操作:

[root@bhpsdb2 ~]#partprobe

 

3.7裸设备绑定(所有节点)

编辑裸设备配置文件,添加新磁盘配置。

3.7.1配置裸设备绑定文件

[root@bhpsdb1 ~]#vi /etc/sysconfig/rawdevices

/dev/raw/raw9    /dev/mapper/asmdisk4p1

 

3.7.2重启裸设备服务

[root@bhpsdb1 ~]#service rawdevices restart

 

3.7.3修改裸设备权限

[root@bhpsdb1 ~]#chown oracle:oinstall /dev/raw/raw9

[root@bhpsdb1 ~]#chmod 644 /dev/raw/raw9

 

3.7.4修改系统启动文件

添加新增设备的权限和属组修改脚本。

[root@bhpsdb1 ~]#vi /etc/rc.local

/bin/chownoracle:oinstall /dev/raw/raw9

/bin/chmod644 /dev/raw/raw9

 

3.7.5检测新增裸设备

保障裸设备的属组为oracle:oinstall,权限为644

[root@bhpsdb1 ~]#ls -la /dev/raw/raw*

 

4  创建新磁盘组

4.1检查磁盘状态信息

[oracle@bhpsdb1 ~]$kfod a='/dev/asm*' d=all o=all s=true

 

4.2创建ASM磁盘组

[oracle@bhpsdb1 ~]$ export ORACLE_SID=+ASM1

[oracle@bhpsdb1 ~]$ sqlplus / as sysdba

SQL> CREATE DISKGROUP CRMDGNEWEXTERNAL REDUNDANCY DISK '/dev/asm-data3';

 

4.3其他节点挂载磁盘组

[oracle@bhpsdb2~]$ sqlplus / as sysdba

SQL> alter diskgroup CRMDGNEW mount;

 

4.4检测磁盘组信息

[oracle@bhpsdb1~]$ asmcmd lsdg

[oracle@bhpsdb2~]$ asmcmd lsdg

 

5  迁移数据库到新磁盘组

5.1启动单实例到NOMOUNT

SQL> startup nomount;

SQL> create pfile='/home/oracle/crmdb.pfile' from spfile;

 

5.1.1调整参数文件修改控制文件到新磁盘组

SQL> set linesize 120;

SQL> show parameter control;

SQL> alter system setcontrol_files='+CRMDGNEW/crmdb/controlfile/control01.ctl' scope=spfile;

 

5.1.2重启实例到NOMOUNT状态

SQL> startup force nomount;

 

5.2恢复控制文件

[oracle@bhpsdb1~]$ rman target /

RMAN> RESTORE CONTROLFILE FROM '+CRMDG/crmdb/controlfile//Current.256.901636495';

 

5.3拷贝数据库

MOUNT数据库实例,进行数据库拷贝操作。

RMAN> ALTER DATABASE MOUNT;

RMAN>

RUN

{

   ALLOCATE CHANNEL dev1 DEVICE TYPE DISK;

   ALLOCATE CHANNEL dev2 DEVICE TYPE DISK;

   ALLOCATE CHANNEL dev3 DEVICE TYPE DISK;

   ALLOCATE CHANNEL dev4 DEVICE TYPE DISK;

   BACKUP AS COPY DATABASE FORMAT '+CRMDGNEW';

}

 

5.4切换数据库到拷贝

RMAN> SWITCH DATABASE TO COPY;

 

5.5打开数据库

SQL> alter database open;

 

5.6打开其他实例并检查

该操作在数据库的其他实例进行。

SQL> STARTUP

SQL> SELECT INST_ID, STATUS FROM GV$INSTANCE;

 

5.7创建临时表空间到新磁盘组

RMAN> REPORT SCHEMA;

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '+CRMDGNEW' SIZE 1G;

SQL> ALTER TABLESPACE TEMP DROP TEMPFILE'+CRMDG/crmdb/tempfile/temp.262.901636511';

 

5.8创建重做日志到新磁盘组

5.8.1查询当前日志组信息

SQL> SET LINESIZE 120;

SQL> COL MEMBER FOR A80;

SELECT DISTINCT 'ALTERDATABASE DROP LOGFILE GROUP '||GROUP#||';' FROM V$LOGFILE;

 

5.8.2添加新日志组

ALTER DATABASE ADDLOGFILE THREAD 1 GROUP 5 ('+CRMDGNEW') SIZE 100M;

ALTER DATABASE ADDLOGFILE THREAD 1 GROUP 6 ('+CRMDGNEW') SIZE 100M;

ALTER DATABASE ADDLOGFILE THREAD 2 GROUP 7 ('+CRMDGNEW') SIZE 100M;

ALTER DATABASE ADDLOGFILE THREAD 2 GROUP 8 ('+CRMDGNEW') SIZE 100M;

 

5.8.3删除旧日志组

在删除旧日志组之前,进行多次日志切换,保证旧日志组状态均为INACTIVE

SQL> SET LINESIZE 120;

SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;

SQL> ALTER SYSTEM CHECKPOINT GLOBAL;

SQL> SELECT * FROM V$LOG ORDER BY 1;

 

    下列脚本由查询日志脚本生成:

ALTER DATABASE DROPLOGFILE GROUP 1;

ALTER DATABASE DROPLOGFILE GROUP 2;

ALTER DATABASE DROPLOGFILE GROUP 3;

ALTER DATABASE DROPLOGFILE GROUP 4;

 

5.8.4添加原有日志组

ALTER DATABASE ADDLOGFILE THREAD 1 GROUP 1 ('+CRMDGNEW') SIZE 100M;

ALTER DATABASE ADDLOGFILE THREAD 1 GROUP 2 ('+CRMDGNEW') SIZE 100M;

ALTER DATABASE ADDLOGFILE THREAD 2 GROUP 3 ('+CRMDGNEW') SIZE 100M;

ALTER DATABASE ADDLOGFILE THREAD 2 GROUP 4 ('+CRMDGNEW') SIZE 100M;

 

5.9修改参数文件

5.9.1备份SPFILE文件

SQL> show parameter spfile;

SQL> create pfile='/home/oracle/crmdb.pfile' from spfile;

 

5.9.2生成新SPFILE文件

createspfile='+CRMDGNEW/spfilecrmdb.ora' from pfile='/home/oracle/crmdb.pfile';

 

5.9.3修改dbs目录下的PFILE文件

[oracle@bhpsdb1~]$ cd $ORACLE_HOME/dbs

[oracle@bhpsdb1dbs]$ vi initcrmdb1.ora

SPFILE='+CRMDGNEW/spfilecrmdb.ora'

 

5.9.4重启数据库验证

SQL> shutdown immediate;

SQL> startup;

6  删除故障磁盘

以下操作需要在ASM实例环境下进行。

6.1DISMOUNT旧磁盘组

将其他实例的CRMDG磁盘组DISMOUNT

SQL> alter diskgroup CRMDG dismount;

 

6.2删除磁盘组下的文件

ASMCMD> cd CRMDG

ASMCMD> rm -r ./crmdb

 

6.3删除旧磁盘组

SQL> DROP DISKGROUP CRMDG;

 

6.4检查磁盘状态

[oracle@bhpsdb1 ~]$kfod a='/dev/asm*' d=all o=all s=true