暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

ASM 存储迁移方案

原创 逆风飞翔 2023-04-19
1449

ASM 存储迁移方案

1 迁移方式
1 现有环境和迁移目标
操作系统 aix 6.1
数据库 oracle 11.2.0.3 RAC
数据存在在 asm 管理的磁盘组中
迁移不更换 LPAR,只将 ASM 使用的存储迁移到新存储上。
2 迁移涉及文件
11gR2 rac 涉及的文件包括
◆ grid、database 软件
◆ 归档文件系统或集群文件系统(归档日志存储在 ASM 中则没有该文件系统或集群文
件)
◆ ocr、vote
◆ 数据文件,控制文件
◆ 在线日志文件、临时文件
◆ Database spfile(除了 dbs 中 init*文件外,OCR 中还存储了 spfile 的指向)
◆ ASM spfile
其中 grid、database 软件、归档文件系统如果使用的是外接存储而不是本地磁盘,则
也必须迁移到新存储上。这里使用 OS 的方式来迁移,使用 lvm 镜像、dd 或者 tar 的方式来
进行迁移,本报告只涉及 RAC 非文件系统类的文件迁移。
3 迁移方式
从迁移的时间成本、技术可靠性、回退的成本、操作的复杂度、成功案例几个方面考虑,
技术选型上将使用 rman 备份数据文件镜像的方式迁移到新存储对应的磁盘组上。
假设,磁盘组 CRS 中存储了 asm spfile/ocr/votedisk,将迁移到 CRS1_NEW 中
假设,磁盘组 DATA_DG 中存储了 database
spfile/datafile/controlfile/redolog/tempfile,将迁移到 DATA_DG_NEW 中

4 迁移耗时估算
子步骤 时间
停止业务系统 20 分钟
迁移 database 控制文件 15 分钟
Rman 备份数据文件镜像的时间 2T 数据,大概需要 2 个小时
recover 数据库的时间 0 分钟(本次为停库进行,无需应用归档
日志)
数据文件迁移后的验证 15 分钟
迁移临时表空间 10 分钟
迁移在线重做日志(redo log) 20 分钟
迁移 OCR 5 分钟
迁移 Votedisk 5 分钟
迁移 database spfile 15 分钟
迁移 asm spfile 15 分钟
启动业务系统 20 分钟
预留问题处理的时间
总计
注意,如果采用 rman 在线备份数据文件镜像,而不是停库后进行,则迁移主要耗时为应
用全备以来的归档日志的耗时。
5 优点、缺点
该方案使用 rman 备份数据文件镜像到新磁盘组的方式,技术成熟,原数据不动,可控性
很强,回退及其方便,方案可靠。缺点是操作步骤相对较多,不过都是常规操作。
这里需要说明的是:
11g asmcmd cp 命令存在 BUG,导致临时文件和在线日志文件无法 cp 成功,即无
法备份临时文件和在线重做日志文件,因此回退方案需要考虑这个因素。

2 迁移前的准备工作
2.1 迁移前的信息确认和备份(停机前操作)
###迁移前,检查数据库的 rman 备份日志,确保备份成功
###为保证回退,控制文件的备份将在停止数据库后再备份,见 2.3 章节的步骤
###Grid 用户
$asmcmd lsdg
$asmcmd lsdsk
$asmcmd spget
$ocrchck
$crsctl query css votedisk
SQL>show parameter spfile
SQL>create pfile=’/tmp/pfile_asm_before.ora’ from spfile;
####oracle 用户比较数据库总大小、数据文件总大小、对象个数以及部分表的记录数
SQL>Select sum(bytes)/1024/1024 size_m from dba_segments;
SQL>Select sum(bytes)/1024/1024 size_m from dba_data_files;
SQL>Select sum(bytes)/1024/1024 size_m from dba_temp_files;
SQL>Select count(*) from dba_objects;
SQL>Select owner,count(*) from dba_objects group by owner order by 1;
SQL>Select count(*) from &some_table_name;
SQL>Select count(*) from &some_table_name;
SQL>select file_name,bytes/1024/1024 from dba_data_files order by 1;
SQL>select file_name,bytes/1024/1024 from dba_temp_files order by 1;
SQL>select * from v$log;
SQL>select * from v$logfile;
SQL>show parameter spfile;
SQL>show parameter v$controfile;
SQL>create pfile=’/tmp/pfile_db_before.ora’ from spfile;
2.2 识别存储并创建基于新存储的磁盘组(停机前操作)
1> 在新存储上划 LUN 并 mapping 到 RAC 所有节点,确认所有节点可以认到新 LUN。
注意新存储上划分的 LUN 的大小与原存储保持一致。如果使用多路径软件,则同样对新
存储进行多路径的配置。
2> grid 用户使用 asmca 或者命令方式来创建新的磁盘组,磁盘组名后缀加 NEW
SQL>create diskgroup CRS1_NEW external redundancy disk '< asm_disk_path >';

