在日常工作中,我们经常会遇到诸如空间被回收、某个磁盘损坏或者需要更换的情况。这个时候,往往需要我们将数据文件转移到其他存储位置上。本篇主要介绍常用的两种处理手段,权当记录,供自己和有需要的朋友不时之需。
1、环境准备
我们选择11g进行试验。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE11.2.0.1.0Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 – Production
创建一个实验的表空间用于测试。
SQL> create tablespace mvtbltest datafile '/u01/oradata/WILSON/datafile/mvtbltest01.dbf' size 10m autoextend off
2extent management local uniform. size 1m
3segment space management auto;
Tablespace created
SQL> col file_name for a45;
SQL> select file_name, tablespace_name from dba_data_files where tablespace_name='MVTBLTEST';
FILE_NAMETABLESPACE_NAME
--------------------------------------------- ------------------------------
/u01/oradata/WILSON/datafile/mvtbltest01.dbfMVTBLTEST
创建一些实验对象。
SQL> create table t tablespace mvtbltest as select * from dba_objects ;
Table created
SQL> select tablespace_name, bytes from dba_segments where wner='SYS' and segment_name='T';
TABLESPACE_NAMEBYTES
------------------------------ ----------
MVTBLTEST9437184
我们通过mvtbltest表空间进行试验。
常用的处理方法有两个,一个是在线online进行文件的rename操作,另一个是需要停库,在启动过程中进行rename操作。
2、Online文件重命名操作
首先我们进行online的文件重命名。首先,我们需要明确,无论是online还是停库操作,表空间文件都会有一定时间不能使用。两者的差异在于是否会影响到其他表空间使用。
第一步,我们需要将表空间进行offline操作,此时所有文件对象将不能被访问。
SQL> alter tablespace mvtbltest offline;
Tablespace altered
SQL> select count(*) from t;
select count(*) from t
ORA-00376:此时无法读取文件10
ORA-01110:数据文件10: '/u01/oradata/WILSON/datafile/mvtbltest01.dbf'
第二步,需要在操作系统层面进行文件的拷贝操作。此时,最推荐的是使用mv命令操作。如果没有把握而且空间不紧张,copy也是比较稳妥的方案。
[oracle@bspdev ~]$ cd /u01/oradata/WILSON/datafile/
[oracle@bspdev datafile]$mv mvtbltest01.dbf /u01/oradata/WILSON/
[oracle@bspdev datafile]$ ls -l | grep mv
[oracle@bspdev datafile]$ cd ..
[oracle@bspdev WILSON]$ ls -l | grep mv
-rw-r----- 1 oracle oinstall 10493952 Apr 23 05:38 mvtbltest01.dbf
第三步,修改表空间对应文件的连接。
SQL> select file_name, status, online_status from dba_data_files where tablespace_name='MVTBLTEST';
FILE_NAMESTATUSONLINE_STATUS
--------------------------------------------- --------- -------------
/u01/oradata/WILSON/datafile/mvtbltest01.dbfAVAILABLE OFFLINE
SQL> alter tablespace mvtbltest rename datafile '/u01/oradata/WILSON/datafile/mvtbltest01.dbf' to '/u01/oradata/WILSON/mvtbltest01.dbf';
Tablespace altered
SQL> select file_name, status, online_status from dba_data_files where tablespace_name='MVTBLTEST';
FILE_NAMESTATUSONLINE_STATUS
--------------------------------------------- --------- -------------
/u01/oradata/WILSON/mvtbltest01.dbfAVAILABLE OFFLINE
最后,将表空间进行online操作。
SQL> alter tablespace mvtbltest online;
Tablespace altered
SQL> select count(*) from t;
COUNT(*)
----------
72722
应该说,online文件重命名是很简单的操作。过程消耗时间主要在OS层面的文件拷贝。
3、停库文件重命名
停库文件重命名是另一种情况。在进行数据还原(从冷备份)过程中,我们经常需要在启动过程中进行文件信息的替换。
我们首先进行停库处理。
SQL> conn / as sysdba
Connected.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
在OS层面进行文件拷贝。
[oracle@bspdev WILSON]$ ls -l | grep mv
-rw-r----- 1 oracle oinstall 10493952 Apr 23 05:55 mvtbltest01.dbf
[oracle@bspdev WILSON]$mv mvtbltest01.dbf /u01/oradata/WILSON/datafile/mvtbltest01.dbf
[oracle@bspdev WILSON]$ ls -l | grep mv
[oracle@bspdev WILSON]$ cd datafile/
[oracle@bspdev datafile]$ ls -l | grep mv
-rw-r----- 1 oracle oinstall10493952 Apr 23 05:55 mvtbltest01.dbf
[oracle@bspdev datafile]$
重新启动数据库,进入mount状态。
SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup mount
ORACLE instance started.
Total System Global Area849530880 bytes
Fixed Size1339824 bytes
Variable Size587206224 bytes
Database Buffers255852544 bytes
Redo Buffers5132288 bytes
Database mounted.
SQL>
使用rename file命令进行转换。
SQL> alter database rename file '/u01/oradata/WILSON/mvtbltest01.dbf' to '/u01/oradata/WILSON/datafile/mvtbltest01.dbf';
Database altered.
最后成功启动数据库。
SQL> alter database open;
Database altered.
SQL> select count(*) from t;
COUNT(*)
----------
72722
4、结论
数据文件重命名是一个很简单的过程,伴随着OS层面和控制文件之间的协调处理。在很多业务处理场景下,很有意义。