
1. 解决方案说明适用
1。如果你想移动到不同的ASM存储/硬件。
2。如果你想改变冗余磁盘组
当磁盘组中创建了一些外部冗余,那么它的正常或高冗余不能改变。需要更改冗余可能因为:
- DBA由于磁盘空间的想要切换普通/高冗余到外部冗余,或因使用外部方法维护冗余(如RAID 10等)的计划。
- 切换到ASM建立冗余,即由外部冗余转换为普通/高冗余
注: - 请注意,此步骤已被内部测试实验。不过,我们建议用户在生产环境中执行前最好在测试环境中测试这些步骤。
建议最好也有一个完整数据库的冷备份。
2.三种解决方案
有三种方法来执行:
1。创建一个新的设计好的冗余的磁盘组并且移动现有的数据到新创建的磁盘组
2。在备份完数据并且创建一个新的具备设计冗余的磁盘组后,删除现有的磁盘组
3. 利用ASM的热添加和删除磁盘的方式完成存储迁移
3.方案一:创建一个新具备所需的冗余的磁盘组,移动现有的数据到新创建的磁盘组。
3.1. 查看当前磁盘组
如果我们有额外的磁盘空间可用,那么我们可以创建一个新的磁盘组,从旧的磁盘组中移动文件到它。
- 首先,我们有一个外部冗余的磁盘组:
SQL> select state,name from v$asm_diskgroup;
STATE NAME
----------- --------------------
MOUNTED DGORIG
3.2. 创建一个正常冗余的新的磁盘组 :
SQL > create diskgroup DGNEW normal redundancy failgroup /**********注意:新创建的磁盘在linux和unix操作系统下一定要先修改权限**********// SQL> select state,name,type from v$asm_diskgroup; STATE NAME TYPE ----------- ------------------- ------ MOUNTED DGORIG EXTERN MOUNTED DGNEW NORMAL 3.3.备份和恢复控制文件 SQL> show parameter db_name NAME TYPE VALUE ---------------- ----------- ---------------------------- db_name string orcl10g SQL> alter database backup controlfile to '+DGNEW'; SQL> alter system set control_files='+DGNEW\\ORCL10G\\CONTROLFILE\\ -- Connect to rman $ rman target / RMAN > shutdown immediate; RMAN > startup nomount; RMAN> restore controlfile to ' Mount数据库并且更新控制文件从v$controlfile /********注意:原始的控制文件名一定要全,否则报错****************/// 3.4.备份和恢复迁移数据库文件 RMAN > alter database mount; RMAN> backup as copy database format '+DGNEW'; 使用“BACKUP AS COPY”,RMAN拷贝文件作为image copies,数据库文件的bit-for-bit拷贝被创建在硬盘上,这是与你用操作系统的命令如在unix上的cp或者Windows上的copy拷贝的同样文件的拷贝是一样的,但使用“BACKUP AS COPY”副本将被记录在RMAN信息库和RMAN恢复操作可以使用他们。 切换到数据复制,这时候我们正在切换到新的磁盘组 RMAN> switch database to copy; 一个switch是相当于使用PL / SQL的“alter database rename file”的声明。 RMAN > recover database; RMAN > alter database open; 3.5.添加新的临时文件到新创建的数据库 SQL> alter tablespace TEMP add tempfile '+DGNEW' SIZE 10M; 删除任何现有的旧磁盘组上的tempfile SQL> alter database tempfile '+DGORIG/orcl10g/tempfile/temp.265.626631119' drop; 3.6.添加和删除日志文件 6) 看看在重做日志组有多少成员,确保我们在每个日志组只有一个成员。(丢弃其它成员)。 假设我们有3个日志组,然后每一个日志组添加一个成员,如下: SQL> alter database add logfile member '+DGNEW' to group 1; SQL> alter database add logfile member '+DGNEW' to group 2; SQL> alter database add logfile member '+DGNEW' to group 3; 从更早的diskgroup丢弃老的日志成员 SQL> alter database drop logfile member 'complete_name'; 但当前日志不能做clear,则需要等其它日志组清除完毕,进行日志切换和clear,然后清除旧日志),如果再报错,则可以关闭数据库启动到mount状态进行操作 SQL>alter system switch logfile; SQL>alter database clear logfile group 3; SQL> alter database drop logfile member 'complete_name'; (清除日志组3里的旧日志,如果不做clear,则报错ora-00362和ora-01517) 3.7.修改spfile到新的磁盘组 创建pfile后关闭数据库,从刚生成的pfile重新启动数据库 SQL> create pfile=‘/u01/app/oracle/pfileorcl10g.ora’ from spfile; SQL> shutdown immediate SQL> startup pfile=‘/u01/app/oracle/pfileorcl10g.ora’ 创建新的spfile到新的磁盘组DGNEW上 SQL> create spfile=’+DGNEW/orcl10g/spfile/spfileorcl10g.ora’; 修改系统默认pfile$ORACLE_HOME/dbs/initorcl10g.ora为 spfile=’+DGNEW/orcl10g/spfile/spfilecl10g.ora’ /******************* 使用ocrdump或dd将ocr的内容dump出来后就会发现秘密了,原来ocr里有一个spfile的位置指针。我们使用crsctl命令或者srvctl启动rac时,crsctl、srvctl是以root身份执行的,它是不会访问$ORACLE_HOME/dbs目录的(root的配置文件里根本就没有相关的环境变量),是从ocr中获取spfile的位置。 如果我们在rac正常启动后,使用sqlplus shutdown数据库,不关闭集群,然后再使用startup启动数据库,这个时候oracle会使用$ORACLE_HOME/dbs目录下的pfile或spfile文件!因为sqlplus命令是以oracle用户执行的,oracle用户有$ORACLE_HOME的环境变量。 所以如果是rac环境,系统重启后启动数据库时寻找的初始化文件是在ocr里 ************************************/ 因此需要使用命令srvctl修改: srvctl modify database -d [-p #srvctl modify database –d orcl10g –p +DGNEW/orcl10g/spfile/initorcl10g.ora 3.8.确认数据文件和日志等迁移成功 使用以下查询,以确认所有文件都移动到新的磁盘组与理想冗余: 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 union 3.9. Enable block change tracking使用ALTER DATABASE命令. SQL> alter database enable block change tracking using file ‘ 3.10. 其他善后 修改db_create_file_dest、db_create_online_log_dest_*、archive_log_dest_*等参数 3.11. drop老的磁盘组DGORIG test1$export ORACLE_SID=+ASM1 test1 $crsctl stop asm –n test1 srvctl stop asm -n test1$sqlplus / as sysdba SQL> alter diskgroup DGNEW dismount SQL> exit test2$ export ORACLE_SID=+ASM1 test1$sqlplus / as sysdba SQL> drop diskgroup DGORIG including contents; /************* test1和+ASM1为第一个节点的主机名和ASM进程名,test2和+ASM2为第二个节点的主机名和ASM进程名, 特别注意:在rac环境下必须在一个节点上将要drop的磁盘组dismount,在第二个节点上才能drop该磁盘组,否则会报错,或者仅仅将第一个节点asm进程down,在第二个节点上drop磁盘组显示成功,系统重启后该磁盘组依然存在,实际没有删除掉 *****************************/ 4.方案二:备份完数据库并创建了理想的冗余方式的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个数据文件) 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 >'; (3).删除旧存储对应的asm disk SQL>alter diskgroup < asm_group_name > drop disk < asm_disk_name >; 注意:以上2步,通过观察v$asm_operation视图来判断数据重组的进度,注意删除disk的时候,确保整个diskgroup有足够的空间。如果asm disk比较多,可以一个一个的分步执行减缓系统压力.有点可惜的是,在10g版本中,oracle不支持asm diskgroup冗余类型的转换, 也没有直接提供删除failgroup的方法,否则以添加镜像failgroup的方式来完成这次数据迁移,个人觉得有更强的可控性和更低的风险. 优缺点: 该方案可以实现迁移过程中系统的零停机,但整个操作进度不可控,数据重组过程中我们无法把握进度和风险,如果你对ASM产品足够信任,该方案不失一用
