简介
数据文件查询:
1col name format a60
2set pagesize 9999
3select ts#,file#,name,status from v$datafile d where d.status!='ONLINE' ;
4
5select * from v$tablespace;复制
需要注意的是,对于SYSTEM、SYSAUX和UNDO表空间的数据文件的移动或重命名,强烈建议关闭数据库进行操作,否则可能会引起意外的错误,甚至宕机。
方法1:利用OS拷贝
关闭数据库,利用OS拷贝,该方法适用于任何类型的文件,步骤如下所示:
1A、SHUTDOWN IMMEDIATE关闭数据库
2B、在OS下拷贝数据文件到新的地点
3C、STARTUP MOUNT启动数据库到MOUNT状态下
4D、ALTER DATABASE RENAME FILE '老文件' TO '新文件';
5E、ALTER DATABASE OPEN;打开数据库复制
其实利用OS拷贝也可以联机操作,不关闭数据库,但是只针对可以OFFLINE的数据文件,步骤如下所示:
1① alter database datafile '/home/oracle/ocplhr1_test.dbf' offline;
2② recover datafile '/home/oracle/ocplhr1_test.dbf' ;
3③ ! cp /home/oracle/ocplhr1_test.dbf /u01/app/oracle/oradata/OCPLHR1/ocplhr1_test01.dbf
4④ ALTER DATABASE RENAME FILE '/home/oracle/ocplhr1_test.dbf' TO '/u01/app/oracle/oradata/OCPLHR1/ocplhr1_test01.dbf';
5⑤ alter database datafile '/u01/app/oracle/oradata/OCPLHR1/ocplhr1_test01.dbf' online;复制
方法2:利用RMAN联机操作
1RMAN> sql "alter database datafile ''file name'' offline";
2RMAN> recover datafile 文件号;
3RMAN> run {
42> copy datafile 'old file location' to 'new file location';
53> switch datafile ' old file location' to datafilecopy ' new file location';
64> }
7RMAN> sql "alter database datafile ''file name'' online";
8
9
10
11-- 或者使用文件号
12RMAN> sql "alter database datafile 4 online";
13复制
利用RMAN与利用OS拷贝的原理一样。在RMAN中,COPY命令是拷贝数据文件,相当于OS的cp命令,而SWITCH则相当于ALTER DATABASE RENAME用来更新控制文件。
示例:
1SYS@LHR11G> col name format a60
2SYS@LHR11G> set pagesize 9999
3SYS@LHR11G> select ts#,file#,name,status from v$datafile d where d.status!='ONLINE' ;
4
5 TS# FILE# NAME STATUS
6---------- ---------- ------------------------------------------------------------ --------------
7 0 1 /u01/app/oracle/oradata/LHR11G/system01.dbf SYSTEM
8 4 4 /u01/app/oracle/oradata/LHR11G/users01.dbf RECOVER
9
10
11
12RMAN> sql "alter database datafile 4 offline";
13
14sql statement: alter database datafile 4 offline
15
16RMAN> recover datafile 4;
17
18Starting recover at 2022-11-14 16:06:56
19using channel ORA_DISK_1
20
21starting media recovery
22media recovery complete, elapsed time: 00:00:00
23
24Finished recover at 2022-11-14 16:06:56
25
26
27
28RMAN> run {
292> copy datafile '/u01/app/oracle/oradata/LHR11G/users01.dbf' to '/u01/app/oracle/oradata/LHR11G/users01_test.dbf';
303> switch datafile '/u01/app/oracle/oradata/LHR11G/users01.dbf' to datafilecopy '/u01/app/oracle/oradata/LHR11G/users01_test.dbf';
314> }
32
33Starting backup at 2022-11-14 16:09:24
34using channel ORA_DISK_1
35channel ORA_DISK_1: starting datafile copy
36input datafile file number=00004 name=/u01/app/oracle/oradata/LHR11G/users01.dbf
37output file name=/u01/app/oracle/oradata/LHR11G/users01_test.dbf tag=TAG20221114T160924 RECID=2 STAMP=1120752565
38channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
39Finished backup at 2022-11-14 16:09:25
40
41datafile 4 switched to datafile copy
42input datafile copy RECID=2 STAMP=1120752565 file name=/u01/app/oracle/oradata/LHR11G/users01_test.dbf
43
44RMAN> sql "alter database datafile 4 online";
45
46sql statement: alter database datafile 4 online
47
48
49SYS@LHR11G> select ts#,file#,name,status from v$datafile d ;
50
51 TS# FILE# NAME STATUS
52---------- ---------- ------------------------------------------------------------ --------------
53 0 1 /u01/app/oracle/oradata/LHR11G/system01.dbf SYSTEM
54 1 2 /u01/app/oracle/oradata/LHR11G/sysaux01.dbf ONLINE
55 2 3 /u01/app/oracle/oradata/LHR11G/undotbs01.dbf ONLINE
56 4 4 /u01/app/oracle/oradata/LHR11G/users01_test.dbf OFFLINE
57 6 5 /u01/app/oracle/oradata/LHR11G/example01.dbf ONLINE
58
59SYS@LHR11G> exit
60Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
61With the Partitioning, OLAP, Data Mining and Real Application Testing options
62[oracle@test ~]$ ll /u01/app/oracle/oradata/LHR11G/
63total 2601172
64-rw-r----- 1 oracle oinstall 9846784 Nov 14 16:09 control01.ctl
65-rw-r----- 1 oracle oinstall 363077632 Nov 14 13:41 example01.dbf
66-rw-r----- 1 oracle oinstall 52429312 Nov 14 16:09 redo01.log
67-rw-r----- 1 oracle oinstall 52429312 Nov 14 06:06 redo02.log
68-rw-r----- 1 oracle oinstall 52429312 Nov 14 13:36 redo03.log
69-rw-r----- 1 oracle oinstall 859840512 Nov 14 16:09 sysaux01.dbf
70-rw-r----- 1 oracle oinstall 817897472 Nov 14 16:09 system01.dbf
71-rw-r----- 1 oracle oinstall 54534144 Nov 14 12:18 temp01.dbf
72-rw-r----- 1 oracle oinstall 382738432 Nov 14 16:09 undotbs01.dbf
73-rw-r----- 1 oracle oinstall 9183232 Nov 14 16:06 users01.dbf
74-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① OFFLINE相应的表空间:ALTER TABLESPACE TS_LHRDATA OFFLINE;
2② 用操作系统命令重命名或者移动数据文件
3③ 用ALTER TABLESPACE命令来重命名数据库中的文件:ALTER TABLESPACE TS_LHRDATA RENAME DATAFILE '/u01/lhrdb/data01.dbf' TO '/u02/lhrdb/data01_new.dbf';
4④ ONLINE表空间:ALTER TABLESPACE TS_LHRDATA ONLINE;复制
示例:
1SYS@LHR11G> alter tablespace users offline;
2
3Tablespace altered.
4
5SYS@LHR11G> ! cp /u01/app/oracle/oradata/LHR11G/users01_test.dbf /u01/app/oracle/oradata/LHR11G/users01_test2.dbf
6
7SYS@LHR11G> ALTER TABLESPACE users RENAME DATAFILE '/u01/app/oracle/oradata/LHR11G/users01_test.dbf' TO '/u01/app/oracle/oradata/LHR11G/users01_test2.dbf';
8
9Tablespace altered.
10
11SYS@LHR11G> ALTER TABLESPACE users ONLINE;
12
13Tablespace altered.
14SYS@LHR11G> select ts#,file#,name,status from v$datafile d ;
15
16 TS# FILE# NAME STATUS
17---------- ---------- ------------------------------------------------------------ --------------
18 0 1 /u01/app/oracle/oradata/LHR11G/system01.dbf SYSTEM
19 1 2 /u01/app/oracle/oradata/LHR11G/sysaux01.dbf ONLINE
20 2 3 /u01/app/oracle/oradata/LHR11G/undotbs01.dbf ONLINE
21 4 4 /u01/app/oracle/oradata/LHR11G/users01_test2.dbf ONLINE
22 6 5 /u01/app/oracle/oradata/LHR11G/example01.dbf ONLINE
23
24SYS@LHR11G>复制
方法4:12c新特性
不同于以往的版本,在Oracle数据库12c R1版本中对数据文件的迁移或重命名不再需要太多繁琐的步骤。在12c R1中,可以使用ALTER DATABASE MOVE DATAFILE
这样的SQL语句对数据文件进行在线重命名和移动。而当此数据文件正在传输时,终端用户可以执行查询,DML以及DDL方面的任务。另外,数据文件可以在存储设备间迁移,如从非ASM迁移至ASM,反之亦然。
重命名数据文件:
1SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users01.dbf' TO '/u00/data/users_01.dbf';
复制
从非ASM迁移数据文件至ASM:
1SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '+DG_DATA';
复制
将数据文件从一个ASM磁盘群组迁移至另一个ASM磁盘群组:
1SQL> ALTER DATABASE MOVE DATAFILE '+DG_DATA/DBNAME/DATAFILE/users_01.dbf ' TO '+DG_DATA_02';
复制
在数据文件已存在于新路径的情况下,以相同的命名将其覆盖:
1SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '/u00/data_new/users_01.dbf' REUSE;
复制
复制文件到一个新路径,同时在原路径下保留其拷贝:
1SQL> ALTER DATABASE MOVE DATAFILE '/u00/data/users_01.dbf' TO '/u00/data_new/users_01.dbf' KEEP;
复制
当通过查询v$session_longops动态视图来移动文件时,你可以监控这一过程。另外,你也可以引用alert.log,Oracle会在其中记录具体的行为。
1SELECT a.USERNAME,
2 (SELECT upper(nb.OSUSER) FROM v$session nb WHERE nb.SID = a.sid) OSUSER,
3 (SELECT nb.sid || ',' || nb.SERIAL# || ',' || pr.SPID
4 FROM v$process pr, v$session nb
5 WHERE nb.PADDR = pr.ADDR
6 and nb.sid = a.SID
7 and nb.SERIAL# = a.SERIAL#) session_info,
8 a.opname,
9 to_char(a.START_TIME, 'YYYY-MM-DD HH24:MI:SS') start_time,
10 round(a.SOFAR * 100 / a.TOTALWORK, 2) || '%' AS progress,
11 a.TIME_REMAINING TIME_REMAINING,
12 a.elapsed_seconds elapsed_seconds,
13 message message,
14 (SELECT nb.EVENT FROM V$session_Wait nb WHERE nb.SID = a.SID) wait_event,
15 (SELECT nb.STATUS FROM v$session nb WHERE nb.SID = a.SID) STATUS
16 FROM v$session_longops a
17 WHERE a.time_remaining <> 0
18 ORDER BY status, a.TIME_REMAINING DESC, a.SQL_ID, a.sid;复制
需要注意的是,在12c中,移动数据文件必须进入到相关的容器中才可以,否则会报错“ORA-01516: nonexistent log file, data file, or temporary file "12" in the current container”
1SYS@ORCLCDB> col name format a60
2SYS@ORCLCDB> set pagesize 9999
3SYS@ORCLCDB> select ts#,file#,name,status from v$datafile d ;
4
5 TS# FILE# NAME STATUS
6---------- ---------- ------------------------------------------------------------ --------------
7 0 1 /opt/oracle/oradata/ORCLCDB/system01.dbf SYSTEM
8 1 3 /opt/oracle/oradata/ORCLCDB/sysaux01.dbf ONLINE
9 2 4 /opt/oracle/oradata/ORCLCDB/undotbs01.dbf ONLINE
10 0 5 /opt/oracle/oradata/ORCLCDB/pdbseed/system01.dbf SYSTEM
11 1 6 /opt/oracle/oradata/ORCLCDB/pdbseed/sysaux01.dbf ONLINE
12 4 7 /opt/oracle/oradata/ORCLCDB/users01.dbf ONLINE
13 2 8 /opt/oracle/oradata/ORCLCDB/pdbseed/undotbs01.dbf ONLINE
14 0 9 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/system01.dbf SYSTEM
15 1 10 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/sysaux01.dbf ONLINE
16 2 11 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/undotbs01.dbf ONLINE
17 5 12 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf ONLINE
18
1911 rows selected.
20
21SYS@ORCLCDB>
22SYS@ORCLCDB> ALTER DATABASE MOVE DATAFILE 12 TO '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01_test.dbf';
23 ALTER DATABASE MOVE DATAFILE 12 TO '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01_test.dbf'
24*
25ERROR at line 1:
26ORA-01516: nonexistent log file, data file, or temporary file "12" in the current container
27
28
29SYS@ORCLCDB> select ts#,file#,name,status,con_id from v$datafile d ;
30
31 TS# FILE# NAME STATUS CON_ID
32---------- ---------- ------------------------------------------------------------ -------------- ------
33 0 1 /opt/oracle/oradata/ORCLCDB/system01.dbf SYSTEM 1
34 1 3 /opt/oracle/oradata/ORCLCDB/sysaux01.dbf ONLINE 1
35 2 4 /opt/oracle/oradata/ORCLCDB/undotbs01.dbf ONLINE 1
36 0 5 /opt/oracle/oradata/ORCLCDB/pdbseed/system01.dbf SYSTEM 2
37 1 6 /opt/oracle/oradata/ORCLCDB/pdbseed/sysaux01.dbf ONLINE 2
38 4 7 /opt/oracle/oradata/ORCLCDB/users01.dbf ONLINE 1
39 2 8 /opt/oracle/oradata/ORCLCDB/pdbseed/undotbs01.dbf ONLINE 2
40 0 9 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/system01.dbf SYSTEM 3
41 1 10 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/sysaux01.dbf ONLINE 3
42 2 11 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/undotbs01.dbf ONLINE 3
43 5 12 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf ONLINE 3
44
4511 rows selected.
46
47SYS@ORCLCDB> show pdbs
48
49 CON_ID CON_NAME OPEN MODE RESTRICTED
50---------- ------------------------------ ---------- ----------
51 2 PDB$SEED READ ONLY NO
52 3 ORCLPDB1 READ WRITE NO
53SYS@ORCLCDB> alter session set container=orclpdb1;
54
55Session altered.
56
57SYS@ORCLCDB> ALTER DATABASE MOVE DATAFILE 12 TO '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01_test.dbf';
58
59Database altered.
60
61SYS@ORCLCDB> select ts#,file#,name,status,con_id from v$datafile d ;
62
63 TS# FILE# NAME STATUS CON_ID
64---------- ---------- ------------------------------------------------------------ -------------- ------
65 0 9 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/system01.dbf SYSTEM 3
66 1 10 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/sysaux01.dbf ONLINE 3
67 2 11 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/undotbs01.dbf ONLINE 3
68 5 12 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01_test.dbf ONLINE 3
69
70SYS@ORCLCDB> exit
71Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
72Version 19.3.0.0.0
73ll[oracle@lhrora19c ~]$ ll /opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01_*
74-rw-r----- 1 oracle oinstall 5251072 Nov 14 16:54 /opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01_test.dbf复制
有关ASM数据文件和文件系统文件互相转换的方法
ASM数据文件和OS文件系统互相转移方法总结
总结
1、若是12c,则可以在线直接操作
2、若是11g,请严格按照步骤来操作,在offline后记得执行recover操作
3、最最重要的一点:在移动数据文件之前,一定记得先查看目的地是否有重名的数据文件,否则会导致数据文件物理覆盖,造成不可恢复的损失!!!! 已碰到网友出现过此类情况!!!