最近做了一次ASM磁盘数据迁移,采用的是第二种方案,该方案我也只敢在11gR2后才敢用,之前的版本不敢用于正式产生环境!
方案一:备份完数据库并创建了理想的冗余方式的diskgroup后Drop已经存在的磁盘组
1.Shutdown(immediate) 数据库并启动到mount状态. 对存在的数据库做一个有效的RMAN 备份
RMAN> backup device type disk format 'd:\backup\%U' database ;
RMAN> backup device type disk format 'd:\backup\%U'archivelog all;
2. 复制spfile文件到一个可以存取的位置:
SQL> create pfile='d:\initsid.ora' from spfile;
SQL> alter database backup controlfile to 'd:\control.ctl';
3. Shutdown the RDBMS instance
SQL> shutdown immediate
4.连接到 ASM Instance并且删除老的磁盘组
SQL> drop diskgroup DGNEW including contents;
5. Shutdown ASM Instance;
6.启动ASM进程到nomount状态并创建新的磁盘组
SQL>startup nomount
SQL> create diskgroup DGNEW external redundancy disk'disk_name';
新的磁盘组的名称应同以往的磁盘组名称,它会促进RMAN恢复过程。
7. 连接到RDBMS进程并且使用pfile启动到nomount状态
startup nomount pfile='d:\initsid.ora'
SQL> create spfile from pfile='d:\initsid.ora'
8. 使用RMAN恢复控制文件和备份
RMAN > restore controlfile from 'd:\control.ctl';
RMAN> alter database mount;
RMAN> restore database;
RMAN> recover database;
unable to find archive log
archive log thread=1 sequence=4
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 07/05/2007 18:24:32
RMAN-06054: media recovery requesting unknown log: thread 1 seq 4 lowscn 570820
虽然恢复它会给一个归档日志缺少错误,这是预期,我们需要使用resetlogs操作打开该数据库
RMAN> alter database open resetlogs;
-需要改变Flash Recovery Area到新创建的磁盘组的位置.
SQL> alter system set db_recovery_file_dest='+DGNEW' scope=both;
必须disable和re-enable闪回数据库,以便重新在+ DGNEW的磁盘组创建闪回日志文件,这只能在mount状态下进行。
SQL> alter database flashback off ;
SQL> alter database flashback on ;
- 如果你要为磁盘组使用新的名称,在第8步mount数据库后,您可以使用:
RMAN> run{
set newname for datafile 1 to '+DGORIG';
set newname for datafile 2 to '+DGORIG';
set newname for datafile 3 to '+DGORIG';
set newname for datafile 4 to '+DGORIG';
set newname for datafile 5 to '+DGORIG';
restore database;
switch datafile all;
recover database;
}
(假设数据中有5个数据文件)
方案二:利用ASM的热添加和删除磁盘的方式完成存储迁移
该方案充分发挥了asm管理磁盘数据的能力.
简要步骤:
(1).划分raw或者asm disk,并检查或更改asm参数,例如asm_disktring,使得新存储的asm disk对ASM实例可识别
(2).将新存储disk添加到现有的asm diskgroup中.
SQL>alter diskgroup < asm_group_name > add disk '< asm_disk_path >';
例:alter diskgroup data add disk 'ORCL:ASMDISK1';
(3).删除旧存储对应的asm disk
SQL>alter diskgroup < asm_group_name > drop disk < asm_disk_name >;
例:alter diskgroup data drop disk ASMDISK1;
select state from v$asm_disk ; ---查看当前磁盘的状态
注意:以上2步,通过观察v$asm_operation视图来判断数据重组的进度,注意删除disk的时候,确保整个diskgroup有足够的空间。如果asm disk比较多,可以一个一个的分步执行减缓系统压力.有点可惜的是,在10g版本中,oracle不支持asm diskgroup冗余类型的转换, 也没有直接提供删除failgroup的方法,否则以添加镜像failgroup的方式来完成这次数据迁移,个人觉得有更强的可控性和更低的风险.
优缺点:
该方案可以实现迁移过程中系统的零停机,但整个操作进度不可控,数据重组过程中我们无法把握进度和风险,如果你对ASM产品足够信任,该方案不失一用