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;