合 在Oracle中,如何移动或重命名数据文件?
简介
数据文件查询:
1 2 3 4 5 | col name format a60 set pagesize 9999 select ts#,file#,name,status from v$datafile d where d.status!='ONLINE' ; select * from v$tablespace; |
需要注意的是,对于SYSTEM、SYSAUX和UNDO表空间的数据文件的移动或重命名,强烈建议关闭数据库进行操作,否则可能会引起意外的错误,甚至宕机。
方法1:利用OS拷贝
关闭数据库,利用OS拷贝,该方法适用于任何类型的文件,步骤如下所示:
1 2 3 4 5 | A、SHUTDOWN IMMEDIATE关闭数据库 B、在OS下拷贝数据文件到新的地点 C、STARTUP MOUNT启动数据库到MOUNT状态下 D、ALTER DATABASE RENAME FILE '老文件' TO '新文件'; E、ALTER DATABASE OPEN;打开数据库 |
其实利用OS拷贝也可以联机操作,不关闭数据库,但是只针对可以OFFLINE的数据文件,步骤如下所示:
1 2 3 4 5 | ① alter database datafile '/home/oracle/ocplhr1_test.dbf' offline; ② recover datafile '/home/oracle/ocplhr1_test.dbf' ; ③ ! cp /home/oracle/ocplhr1_test.dbf /u01/app/oracle/oradata/OCPLHR1/ocplhr1_test01.dbf ④ ALTER DATABASE RENAME FILE '/home/oracle/ocplhr1_test.dbf' TO '/u01/app/oracle/oradata/OCPLHR1/ocplhr1_test01.dbf'; ⑤ alter database datafile '/u01/app/oracle/oradata/OCPLHR1/ocplhr1_test01.dbf' online; |
方法2:利用RMAN联机操作
1 2 3 4 5 6 7 8 9 10 11 | RMAN> sql "alter database datafile ''file name'' offline"; RMAN> recover datafile 文件号; RMAN> run { 2> copy datafile 'old file location' to 'new file location'; 3> switch datafile ' old file location' to datafilecopy ' new file location'; 4> } RMAN> sql "alter database datafile ''file name'' online"; -- 或者使用文件号 RMAN> sql "alter database datafile 4 online"; |
利用RMAN与利用OS拷贝的原理一样。在RMAN中,COPY命令是拷贝数据文件,相当于OS的cp命令,而SWITCH则相当于ALTER DATABASE RENAME用来更新控制文件。
示例:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | SYS@LHR11G> col name format a60 SYS@LHR11G> set pagesize 9999 SYS@LHR11G> select ts#,file#,name,status from v$datafile d where d.status!='ONLINE' ; TS# FILE# NAME STATUS ---------- ---------- ------------------------------------------------------------ -------------- 0 1 /u01/app/oracle/oradata/LHR11G/system01.dbf SYSTEM 4 4 /u01/app/oracle/oradata/LHR11G/users01.dbf RECOVER RMAN> sql "alter database datafile 4 offline"; sql statement: alter database datafile 4 offline RMAN> recover datafile 4; Starting recover at 2022-11-14 16:06:56 using channel ORA_DISK_1 starting media recovery media recovery complete, elapsed time: 00:00:00 Finished recover at 2022-11-14 16:06:56 RMAN> run { 2> copy datafile '/u01/app/oracle/oradata/LHR11G/users01.dbf' to '/u01/app/oracle/oradata/LHR11G/users01_test.dbf'; 3> switch datafile '/u01/app/oracle/oradata/LHR11G/users01.dbf' to datafilecopy '/u01/app/oracle/oradata/LHR11G/users01_test.dbf'; 4> } Starting backup at 2022-11-14 16:09:24 using channel ORA_DISK_1 channel ORA_DISK_1: starting datafile copy input datafile file number=00004 name=/u01/app/oracle/oradata/LHR11G/users01.dbf output file name=/u01/app/oracle/oradata/LHR11G/users01_test.dbf tag=TAG20221114T160924 RECID=2 STAMP=1120752565 channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01 Finished backup at 2022-11-14 16:09:25 datafile 4 switched to datafile copy input datafile copy RECID=2 STAMP=1120752565 file name=/u01/app/oracle/oradata/LHR11G/users01_test.dbf RMAN> sql "alter database datafile 4 online"; sql statement: alter database datafile 4 online SYS@LHR11G> select ts#,file#,name,status from v$datafile d ; TS# FILE# NAME STATUS ---------- ---------- ------------------------------------------------------------ -------------- 0 1 /u01/app/oracle/oradata/LHR11G/system01.dbf SYSTEM 1 2 /u01/app/oracle/oradata/LHR11G/sysaux01.dbf ONLINE 2 3 /u01/app/oracle/oradata/LHR11G/undotbs01.dbf ONLINE 4 4 /u01/app/oracle/oradata/LHR11G/users01_test.dbf OFFLINE 6 5 /u01/app/oracle/oradata/LHR11G/example01.dbf ONLINE SYS@LHR11G> exit Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@test ~]$ ll /u01/app/oracle/oradata/LHR11G/ total 2601172 -rw-r----- 1 oracle oinstall 9846784 Nov 14 16:09 control01.ctl -rw-r----- 1 oracle oinstall 363077632 Nov 14 13:41 example01.dbf -rw-r----- 1 oracle oinstall 52429312 Nov 14 16:09 redo01.log -rw-r----- 1 oracle oinstall 52429312 Nov 14 06:06 redo02.log -rw-r----- 1 oracle oinstall 52429312 Nov 14 13:36 redo03.log -rw-r----- 1 oracle oinstall 859840512 Nov 14 16:09 sysaux01.dbf -rw-r----- 1 oracle oinstall 817897472 Nov 14 16:09 system01.dbf -rw-r----- 1 oracle oinstall 54534144 Nov 14 12:18 temp01.dbf -rw-r----- 1 oracle oinstall 382738432 Nov 14 16:09 undotbs01.dbf -rw-r----- 1 oracle oinstall 9183232 Nov 14 16:06 users01.dbf -rw-r----- 1 oracle oinstall 9183232 Nov 14 16:09 users01_test.dbf |
方法3:利用ALTER TABLESPACE操作
ALTER TABLESPACE只能用于下面情况下的数据文件:不是SYSTEM表空间,不包含激活的回滚段,还有临时段,但是用ALTER TABLESPACE可以在实例启动的时候来执行,而ALTER DATABASE则适应于任何的数据文件,对于不能执行OFFLINE操作的数据文件,则此时数据库要在MOUNT状态下;而对于可以执行OFFLINE操作的数据文件,则数据库可以在OPEN状态下。
ALTER TABLESPACE方法步骤:
1 2 3 4 | ① OFFLINE相应的表空间:ALTER TABLESPACE TS_LHRDATA OFFLINE; ② 用操作系统命令重命名或者移动数据文件 ③ 用ALTER TABLESPACE命令来重命名数据库中的文件:ALTER TABLESPACE TS_LHRDATA RENAME DATAFILE '/u01/lhrdb/data01.dbf' TO '/u02/lhrdb/data01_new.dbf'; ④ ONLINE表空间:ALTER TABLESPACE TS_LHRDATA ONLINE; |
示例:
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@LHR11G> alter tablespace users offline; Tablespace altered. SYS@LHR11G> ! cp /u01/app/oracle/oradata/LHR11G/users01_test.dbf /u01/app/oracle/oradata/LHR11G/users01_test2.dbf SYS@LHR11G> ALTER TABLESPACE users RENAME DATAFILE '/u01/app/oracle/oradata/LHR11G/users01_test.dbf' TO '/u01/app/oracle/oradata/LHR11G/users01_test2.dbf'; Tablespace altered. SYS@LHR11G> ALTER TABLESPACE users ONLINE; Tablespace altered. SYS@LHR11G> select ts#,file#,name,status from v$datafile d ; TS# FILE# NAME STATUS ---------- ---------- ------------------------------------------------------------ -------------- 0 1 /u01/app/oracle/oradata/LHR11G/system01.dbf SYSTEM 1 2 /u01/app/oracle/oradata/LHR11G/sysaux01.dbf ONLINE 2 3 /u01/app/oracle/oradata/LHR11G/undotbs01.dbf ONLINE 4 4 /u01/app/oracle/oradata/LHR11G/users01_test2.dbf ONLINE 6 5 /u01/app/oracle/oradata/LHR11G/example01.dbf ONLINE SYS@LHR11G> |
方法4:12c新特性
不同于以往的版本,在Oracle数据库12c R1版本中对数据文件的迁移或重命名不再需要太多繁琐的步骤。在12c R1中,可以使用ALTER DATABASE MOVE DATAFILE
这样的SQL语句对数据文件进行在线重命名和移动。而当此数据文件正在传输时,终端用户可以执行查询,DML以及DDL方面的任务。另外,数据文件可以在存储设备间迁移,如从非ASM迁移至ASM,反之亦然。
重命名数据文件: