12c以前如果要移动或者rename一个datafile,必须要先将这个数据文件offline,虽然可以通过一些方法来减少offline的时间,但是无法完全避免。
如果数据库不是归档模式,甚至都无法offline
1 2 3 4 5 6 7 8 9 10 11 12 sys@XB> archive log list; Database log mode No Archive Mode >>>>====非归档模式 Automatic archival Disabled Archive destination /u01/arch Oldest online log sequence 167 Current log sequence 169 sys@XB> alter database datafile 5 offline; alter database datafile 5 offline * ERROR at line 1: ORA-01145: offline immediate disallowed unless media recovery enabled
到12c版本以后可以直接通过ALTER DATABASE MOVE DATAFILE
相关命令来在线重命名或者移动数据文件,即使数据库是open状态和用户正在访问的情况下,甚至都不需要开归档。
当在线重命名或者移动数据文件时,记录在控制文件里的指向数据文件的指针也做了变更。同时在操作系统层面数据文件也做了物理上的重命名和移动。
常见以下几种场景
将数据文件从一种存储类型移动到另一种
将那些不活跃的数据文件移动到成本更低的存储上
将一个表空间置为只读并将其数据文件移动到一次写入的存储空间上
将数据库移动到asm上
基本语法
样例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 sys@ORA12C> select file_id,file_name from dba_data_files; FILE_ID FILE_NAME ---------- -------------------------------------------------------------------------------- 13 /u01/app/oracle/oradata/ora12c/test/system01.dbf 14 /u01/app/oracle/oradata/ora12c/test/sysaux01.dbf 15 /u01/app/oracle/oradata/ora12c/test/undotbs01.dbf 16 /u01/app/oracle/oradata/ora12c/test/users01.dbf sys@ORA12C> alter database move datafile 16 to '/u01/app/oracle/oradata/ora12c/test/users02.dbf'; Database altered. sys@ORA12C> ! ls -l /u01/app/oracle/oradata/ora12c/test/ total 3076380 -rw-r-----. 1 oracle oinstall 891297792 Dec 25 14:45 sysaux01.dbf -rw-r-----. 1 oracle oinstall 1174413312 Dec 25 14:45 system01.dbf -rw-r-----. 1 oracle oinstall 58728448 Dec 14 23:07 temp01.dbf -rw-r-----. 1 oracle oinstall 1064312832 Dec 25 14:45 undotbs01.dbf -rw-r-----. 1 oracle oinstall 5251072 Dec 25 14:48 users02.dbf
可以看到原有的文件users01已经没有了,文件号仍然复用原来的,如果想保存则可以使用KEEP
关键字
1 2 3 4 5 6 7 8 9 10 11 12 sys@ORA12C> alter database move datafile 16 to '/u01/app/oracle/oradata/ora12c/test/users01.dbf' KEEP; >>>>====KEEP保存源数据文件 Database altered. sys@ORA12C> ! ls -l /u01/app/oracle/oradata/ora12c/test/ total 3081508 -rw-r-----. 1 oracle oinstall 891297792 Dec 25 14:50 sysaux01.dbf -rw-r-----. 1 oracle oinstall 1174413312 Dec 25 14:50 system01.dbf -rw-r-----. 1 oracle oinstall 58728448 Dec 14 23:07 temp01.dbf -rw-r-----. 1 oracle oinstall 1064312832 Dec 25 14:50 undotbs01.dbf -rw-r-----. 1 oracle oinstall 5251072 Dec 25 14:50 users01.dbf -rw-r-----. 1 oracle oinstall 5251072 Dec 25 14:50 users02.dbf
这里使用KEEP
要注意的是如果源数据文件是OMF格式,则无效
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 sys@ORA12C> select file_id,file_name from dba_data_files; FILE_ID FILE_NAME ---------- -------------------------------------------------------------------------------- 7 /u01/app/oracle/oradata/ORA12C/datafile/o1_mf_users_fzwd2jvr_.dbf 4 /u01/app/oracle/oradata/ORA12C/datafile/o1_mf_undotbs1_fzwd2hjh_.dbf 1 /u01/app/oracle/oradata/ORA12C/datafile/o1_mf_system_fzwd08pk_.dbf 3 /u01/app/oracle/oradata/ORA12C/datafile/o1_mf_sysaux_fzwd1p73_.dbf >>>>====这里的源文件是OMF格式 sys@ORA12C> alter database move datafile 7 to '/u01/app/oracle/oradata/ORA12C/datafile/o1_mf_users_fzwd2jvr2.dbf' KEEP; >>>>====指定了KEEP Database altered. sys@ORA12C> ! ls -l /u01/app/oracle/oradata/ORA12C/datafile/ total 2584916 -rw-r-----. 1 oracle oinstall 660611072 Dec 25 14:52 o1_mf_sysaux_fzwd1p73_.dbf -rw-r-----. 1 oracle oinstall 346038272 Nov 28 14:15 o1_mf_sysaux_fzwd3qyq_.dbf -rw-r-----. 1 oracle oinstall 1059069952 Dec 25 14:51 o1_mf_system_fzwd08pk_.dbf -rw-r-----. 1 oracle oinstall 262152192 Nov 28 14:15 o1_mf_system_fzwd3qyt_.dbf -rw-r-----. 1 oracle oinstall 138420224 Dec 15 00:07 o1_mf_temp_fzwd3npo_.tmp -rw-r-----. 1 oracle oinstall 73408512 Dec 25 14:51 o1_mf_undotbs1_fzwd2hjh_.dbf -rw-r-----. 1 oracle oinstall 104865792 Nov 28 14:15 o1_mf_undotbs1_fzwd3qyw_.dbf -rw-r-----. 1 oracle oinstall 13115392 Dec 25 14:52 o1_mf_users_fzwd2jvr2.dbf >>>>====源文件依然被清除 -rw-r-----. 1 oracle oinstall 67117056 Nov 28 14:09 temp012018-11-28_14-07-17-369-PM.dbf
如果目标文件已存在,则可以使用REUSE
来覆盖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 sys@ORA12C> alter database move datafile 16 to '/u01/app/oracle/oradata/ora12c/test/users02.dbf'; alter database move datafile 16 to '/u01/app/oracle/oradata/ora12c/test/users02.dbf' * ERROR at line 1: ORA-01119: error in creating database file '/u01/app/oracle/oradata/ora12c/test/users02.dbf' ORA-27038: created file already exists Additional information: 1 sys@ORA12C> alter database move datafile 16 to '/u01/app/oracle/oradata/ora12c/test/users02.dbf' REUSE; >>>>====加上REUSE Database altered. sys@ORA12C> ! ls -l /u01/app/oracle/oradata/ora12c/test/ total 3076380 -rw-r-----. 1 oracle oinstall 891297792 Dec 25 15:00 sysaux01.dbf -rw-r-----. 1 oracle oinstall 1174413312 Dec 25 15:00 system01.dbf -rw-r-----. 1 oracle oinstall 58728448 Dec 14 23:07 temp01.dbf -rw-r-----. 1 oracle oinstall 1064312832 Dec 25 15:00 undotbs01.dbf -rw-r-----. 1 oracle oinstall 5251072 Dec 25 15:04 users02.dbf >>>>====由于没有KEEP关键字,源USERS01被清除
CDB与PDB 要注意CDB是无法移动属于PDB的数据文件的,例如下面列出了CDB和PDBS所有的数据文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 sys@ORA12C> SELECT file#, name FROM v$datafile ORDER BY file#; FILE# NAME ---------- -------------------------------------------------------------------------------------------------------------- 1 /u01/app/oracle/oradata/ORA12C/datafile/o1_mf_system_fzwd08pk_.dbf 3 /u01/app/oracle/oradata/ORA12C/datafile/o1_mf_sysaux_fzwd1p73_.dbf 4 /u01/app/oracle/oradata/ORA12C/datafile/o1_mf_undotbs1_fzwd2hjh_.dbf 5 /u01/app/oracle/oradata/ORA12C/datafile/o1_mf_system_fzwd3qyt_.dbf 6 /u01/app/oracle/oradata/ORA12C/datafile/o1_mf_sysaux_fzwd3qyq_.dbf 7 /u01/app/oracle/oradata/ORA12C/datafile/o1_mf_users_fzwd2jvr2.dbf 8 /u01/app/oracle/oradata/ORA12C/datafile/o1_mf_undotbs1_fzwd3qyw_.dbf 9 /u01/app/oracle/oradata/ORA12C/7BB47ECB77F51BD9E053140200C0A690/datafile/o1_mf_system_fzwdnfgx_.dbf 10 /u01/app/oracle/oradata/ORA12C/7BB47ECB77F51BD9E053140200C0A690/datafile/o1_mf_sysaux_fzwdnfhk_.dbf 11 /u01/app/oracle/oradata/ORA12C/7BB47ECB77F51BD9E053140200C0A690/datafile/o1_mf_undotbs1_fzwdnfhl_.dbf 12 /u01/app/oracle/oradata/ORA12C/7BB47ECB77F51BD9E053140200C0A690/datafile/o1_mf_users_fzwdofsk_.dbf 13 /u01/app/oracle/oradata/ora12c/test/system01.dbf 14 /u01/app/oracle/oradata/ora12c/test/sysaux01.dbf 15 /u01/app/oracle/oradata/ora12c/test/undotbs01.dbf 16 /u01/app/oracle/oradata/ora12c/test/users02.dbf sys@ORA12C> alter database move datafile 16 to '/u01/app/oracle/oradata/ora12c/test/users01.dbf'; alter database move datafile 16 to '/u01/app/oracle/oradata/ora12c/test/users01.dbf' * ERROR at line 1: ORA-01516: nonexistent log file, data file, or temporary file "16" in the current container
只能切换到对应的PDB下,才可以操作
1 alter session set container=test;