做 Oracle 运维这么多年了,经常会碰到老旧存储下线、机房存储扩容、ASM 磁盘组重构各种各样需求。很多DBA一碰到 ASM 存储迁移就头疼,担心动 OCR、表决盘搞崩集群,也怕迁数据文件丢数据、起不来库。
我整理了一些我之前用过、验证过的ASM 磁盘组更换、集群核心文件迁移、整库迁移、单文件零散迁移的文档,也希望拿出来和大家分享下。
一、迁移前期:先查清楚现有环境家底
动手迁移之前,千万千万别上来就操作,一定要先把现有集群、ASM 磁盘、各类核心文件位置摸清楚,避免改错路径、删错磁盘,这点一定要记牢,别犯错。
1.1 集群关键磁盘查询
登录服务器执行,查看 OCR 配置和集群表决盘位置:
# 查看OCR存放路径
ocrcheck -config
# 查看CSS集群表决磁盘分布
crsctl query css votedisk
1.2 裸设备与 ASM 磁盘映射
如果是裸设备部署,可以用命令查到物理磁盘和 ASM 设备的对应关系:
oracleasm querydisk /dev/xxx
1.3 查看 ASM 磁盘与磁盘组状态
登录 ASM 实例执行,能清晰看到所有磁盘、磁盘组挂载状态、可用空间:
set linesize 160
col path for a50
select name, path, state, type from v$asm_disk;
-- 查看磁盘组挂载、冗余、容量信息
select name, state, type, total_mb, free_mb from v$asm_diskgroup;
1.4 版本关键差异提醒
这点很会让很多人容易踩坑:
-
Oracle 11g:ASM 密码文件只能放在本地文件系统,不能存到 ASM 磁盘组;
-
Oracle 12c 及以上:支持把 ASM 密码文件、SPFILE 都托管在 ASM 磁盘组里,管理起来也更方便。
集群环境里 OCR、表决盘、ASM 参数文件是核心文件,迁移必须优先处理,一旦出错整个 RAC 集群都起不来。
二、RAC 集群核心文件迁移(OCR + 表决盘 + ASM 参数文件)
适用场景:彻底更换底层存储、把集群核心文件从旧磁盘组迁移到全新 ASM 磁盘组。
重要提醒:属于高危操作,务必选业务低峰期,提前备份集群配置,严禁业务高峰期操作。
2.1 前期准备
-
提前规划并创建新的 ASM 目标磁盘组;
-
RAC所有节点都要挂载新磁盘组,确认每个节点磁盘组状态都是正常挂载;
2.2 迁移 OCR 与表决盘
在集群任意一个节点用 grid 用户执行就行:
# 给新磁盘组添加OCR镜像
ocrconfig -add +新磁盘组名
# 移除旧磁盘组上的OCR配置
ocrconfig -delete +旧磁盘组名
# 把集群表决盘整体替换到新磁盘组
crsctl replace votedisk +新磁盘组名
操作完一定要校验,确保配置生效:
# 核对表决盘是否已切换
crsctl query css votedisk
# 检查OCR文件完整性
ocrcheck
2.3 迁移 ASM 实例参数文件 SPFILE
很多人不知道 ASM 的 spfile 也能迁移,步骤很简单:
1)先从当前运行的 spfile 导出成本地文本参数文件
create pfile='/home/grid/asm_temp.pfile' from spfile;
2)用本地 pfile 在新磁盘组重新生成 spfile
create spfile='+新磁盘组名' from pfile='/home/grid/asm_temp.pfile';
3)集群会自动更新 GPNP 配置,我们可以手动查看确认:
gpnptool get
2.4 重启集群并全面校验
所有节点依次重启 CRS 服务,不要同时重启。重启完成后,逐条检查集群资源状态:
# 查看集群初始化资源状态
crsctl stat res -init -t
# 全节点集群健康检测
crsctl check cluster -all
# 查看业务资源整体运行情况
crsctl stat res -t
三、整库整体迁移到新 ASM 磁盘组
如果是整套数据库换存储,直接把参数文件、控制文件、数据文件、日志、临时文件一次性迁移到新磁盘组,不用拆分表空间,效率更高。
3.1 迁移数据库 SPFILE
先备份原 spfile 导出 pfile,修改文件里所有旧磁盘组路径为新路径,再重新生成 spfile 指向新 ASM 磁盘组。
3.2 迁移控制文件
1)在线把控制文件备份到新磁盘组
alter database backup controlfile to '+新磁盘组名';
2)查到新生成的控制文件完整路径后,修改数据库参数固化到 spfile:
alter system set control_files='新控制文件完整路径' scope=spfile;
3.3 RMAN 批量拷贝迁移数据文件
这是最核心的一步,用 RMAN 在线拷贝,不用额外做全量备份:
rman target /
# 关闭数据库
shutdown immediate;
# 启动到nomount状态
startup nomount;
# 从旧磁盘组恢复控制文件到新磁盘组
restore controlfile to '+新磁盘组名' from '旧控制文件路径';
# 挂载数据库
alter database mount;
# 整库拷贝到新磁盘组
backup as copy database format '+新磁盘组名';
拷贝完成后切换数据库指向新文件并恢复:
switch database to copy;
recover database;
alter database open resetlogs;
3.4 迁移临时文件
新磁盘组先加新临时文件,再删掉旧存储上的临时文件:
-- 新增临时文件
alter tablespace TEMP add tempfile '+新磁盘组名' SIZE 10M autoextend on;
-- 删除旧临时文件
alter database tempfile '旧临时文件路径' drop;
3.5 迁移在线重做日志
1)先查现有日志组状态
select thread#,group#,members,sequence#,bytes/1024/1024 mb,status from v$log;
2)给每个日志组增加新磁盘组成员
alter database add logfile member '+新磁盘组名' to group 1;
alter database add logfile member '+新磁盘组名' to group 2;
alter database add logfile member '+新磁盘组名' to group 3;
3)查到旧日志文件路径,删除旧成员即可
select group#,member from v$logfile;
alter database drop logfile member '旧日志文件完整路径';
3.6 收尾必改参数
库迁完不算完,一定要把所有关联旧存储的参数改掉:
归档日志路径、快速恢复区 FRA、数据库默认文件创建路径等,不然后续新建数据、归档还会往旧存储写。
四、零散场景:单独迁移指定文件
实际工作中不一定每次都迁整库,有时候只需要挪控制文件、只迁某几个表空间,给大家整理了常用简易方案。
4.1 单独迁移控制文件
1)建好新 ASM 磁盘组;
2)停掉数据库,用 asmcmd 命令直接把控制文件拷贝到新磁盘组;
3)启库到 nomount,修改 control_files 参数指向新路径;
4)正常启库校验即可。
4.2 分表空间迁移数据文件
系统表空间(system/sysaux)
这类核心表空间不能在线迁移,RAC 环境建议只保留单节点操作:
1)RMAN 把系统表空间拷贝到新磁盘组
backup as copy tablespace system format '+新磁盘组名';
backup as copy tablespace sysaux format '+新磁盘组名';
2)关库启动到 mount 状态,切换并恢复
shutdown immediate;
startup mount;
switch tablespace system to copy;
switch tablespace sysaux to copy;
recover database;
普通表空间 / 单数据文件
适合迁移业务普通表空间,可在线操作:
1)先把要迁移的数据文件离线
ALTER DATABASE DATAFILE '旧数据文件路径' OFFLINE;
2)RMAN 拷贝文件到新磁盘组
COPY DATAFILE '旧文件路径' TO '+新磁盘组名';
3)切换数据文件指向新路径,恢复后上线
run {
set newname for datafile '旧文件路径' to '新文件完整路径' ;
switch datafile all;
}
RECOVER DATAFILE '新文件路径';
ALTER DATABASE DATAFILE '新文件路径' ONLINE;
4)旧文件清理
OMF 模式下旧文件会自动清理;非 OMF 需要手动在 ASM 里删除:
ALTER DISKGROUP 旧磁盘组名 DROP FILE '旧文件路径';
五、迁移完成后统一校验
所有迁移操作结束,一定要执行下面这条汇总查询,检查控制文件、数据文件、临时文件、日志文件是否全部切换到新磁盘组,没有残留旧路径:
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)RAC 环境所有磁盘组必须保证所有节点挂载状态一致,单节点挂载异常极易引发集群宕机;
2)OCR、表决盘迁移是高危操作,一定要提前备份,低峰期执行,新手不要随意尝试;
3)分清 11g 和 12c 版本差异,别强行把 11g 密码文件放到 ASM 里;
4)数据文件迁移优先用 RMAN copy 方式,比传统停机拷贝更安全、耗时更短;
5)迁移后务必检查归档、FRA 等参数,很多故障都是忘了改参数,导致日志写满旧存储;
6)没完全确认所有文件迁移完毕前,绝对不要贸然删除旧 ASM 磁盘组。