Oracle ASM 存储更换与整体迁移实战整理

做 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 前期准备

  1. 提前规划并创建新的 ASM 目标磁盘组

  2. 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 磁盘组。

相关推荐
l1t5 小时前
DeepSeek总结的将 Rust Delta Kernel 集成到 ClickHouse
数据库·clickhouse·rust
qq_283720055 小时前
万字深度:Chroma 向量数据库全解析 — 核心原理、实战操作、性能优化与工程最佳实践
数据库·性能优化
黄筱筱筱筱筱筱筱5 小时前
二进制包安装MySql服务
数据库
初心未改HD5 小时前
LLM应用开发之向量数据库详解
数据库·人工智能
键盘上的猫头鹰5 小时前
【从零学MySQL(三)】数据增删改(DML)及 SELECT 查询详解
数据库·mysql·数据分析
KaMeidebaby6 小时前
卡梅德生物技术快报|蛋白的过表达质粒构建与生信分析实验全流程复盘
前端·数据库·其他·百度·新浪微博
渣渣盟6 小时前
数据库之两段锁协议相关理论及应用
数据库·关系规范化·两段锁协议
LCG元6 小时前
Istio - 服务网格流量治理深度解析:灰度发布 / 故障注入配置实践
java·数据库·istio
SuniaWang6 小时前
《Agentx专栏》03-架构设计:AgentX的六层架构是如何生长出来的
java·数据库·redis·docker·ai·架构
键盘上的猫头鹰6 小时前
【从零学MySQL(二)】数据库基础操作、数据类型与约束(附Navicat演示)
数据库·mysql·数据分析·数据可视化