需求:把用户的某一个表空间中的数据文件由于某种原因从一个路径移动到里一个路径
原因:
(1)当前实例中的表空间文件及系统表空间文件全在一块硬盘上,导致IO增加。装数据库表空间移走。减少IO。
(2)磁盘空间有限,这个磁盘空间太小了,随着数据的增长,需要换一块大的磁盘
可行性:linux的文件都是通过挂载,到一个目录下,磁盘的移动就只是文件路径的改变。

实现此方法有两种方法
1.alter tablespace
(1)查看要改变的这个表空间所对应的数据文件信息
SQL> select tablespace_name,file_name from dba_data_files where tablespace_name='MAIL';

TABLESPACE_NAME                FILE_NAME
------------------------------ --------------------------------------------------------------------------------
MAIL                           /u01/app/oracle/oradata/orcl/mail.dbf

(2)使表空间脱机

SQL> alter tablespace mail offline;

表空间已更改。

SQL> select tablespace_name,file_name,online_status from dba_data_files where tablespace_name='MAIL';

TABLESPACE_NAME                FILE_NAME                                                                        ONLINE_STATUS
------------------------------ -------------------------------------------------------------------------------- -------------
MAIL                           /u01/app/oracle/oradata/orcl/mail.dbf                                            OFFLINE

(3)把原来的数据文件复制到新的路径
SQL> host cp '/u01/app/oracle/oradata/orcl/mail.dbf' '/home/oracle/mail01.dbfdbf'

(4)修改数据文件名字,路径。(注意:实际就是修改控制文件,告诉控制文件这个表空间的数据文件改变了)
SQL> alter tablespace mail rename datafile '/u01/app/oracle/oradata/orcl/mail.dbf' to '/home/oracle/mail01.dbfdbf';

表空间已更改。
(5)表空间在线
SQL> alter tablespace mail online;

(6) 查看表空间对应的数据文件状态

SQL>  select tablespace_name,file_name,online_status from dba_data_files where tablespace_name='MAIL';

TABLESPACE_NAME                FILE_NAME                                                                        ONLINE_STATUS
------------------------------ -------------------------------------------------------------------------------- -------------
MAIL                           /home/oracle/mail01.dbfdbf                                                       ONLINE

注意:此方法仅适用于能offline的表空间,仅适用于普通的表空间,系统表空间不行。
而sysaux表空间可以用此方法实现

SQL> select tablespace_name,file_name from dba_data_files where tablespace_name='SYSAUX';

TABLESPACE_NAME
------------------------------
FILE_NAME
--------------------------------------------------------------------------------
SYSAUX
/u01/app/oracle/oradata/orcl/sysaux01.dbf

SQL> alter tablespace sysaux offline;

表空间已更改。

SQL> host cp '/u01/app/oracle/oradata/orcl/sysaux01.dbf' '/home/oracle/test.dbf';


SQL> alter tablespace sysaux rename datafile '/u01/app/oracle/oradata/orcl/sysaux01.dbf' to '/home/oracle/test.dbf';

表空间已更改。

SQL> alter tablespace sysaux online;

表空间已更改。

SQL>  select tablespace_name,file_name from dba_data_files where tablespace_name='SYSAUX';

TABLESPACE_NAME
------------------------------
FILE_NAME
--------------------------------------------------------------------------------
SYSAUX
/home/oracle/test.dbf

2.alter database 适用于系统表空间,system,temp,undo
(1)一致性关闭数据库并启动到mount状态
SQL> shutdown immediate
SQL> startup mount
(2)复制数据文件
SQL> host cp '/u01/app/oracle/oradata/orcl/system01.dbf' '/home/oracle/test.dbf';
(3)修改控制文件。注意,只有在数据库打开的情况下,才有tablespace的概念,所有此时操作database中的file。
SQL> alter database rename file '/u01/app/oracle/oradata/orcl/system01.dbf' to '/home/oracle/test.dbf';

数据库已更改。
(4)打开数据库
SQL> alter database open;
(5)查看system表空间数据文件状态
SQL>  select tablespace_name,file_name,online_status from dba_data_files where tablespace_name='SYSTEM';

TABLESPACE_NAME                FILE_NAME                                                                        ONLINE_STATUS
------------------------------ -------------------------------------------------------------------------------- -------------
SYSTEM                         /home/oracle/test.dbf                                                            SYSTEM