SQL>create diskgroup DATA_DG_NEW external redundancy disk '< asm_disk_path >';
注意磁盘组冗余类型和 au size 与原来一致(也可以不一致)
3 正式迁移步骤
3.1 停止业务系统和除节点 1 外的数据库实例
1>联系相关团队,停止应用系统
2>停止除数据库节点 1 外其他节点的数据库实例(不停 crs/grid 进程,只停实例),只保留节
点 1 的实例为运行状态。
$sqlplus “/as sysdba”
sql> shutdown immediate
3.2 开始迁移 database 控制文件
为了方便回退,后续操作不再操作原控制文件,因此我们先将数据库停止,在 nomount
状态下将控制文件迁移到新的磁盘组上。除非特别说明,否则以下操作都只在节点 1 上进行,
步骤如下所示
1、检查数据库的参数文件
SQL> select name from v$controfile;
NAME
---------------------------------------------------
+DATA_DG/ydcdsdb/controlfile/current.272.773963013
2、修改参数文件中控制文件的指向,新增加一个成员,指向新的磁盘组 DATA_DG_NEW
sql> alter system set
control_files='+DATA_DG/ydcdsdb/controlfile/current.272.773963013','+DATA_DG_NEW' scope=spfile sid='*';
3、停止数据库并启动到 nomount 状态下后,备份控制文件并开始恢复控制文件
$srvctl stop database –d orcl

##检查 alert.log,确保数据库一定是干净的停止的(shutdown immediate)!!!
$sqlplus “/as sysdba”
sql> startup mount
##备份控制文件到本地/oracle 文件系统即可
sql>alter database backup controlfile to
'/oracle/app/oracle/product/11.2.0.3/dbhome_1/dbs/controlfile_after_mig';
sql> shutdown immediate
sql> startup nomount
$rman target /
RMAN> restore controlfile from
'+DATA_DG/ydcdsdb/controlfile/current.272.773963013';
注意,此时,将可以看见控制文件冗余到了 DATA_DG_NEW 上,并命名为
+DATA_DG_NEW/ydcdsdb/controlfile/current.XXX
4、修改参数文件中控制文件的指向,只指向新的磁盘组 DATA_DG_NEW
$sqlplus “/as sysdba”
sql> alter system set
control_files='+DATA_DG_NEW/ydcdsdb/controlfile/current.XXX';
scope=spfile sid='*';
sql> alter database mount;
sql> alter database open;
5、检查控制文件指向新存储对应的磁盘组,控制文件迁移完成。
SQL> select name from v$controfile;


6、干净的停止数据库,并启动到 mount 状态(RAC 其他节点都要停止)。以便后面开始使
用 rman 做文件镜像。如果是不干净的停止数据库,则需要启动再 shutdown immediate
SQL> shutdown immediate
SQL > startup mount;
3.3 迁移 database 数据文件
1、编辑 rman 备份脚本,通道的个数可根据 CPU 个数或原来的备份脚本做适当调整
$cat /home/oracle/backupCopy.rcv
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
allocate channel c4 type disk;
allocate channel c5 type disk;
allocate channel c6 type disk;
backup as copy database format '+DATA_DG_NEW';
}
2、修改 rman 脚本权限,并放到后台开始进行备份
$chmod 777 /home/oracle/backupCopy.rcv
$rman target / cmdfile='/home/oracle/backupCopy.rcv' log='/home/oracle/backupCopy.log' &
通过观察/home/oracle/backupCopy.log 日志来确认备份任务的状态。
3、确认备份完成
Cat /home/oracle/backupCopy.log
RMAN> list copy of database;


