在管理Oracle数据库时,我们经常需要把ASM文件从一个磁盘组挪到另一个磁盘组。今天就给大家分享两种亲测有效的迁移方法,连系统表空间怎么操作都会讲到,建议先收藏再看!

迁移前的准备工作

首先记住两个重要知识点:

  1. 从Oracle 12c开始,官方推荐用SQL语句直接操作(文末会教)
  2. 传统方法主要依赖RMAN工具,毕竟ASM文件不能像普通文件那样直接操作

通用迁移步骤(6步搞定)

  1. 锁定目标文件
    登录数据库执行:
1
SELECT FILE_NAME FROM DBA_DATA_FILES;

比如我们要移动这个文件:
+ASMDSK2/orcl/datafile/users.256.565313879

  1. 确认目标磁盘组
    在ASM实例中查看:
1
SELECT GROUP_NUMBER, NAME FROM V$ASM_DISKGROUP;

假设我们要移到ASMDSK1这个组

  1. 让文件下线
1
ALTER DATABASE DATAFILE '+ASMDSK2/.../users.256.565313879' OFFLINE;

两种迁移方法任选

👉 方法一:DBMS_FILE_TRANSFER(适合小文件)

  1. 创建目录对象
1
2
3
-- 在源和目标磁盘组创建目录
CREATE OR REPLACE DIRECTORY orcl1 AS '+asmdsk1/orcl/datafile';
CREATE OR REPLACE DIRECTORY orcl2 AS '+asmdsk2/test';
  1. 执行文件拷贝
1
2
3
4
5
6
7
BEGIN
DBMS_FILE_TRANSFER.COPY_FILE(
source_directory_object => 'ORCL1',
source_file_name => 'users.259.565359071',
destination_directory_object => 'ORCL2',
destination_file_name => 'USERS01.DBF');
END;

👉 方法二:RMAN拷贝(推荐大文件)

1
2
3
rman target system@orcl10
# 执行拷贝命令
COPY DATAFILE '+ASMDSK2/.../users.256.565313879' TO '+ASMDSK1';

看到类似这样的输出就成功了:

1
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03

后续收尾工作

  1. 更新文件路径
1
ALTER DATABASE RENAME FILE '+ASMDSK2/...' TO '+ASMDSK1/...';
  1. 恢复并上线
1
2
RECOVER DATAFILE '+ASMDSK1/...';
ALTER DATABASE DATAFILE '+ASMDSK1/...' ONLINE;
  1. 确认迁移结果
1
SELECT FILE_NAME FROM DBA_DATA_FILES;

系统表空间特殊处理

想动system/sysaux表空间?得这样操作:

1
2
3
4
5
6
7
8
9
# 先备份到新磁盘组
RMAN> backup as copy tablespace system format '+NEW_DG';
# 重启到挂载模式
RMAN> shutdown immediate;
RMAN> startup mount;
# 切换表空间
RMAN> switch tablespace system to copy;
# 最后恢复数据
RMAN> recover database;

12c版本专属福利

直接用SQL语句搞定:

1
ALTER DATABASE MOVE DATAFILE '+dgroup_01/...' TO '+dgroup_02/...';

注意事项:

  1. 迁移时数据库需处于OPEN状态+归档模式
  2. 99%的ASM文件不用手动删,系统会自动清理
  3. 手动删除要用全路径,否则会报ORA-15177错误

如果操作过程中遇到问题,欢迎在评论区留言讨论~觉得有用记得点个赞哦!