本帖最后由 郑全 于 2017-4-1 17:53 编辑
比如我们的users表空间对应的数据文件和其他数据文件 不在一个位置,觉得维护起来不方便,
如下:
SQL> select name from v$datafile;
NAME
-------------------------------------------------------
D:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF
D:\ORACLE\ORADATA\ORCL\SYSAUX01.DBF
D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF
D:\ORACLE\USERS01.DBF
SQL>
其他文件都在D:\ORACLE\ORADATA\ORCL\,而users数据文件在d:\oracle\,我们想移动该数据文件,12c以前版本,我们在移动之前,必须把这个数据文件必须offline,然后拷贝到目标位置,之后,在修改数据库字典信息,最后,让数据文件在线.如果是windows,还可能出现原始文件无法移动的问题,现在在12c里面,我们只需要一条命令即可以搞定:
会话一:
SQL> conn hr/hr
已连接。
SQL> create table emp tablespace users as select * from employees;
表已创建。
SQL> COL SEGMENT_Name for a30
SQL> select segment_name,tablespace_name from user_segments where segment_name='EMP'
SEGMENT_NAME TABLESPACE_NAME
------------------------------ ------------------------------
EMP USERS
SQL> update emp set salary=salary*1.10 where employee_id=100;
已更新 1 行。
SQL>
会话二:
另外开一个窗口:
SQL> alter database move datafile 'D:\ORACLE\USERS01.DBF' to 'D:\ORACLE\ORADATA\ORCL\USERS01.DBF';
数据库已更改。
SQL> 在看文件,已经移动了,如果看操作系统上,文件也已经移动到新的位置.
SQL> select name from v$datafile;
NAME
-----------------------------------------------------
D:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF
D:\ORACLE\ORADATA\ORCL\SYSAUX01.DBF
D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF
D:\ORACLE\ORADATA\ORCL\USERS01.DBF
再回到会话一:
SQL> select employee_id,salary from emp where employee_id=100;
EMPLOYEE_ID SALARY
----------- ----------
100 26400
SQL> r
1* select employee_id,salary from emp where employee_id=100
EMPLOYEE_ID SALARY
----------- ----------
100 26400
SQL> commit;
提交完成。
SQL>
我们看到,会话一并没有提交事务,可以看出移动数据文件确实是在线作的,不需要在移动数据文件之前,需要把数据文件离线,然后在在线.
|