4、将控制文件中的数据文件指向新磁盘组中的镜像文件并打开数据库
RMAN> switch database to copy;
RMAN> recover database;
RMAN>alter database open;
5、检查 alert 日志,确保数据库正常启动。至此,数据文件迁移完成。
3.4 数据文件迁移后的验证
执行 2.3 步骤完成后,如果数据库可以成功 open(不是 open resetlogs),则说明数据文件迁
移到新的磁盘组已成功,否则对响应问题进行处理,如果无法确认问题原因,则停止后续步
骤,进入第五章的回退步骤。
使用以下命令验证控制文件和数据文件已经迁移到新的磁盘组上
SQL>select tablespace_name,file_name,bytes/1024/1024 size_m from dba_data_files
order by 1;
SQL>show parameter control;
3.5 迁移临时表空间
将临时表空间从 TEMP 表空间迁移到 TMP 表空间
SQL>select tablespace_name,file_name,bytes/1024/1024 size_m from dba_temp_files
order by 1;
SQL>create temporary tablespace tmp tempfile '+DATA_DG_NEW' size 30G;
SQL>alter tablespace tmp add tempfile '+DATA_DG_NEW' size 30G;
SQL>alter database default temporary tablespace tmp;
SQL>drop tablespace TEMP including contents and datafiles;

3.6 迁移在线重做日志(redo log)
alter database add logfile member '+DATA_DG_NEW' to group 1;
alter database add logfile member '+DATA_DG_NEW' to group 2;
alter database add logfile member '+DATA_DG_NEW' to group 3;
alter database add logfile member '+DATA_DG_NEW' to group 4;
alter database add logfile member '+DATA_DG_NEW' to group 5;
alter database add logfile member '+DATA_DG_NEW' to group 6;
alter database add logfile member '+DATA_DG_NEW' to group 7;
alter database add logfile member '+DATA_DG_NEW' to group 8;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system checkpoint;
alter database drop logfile member
'+DATA_DG/yadpsdb/onlinelog/group_1.257.798569463';
alter database drop logfile member
'+DATA_DG/yadpsdb/onlinelog/group_2.258.798569473';
alter database drop logfile member


'+DATA_DG/yadpsdb/onlinelog/group_3.259.798569483';
alter database drop logfile member
'+DATA_DG/yadpsdb/onlinelog/group_4.260.798569493';
alter database drop logfile member
'+DATA_DG/yadpsdb/onlinelog/group_5.267.798569503';
alter database drop logfile member
'+DATA_DG/yadpsdb/onlinelog/group_6.268.798569513';
alter database drop logfile member
'+DATA_DG/yadpsdb/onlinelog/group_7.269.798569523';
alter database drop logfile member
'+DATA_DG/yadpsdb/onlinelog/group_8.270.798569533';
3.7 迁移 OCR
1) root 用户确认 OCR 所在的磁盘组
#ocrcheck
#cat /etc/oracle/ocr.loc
2)在 grid(crs)运行的状态下,使用 root 用户执行以下命令将 OCR 从 CRS 磁盘组迁移到
CRS1_NEW 磁盘组中
#ocrconfig -add +CRS1_NEW
#ocrconfig -delete +CRS

3) root 用户确认 OCR 迁移到了新的磁盘组
#ocrcheck
#cat /etc/oracle/ocr.loc
示例:
执行过程()如下
root@yadpsdb1:/>ocrcheck

root@yadpsdb1:/>ocrconfig -add +CRS1_NEW
root@yadpsdb1:/>ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 3
Total space (kbytes) : 262120
Used space (kbytes) : 3096
Available space (kbytes) : 259024
ID : 2001165364
Device/File Name : +CRS
Device/File integrity check succeeded
Device/File Name : +CRS1_NEW
Device/File integrity check succeeded
Device/File not configured
Device/File not configured
Device/File not configured
Cluster registry integrity check succeeded

Logical corruption check succeeded
root@yadpsdb1:/>
root@yadpsdb1:/>cat /etc/oracle/ocr.loc
#Device/file getting replaced by device +CRS1_NEW
ocrconfig_loc=+CRS
ocrmirrorconfig_loc=+CRS1_NEW
local_only=false
~
root@yadpsdb1:/>ocrconfig -delete +CRS
root@yadpsdb1:/>ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 3
Total space (kbytes) : 262120
Used space (kbytes) : 3096
Available space (kbytes) : 259024
ID : 2001165364
Device/File Name : +CRS1_NEW
Device/File integrity check succeeded

root@yadpsdb1:/>cat /etc/oracle/ocr.loc
#Device/file +CRS getting replaced by device +CRS1_NEW
ocrconfig_loc=+CRS1_NEW
local_only=falseroot@yadpsdb1:/>
root@yadpsdb1:/>
3.8 迁移 Votedisk
1) 确认 VoteDisk 所在的磁盘组

#crsctl query css votedisk
2)在 grid(crs)运行的状态下,使用 grid 用户执行以下命令将 Votedisk 从 CRS 磁盘组迁
移到 CRS1_NEW 磁盘组中
#crsctl replace votedisk +CRS1_NEW

