Oracle 更改数据文件位置的几种常用方式
A.归档模式下
 1、offline 表空间:alter tablespace tablespace_name offline;
 2、复制数据文件到新的目录;
 3、rename 修改表空间,并修改控制文件;
 4、online 表空间; 
注意:系统表空间只有 SYSAUX 可以采用该方式修改存储位置。
1、offline 表空间 TBS_NAME
 SQL> select name from vdatafile; 
 SQL> alter tablespace TBS_NAME offline; 
2、复制数据文件到新的目录
3、rename修改表空间数据文件为新的位置,并修改控制文件 
 SQL> alter tablespace TBS_NAME rename datafile '/XXX.dbf' to '/XXX.dbf'; 
4、online表空间 
 SQL> alter tablespace TBS_NAME online; 
 SQL> select name from vdatafile;
 SQL> select file_name,tablespace_name from dba_data_files where tablespace_name='TBS_NAME';
修改系统表空间 SYSTEM 与 UNDO 表空间位置: 
 shutdown immediate
 startup mount
 移动系统表空间(SYSTEM表空间)的数据文件到新的位置,然后修改表空间 SYSTEM、UNDO 数据文件路径
 alter database rename file 'C:\APP\DB_DATA\ORCL\SYSTEM01.DBF' to 'C:\APP\DB_DATA\UTBS\SYSTEM01.DBF';
 alter database rename file 'C:\APP\DB_DATA\ORCL\UNDOTBS01.DBF' to 'C:\APP\DB_DATA\UTBS\UNDOTBS01.DBF';
 alter database open; 
B.非归档模式
 1、关闭数据库;
 2、复制数据文件到新的位置;
 3、启动数据库到mount状态;
 4、通过SQL修改数据文件位置;
 5、打开数据库;
1、关闭数据库
 SQL> select name from vdatafile;  
 SQL> shutdown immediate;
2、复制数据文件到新的位置;
3、启动数据库到mount状态; 
 SQL> startup mount
4、通过SQL修改数据文件位置; 
 SQL> alter database rename file '/XXX.dbf' to '/XXX.dbf'; 
5、打开数据库; 
 SQL> alter database open;
 SQL> select name from vdatafile;
 SQL> select file_name,tablespace_name from dba_data_files where tablespace_name='TBS_NAME';
C.归档模式下通过RMAN的backup as copy来更改,首选方式 
 1.offline datafile
 2.backup as copy数据文件到指定路径
 3.switch datafile to copy切换控制文件中数据文件路径
 4.由于offline datafile不会做检查点,所以在online之前需要recover datafile
 5.online datafile 
C1、利用rman copy改变数据文件的路径 
 SQL> col file_name for a70 
 SQL> select file_name,tablespace_name,autoextensible,bytes/1024/1024 mb from dba_data_files;
 本实验目的是将 /u01/test01.dbf文件的修改为 /u01/app/oracle/oradata/orcl/test01.dbf
 关闭数据库,再启动到mount状态
 SQL> shutdown immediate
 SQL> startup mount; 
$ rman target /
 RMAN> copy datafile '/u01/test.dbf'  to '/u01/app/oracle/oradata/orcl/test01.dbf';
 RMAN> switch datafile '/u01/test.dbf' to copy;
再打开数据库,查看路径,已经该变
 SQL> alter database open;
 SQL> col file_name for a70
 SQL> select file_name,tablespace_name,autoextensible,bytes/1024/1024 mb from dba_data_files;
C2、使用rman copy进行数据文件copy(不需要停机) 
 建议此步骤在业务空闲期间做,这样在copy期间产生的归档日志较少,最后切换数据文件的时候需要应用的日志较少,停机时间较短
 使用rman进行copy,可以根据实际情况开多个通道加快copy速度.
 run{
  allocate channel ch1 device type disk;
  allocate channel ch2 device type disk;
  allocate channel ch3 device type disk;
  allocate channel ch4 device type disk;
  backup as copy database format '/u01/app/oradata/%b';
 }
停止数据库,修改参数文件,拷贝控制文件,恢复数据库(需要停机)
 1.修改参数文件
 SQL> alter system set control_files='/u01/app/oradata/control01.ctl','/u01/app/oradata/control02.ctl' scope=spfile;
         
 2.停止数据库,拷贝控制文件
 注意这里拷贝的文件名需要和上面参数文件中指定的一致
 SQL> shutdown immediate
 $ cp /u01/app/oracle/oradata/ORCL/control01.ctl /u01/app/oradata/control01.ctl
 $ cp /u01/app/oracle/oradata/ORCL/control02.ctl /u01/app/oradata/control02.ctl
3.使用rman恢复数据库
 $ rman target /
 RMAN>startup mount;
 RMAN>switch database to copy;
 RMAN>recover database;
 RMAN>alter database open;
到此,数据库迁移完成,检查所有的文件目录
 SQL> select file_name from dba_data_files;
 SQL> select file_name from dba_temp_files;
 SQL> select member from v$logfile;
 SQL> show parameter control
到这一步会发现临时文件和redo日志文件还存放在之前的目录里面:
 首先需要切换临时表空间数据文件目录,步骤如下:
 先给临时表空间添加临时文件,再删除原来的临时文件:
 alter tablespace TEMP add tempfile '/u01/app/oradata/temp01.dbf' size 100m autoextend on;
 alter database tempfile '/u01/app/oracle/oradata/ORCL/temp01.dbf' drop;
 检查临时文件是否到了新的目录中:
 SQL> select file_name from dba_temp_files;
修改redo日志文件路径位置:
 创建过渡 redo 组并存放至新的位置
 select group#,bytes/1024/1024,status from v$log;
 alter database add logfile group 4 '/u01/app/oradata/redo04.log' size 200M;
 alter database add logfile group 5 '/u01/app/oradata/redo05.log' size 200M;
 alter database add logfile group 6 '/u01/app/oradata/redo06.log' size 200M; 
切换到过渡redo
 alter system switch logfile;
 alter system archive log current;
 alter system checkpoint;
查看是否切换到过渡的redo
 select group#,bytes/1024/1024,status from v$log;
删除之前位置的日志组
 alter database drop logfile group 1;
 alter database drop logfile group 2;
 alter database drop logfile group 3;
通过操作系统删除老的redo01.log、redo02.log、redo03.log
 rm -rf redo01.log、redo02.log、redo03.log
 到此所有数据文件、临时文件、日志组文件全部更换至新位置,更新位置完成后验证数据库是否正常即可。
附上截取数据文件目录、数据文件名称的SQL语句,如下:
 select substr(file_name, 1, instr(file_name, '\', -1)) from dba_data_files;
 SELECT SUBSTR(file_name, INSTR(file_name, '\', -1) + 1) FROM dba_data_files;