Oracle ASM是一个为管理数据文件的一个完整的文件系统和卷管理系统的组合,本文档适合以下方面的任务:
l 希望移动数据库到其他的ASM存储
l 希望修改磁盘组的冗余度
一旦磁盘组被创建那么它的冗余策略如:External,Normal or High,是不能修改的。在下面情形可能需要修改磁盘组的冗余策略:
l DBA考虑到受磁盘空间的制约或是已经用外部方法实现了冗余(比如RAID 10等)需要将磁盘组冗余策略从Normal/High Redundancy变成External Redundancy;
l 将磁盘组基于的冗余策略从External redundancy转换为Normal/High Redundancy ;
本文档讨论转换已存在磁盘组冗余策略的步骤。注意:这只是说明转换已存在磁盘组冗余策略的步骤,在生产环境实施需要先在测试环境验证。并且建议先备份数据库。
可以通过两种途径实现已存在磁盘组冗余策略的转换:
l 用期望的冗余策略创建新的磁盘组并将数据库移动到新磁盘组中;
l 在备份数据库后删除已有的磁盘组,并用期望的冗余策略释放出来的原盘中创建新的磁盘组;
注意:以下步骤只说明了更改磁盘组冗余策略的步骤,如遇到相同的需求,请按此步骤为参考做更详细的方案,切不可直接套用。
方法一:用期望的冗余策略创建新的磁盘组并将数据库移动到新磁盘组中
1、 如果你已扩充了磁盘空间,那么你可以创建新的磁盘组并将数据文件移到新磁盘组中。
原来的磁盘组使用的是external redundancy:
SQL> select state,name from v$asm_diskgroup_stat ;
STATE NAME
----------------- --------------------
MOUNTED DATA
2、 使用normal redundancy创建新的磁盘组:
SQL >create diskgroup DATA1 normal redundancy
failgroup data1_0001 disk '/dev/rhdisk20',
'/dev/rhdisk21','/dev/rhdisk22',
'/dev/rhdisk23','/dev/rhdisk24'
failgroup data1_0002 disk '/dev/rhdisk30',
'/dev/rhdisk31','/dev/rhdisk32',
'/dev/rhdisk33','/dev/rhdisk34';
SQL> select state,name,type from v$asm_diskgroup_stat;
STATE NAME TYPE
----------- ------------------- ------
MOUNTED DATA EXTERN
MOUNTED DATA1 NORMAL
3、 备份数据库
SQL> show parameter db_name
NAME TYPE VALUE
---------------- ---------------------------------------
db_name string orcl11g
SQL> create pfile='/tmp/initorcl11g.ora' from spfile;
SQL> alter database backup controlfile to '+DATA1';
SQL> alter system set control_files='+DATA1/orcl11g/controlfile/current.261.798462691'SCOPE=SPFILE;
-- Connect to rman
$ rman target /
RMAN > shutdown immediate;
RMAN > startup nomount pfile='/tmp/initorcl11g.ora';
RMAN> restore controlfile from '+data\orcl11g\controlfile\current.260.798465384';
装载数据库并从v$controlfile视图验证控制文件;
备份数据库:
RMAN > alter database mount;
RMAN> backup as copy database format '+DATA1';
合用”backup as copy”,RMAN备份文件是数据文件镜像复本,是bit对bit的copy。
4、 切换数据库到副本
RMAN> switch database to copy;
这个命令等于PL/SQL命令”alter database rename file”语句。
如果需要还需要recover database;
RMAN > alter database open resetlogs;
5、 在新的DG中添加temp文件
SQL>alter tablespace temp add tempfile ‘+DATA1’ size xxxxM;
然后将原来磁盘组中的tempfile删除:
SQL> alter database tempfile '+DATA/orcl11g/tempfile/temp.265.626631119' drop;
6、 在新的磁盘组加redo member,删除旧磁盘组的redo member
查找redo group组成员信息,假设有1,2,3三个日志组,向每个组添加一个成员到磁盘组DATA1:
SQL> alter database add logfile member '+DATA1' togroup 1;
SQL> alter database add logfile member '+DATA1' togroup 2;
SQL> alter database add logfile member '+DATA1' togroup 3;
删除1,2,3日志组在DATA磁盘组的成员:
SQL> alter database drop logfile member '+DATA/orcl11g/onlinelog/group_3.264.798462721';
SQL> alter database drop logfile member '+DATA/orcl11g/onlinelog/group_2.263.798462711';
SQL> alter database drop logfile member '+DATA/orcl11g/onlinelog/group_1.262.798462699';
7、 使用下例语句确认所有的文件都已经移动到新的磁盘组中
SQL> select name from v$controlfile
union
select name from v$datafile
union
select name from v$tempfile
union
select member from v$logfile
union
select filename from v$block_change_tracking;
方法二:在备份数据库后按期望的冗余重建磁盘组并还原数据库
1、 用immediate选项关闭数据库,并重启数据库到mout状态备份数据库:
SQL>alter system archive log current;
SQL>alter system archive log current;
SQL>alter system archive log current;
SQL>alter system archive log current;
SQL>shutdown immediate
SQL>startup mount
RMAN>backup device type disk format'/backup/db_%U.bak' database ;
RMAN>backup device type disk format'/backup/arc_%U.bak'archivelog all;
2、 创建SPFILE和controlfile副本
SQL>create pfile='/backup/initorcl11g.ora' from spfile;
SQL>alter database backup controlfile to'/backup/control.bak';
3、 关闭RDBMS实例
SQL> shutdown immediate
4、 连接到ASM实例DROP现有磁盘组
Pre-11gR2:
Login as oracle
$sqlplus “/as sysdba”
11gR2:
Login as grid
$sqlplus “/as sysasm”
SQL> drop diskgroup DATA including contents;
5、 关闭ASM实例
6、 启动ASM实例到nomount状态,并按创建新的磁盘组
SQL>startup nomount
create diskgroup DATA normal redundancy
failgroup data_0001 disk '/dev/rhdisk4',
'/dev/rhdisk5','/dev/rhdisk6',
'/dev/rhdisk7','/dev/rhdisk8'
failgroup data_0002 disk '/dev/rhdisk9',
'/dev/rhdisk10','/dev/rhdisk11',
'/dev/rhdisk12','/dev/rhdisk13';
创建和原来的磁盘组相同名的新磁盘组会使RMAN恢复过程更简单些。
7、 使用指定的pfile启动RDBMS实例到nomount状态
SQL>startup nomount pfile='/backup/initorcl11g.ora'
SQL>create spfile from pfile='/backup/initorcl11g.ora';
SQL>shutdown immediate
SQL>startup nomount
8、 用RMAN还原controlfile和数据库文件
RMAN>restore controlfile from'/backup/control.bak';
RMAN>alter database mount;
RMAN>restore database;
RMAN>recover database;
Recover database过程中可能会找更大sequence的redolog,可以不理会。
SQL>alter database open resetlogs;
如果你启用的flashback database 功能,你必须先关闭然后再启用此功能:
SQL>alter database flashback off ;
SQL>alter database flashback on ;
注意:如果你新创建的磁盘组和原来的磁盘组名字不一样,你必须用类似于以下的步骤恢复数据库:
RMAN> run{
set newname for datafile 1 to '+DATA1';
set newname for datafile 2 to '+DATA1';
set newname for datafile 3 to '+DATA1';
set newname for datafile 4 to '+DATA1';
set newname for datafile 5 to '+DATA1';
--more set newname;
restore database;
switch datafile all;
recover database;
}