#在新位置增加一个votedisk
$ crsctl add css votedisk +data

3) 确认 VoteDisk 迁移到了新的磁盘组
#crsctl query css votedisk
示例:
执行过程()如下
root@yadpsdb1:/>su - grid
grid@yadpsdb1:/home/grid$ crsctl query css votedisk
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 6bf15eb9591c4fa1bf6ed52e494d5b8a (/dev/rhdisk7) [CRS]
grid@yadpsdb1:/home/grid$ crsctl replace votedisk +CRS1_NEW
Successful addition of voting disk 1286d18603964f43bf3927cb1ddc2b1e.
Successful deletion of voting disk 6bf15eb9591c4fa1bf6ed52e494d5b8a.
Successfully replaced voting disk group with +CRS1_NEW.
CRS-4266: Voting file(s) successfully replaced
grid@yadpsdb1:/home/grid$ crsctl query css votedisk
## STATE File Universal Id File Name Disk group
3.9 迁移 database spfile
数据库 spfile 存储在两个位置中
1) 两个节点的$ORACLE_HOME/dbs/init$ORACLE_SID.ora
2) OCR 中,需要调用 srvctl modify database –d XX –p ‘新路径’来修改
如果只修改了 1),则 database 启动后,ocr 中的指向将同步并覆盖 dbs 目录下的指向,使得迁移失效。因此需要注意。
1) 使用 oracle 用户确认 database spfile 的指向.可以看到 spfile 存在在 DATA_DG 上
$cat $ORACLE_HOME/dbs/init$ORACLE_SID.ora
Spfile=’+DATA_DG/ydcdsdb/spfileydcdsdb.ora’
$srvctl config database –d yadpsdb –a
$sqlplus “/as yssdba”
SQL>show parameter spfile
2)oracle 用户登陆,创建中间文件 pfile 并生成 spfile 到新的磁盘组 DATA_DG_NEW 上
$ sqlplus / as sysasm
SQL> shutdown immediate
SQL> create pfile='/tmp/pfile_ydcdsdb.ora' from
spfile='+DATA_DG/ydcdsdb/spfileydcdsdb.ora';
File created.
###编辑参数文件,修改 db_create_file_dest、db_create_online_log_dest_*、archive_log_dest_*等参数

$Vi /tmp/pfile_ydcdsdb.ora
SQL> create spfile='+DATA_DG_NEW/yadpsdb/spfileyadpsdb.ora ' from pfile='/tmp/pfile_ydcdsdb.ora';
File created.
###在所有节点上,修改 init 参数文件,指向新磁盘组 DATA_DG_NEW
$ vi $ORACLE_HOME/inityadpsdb1.ora
SPFILE='+ DATA_DG_NEW/yadpsdb/spfileyadpsdb.ora'
##在节点 1 上,oracle 用户修改 ocr 中 spfile,指向新磁盘组 DATA_DG_NEW
$Srvctl modify database –d ydcdsdb –p '+ DATA_DG_NEW/yadpsdb/spfileyadpsdb.ora'
3) 重启数据库,确认 database spfile 指向新的磁盘组 DATA_DG_NEW
$sqlplus “/as yssdba”
SQL>shutdown immediate
SQL>startup
$cat $ORACLE_HOME/dbs/init$ORACLE_SID.ora
SPFILE='+ DATA_DG_NEW/yadpsdb/spfileyadpsdb.ora'
$srvctl config database –d yadpsdb –a
$sqlplus “/as yssdba”
SQL>show parameter spfile
3.10 迁移 asm spfile 并重启所有节点 CRS
Asm spfile 存储在$GI_HOME/gpnp 目录下的 xml 文件中,而不是在$GI_HOME/dbs 目录
下,因此不能使用复制 spfile 后再修改 dbs 目录下 init 参数文件的方式来进行迁移,应使用以下方式来进行迁移。

