能迁,但必须停库或至少让数据文件offline,不能全程在线;rman的copy+switch是核心路径,控制文件、重做日志、临时文件需单独处理。

直接回答:能迁,但必须停库或至少让数据文件 offline,不能全程在线;RMAN 的 COPY + SWITCH 是核心路径,控制文件、重做日志、临时文件需单独处理。
COPY 和 SWITCH 必须成对使用,缺一不可
RMAN 不会自动更新控制文件里的文件路径,COPY 只是把文件复制到 ASM,物理存在了,但数据库仍“认为”数据文件还在原位置。
必须紧接着执行 SWITCH,让控制文件把该文件号(FILE#)指向新 ASM 路径。
-
COPY操作本身不改变数据库状态,可对单个数据文件执行,也支持批量 -
SWITCH DATAFILE ALL会批量更新所有已 copy 完的数据文件路径,但前提是每个都已成功 copy - 错误现象:copy 完没 switch,
ALTER DATABASE OPEN会报ORA-01157: cannot identify/lock data file - 示例片段:
RMAN> COPY DATAFILE 1 TO '+DATA';<br>RMAN> SWITCH DATAFILE 1 TO COPY;
控制文件必须先还原到 ASM,再启动到 MOUNT
你不能靠 ALTER SYSTEM SET CONTROL_FILES 动态改——那只是改参数,旧控制文件还在文件系统里。
正确做法是:
先用
SHUTDOWN IMMEDIATE停库启动到
NOMOUNT(此时只读 SPFILE,不依赖控制文件)用 RMAN
RESTORE CONTROLFILE FROM '/path/to/old/control01.ctl'把控制文件 copy 到 ASM再
ALTER DATABASE MOUNT—— 此时数据库才真正从 ASM 读控制文件关键点:SPFILE 中的
CONTROL_FILES参数必须提前设为 ASM 路径(如'+DATA/dbname/controlfile/current.xxx'),否则 mount 会失败若用 PFILE 启动,需手动在 PFILE 中写死 ASM 路径,且确保路径格式合法(ASM 路径不接受裸设备名或相对路径)
重做日志和临时文件不能靠 SWITCH,得重建
SWITCH 只适用于数据文件(V$DATAFILE),对 redo、temp 不生效:
重做日志:必须用
ALTER DATABASE ADD LOGFILE ... TO '+DATA'新增组,再DROP LOGFILE GROUP N删除旧组(注意要确保至少两组 online,且切换过归档)临时文件:用
ALTER DATABASE TEMPFILE '/old/path/temp01.dbf' DROP INCLUDING DATAFILES删除旧文件,再ALTER TABLESPACE TEMP ADD TEMPFILE SIZE 100M(自动落到DB_CREATE_FILE_DEST指向的 ASM 组)遗漏后果:open 后数据库能跑,但日志切换可能卡住(如果只剩一个 online log 在文件系统),或临时表空间无法扩展
性能影响:新建日志组时建议用
REUSE和足够大小(如 200MB+),避免频繁 checkpoint
最容易被忽略的三个点
-
DB_CREATE_FILE_DEST和DB_RECOVERY_FILE_DEST必须提前设为 ASM 路径并SCOPE=SPFILE,否则后续自动创建的文件(如归档、新 temp、新 undo)还会落回文件系统 - RMAN copy 过程中若目标 ASM 磁盘组空间不足,错误信息是
ORA-19504: failed to create file "+DATA",不是磁盘满的直白提示,需查ASMCMD ls -l或V$ASM_DISKGROUP - 所有操作完成后,务必验证:
SELECT NAME FROM V$DATAFILE、V$TEMPFILE、V$LOGFILE、V$CONTROLFILE输出的路径是否全为+开头 —— 少一个都算迁移未完成