1) grid 用户确认 asm spfile 所在的磁盘组
$ asmcmd spget
+CRS/asm/asmparameterfile/registry.253.715881237
2)grid 用户登陆,创建中间文件 pfile 并生成 spfile 到新的磁盘组 CRS1_NEW
$ sqlplus / as sysasm
SQL> show parameter spfile
NAME TYPE VALUE
------- ------- --------------------------------------------------
spfile string +CRS/asm/asmparameterfile/registry.253.715881237
SQL> create pfile='/tmp/pfile+ASM.ora' from spfile;
File created.
###修改/tmp/pfile+ASM.ora,将 asm_diskgroup/disk_string 参数修改为指向新的磁盘组
SQL> create spfile='+CRS1_NEW' from pfile='/tmp/pfile+ASM.ora'
3) grid 用户确认 asm spfile 已指向新的磁盘组
$ asmcmd spget
+CRS1_NEW/asm/asmparameterfile/registry.253.715963539
4)所有节点 root 用户重启 crs 后,使得 asm spfile 参数生效
#crsctl stop crs
#crsctl statrt crs
#crsctl stat res –t -init
#crsctl stat res -t
$ sqlplus / as sysasm
SQL> show parameter spfile

4 迁移前后信息比对、验证和收尾工作
4.1 技术验证
对下列信息进行确认,保证所有文件已经迁移到新磁盘组,并与迁移前进行比对
###Grid 用户
$asmcmd lsdg
$asmcmd lsdsk
$asmcmd spget
$ocrchck
$crsctl query css votedisk
SQL>show parameter spfile
####oracle 用户比较数据库总大小、数据文件总大小、对象个数以及部分表的记录数
SQL>Select sum(bytes)/1024/1024 size_m from dba_segments;
SQL>Select sum(bytes)/1024/1024 size_m from dba_data_files;
SQL>Select sum(bytes)/1024/1024 size_m from dba_temp_files;
SQL>Select count(*) from dba_objects;
SQL>Select owner,count(*) from dba_objects group by owner order by 1;
SQL>Select count(*) from &some_table_name;
SQL>Select count(*) from &some_table_name;
SQL>select file_name,bytes/1024/1024 from dba_data_files order by 1;
SQL>select file_name,bytes/1024/1024 from dba_temp_files order by 1;
SQL>select * from v$log;
SQL>select * from v$logfile;
SQL>show parameter spfile;
SQL>show parameter v$controfile;;
#####时间允许的情况下,还可以使用 dbv 对数据文件进行验证
4.2 业务验证
启动应用,联系业务部分对迁移后的系统做业务验证。
4.3 迁移完成后发起 rman 全备
技术验证和业务验证完成后,发起 rman 全备,完成迁移后的首次备份。


4.4 删除 asm 原磁盘组
###Grid 用户
$asmcmd lsof –G 原磁盘组的名字
如果没有任何文件输出,则说明原磁盘组已没有任何文件被使用。
此时使用 asmca 命令启动图形化界面,删除原磁盘组信息即可
3.5 删除原存储设备信息并取消 mapping
Rmdev –dl xxx –R
取消原存储到 DB 服务器的 mapping
取消光纤连线
停止应用和数据库,重启 DB 服务器操作系统,确认 OS 重启后系统正常。
5 回退步骤
1> 如果在 2.4 环节数据文件迁移后未验证成功,则执行以下步骤将数据库回退
将数据库 spfile 指向旧的控制文件即可(旧的控制文件指向旧的数据文件、日志文件和
临时文件,由于日志文件和临时文件此时未被替换),不会出现任何数据丢失。
alter system set
control_files='+DATA_DG/yadpsdb/controlfile/current.256.772
932509' scope=spfile;
shutdown immediate
startup
2> 如果在 2.6 环节后,未验证成功,则执行以下步骤将数据库回退
这时候就相当于数据库是干净停下的,但是临时文件和日志文件已经被删除。
虽然临时文件和日志文件已经被删除(11g asmcmd cp 命令存在 BUG,导致临时文件和在线
日志文件无法 cp 成功,即无法备份),但是数据库是干净的停止的,旧的控制文件和旧的数
据文件的 SCN 是一致的,因此可以通过重建控制文件的方式,再 open resetlogs 方式来打开
数据库,再添加临时文件和重做日志文件即可。


数据库是干净的停止的,旧的控制文件和旧的数据文件的 SCN 是一致,尽管是 open
resetlogs 方式打开数据库,因此不会有任何数据丢失。
alter system set
control_files='+DATA_DG/yadpsdb/controlfile/current.256.772
932509' scope=spfile;
shutdown immediate
startup mount;
alter database backup controlfile to trace;
shutdown immediate
startup nomount
重建控制文件,指向新的日志文件……
recover database until cancel using backup controlfile;(输入
cancel)
alter database open resetlogs;
create temporary tablespace tmp tempfile '+DATA_DG_NEW' size
30G;
alter tablespace tmp add tempfile '+DATA_DG_NEW' size 30G;
alter database default temporary tablespace tmp;


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论