N 多年前安裝的 oracle 數據庫,巡檢的時候發現磁盤滿了,檢查發現是數據文件占用了很大的空間,當前存放數據文件的磁盤不能再進行擴容,于是準備把業務數據文件遷移到其他磁盤分區。
遷移數據文件主要有兩種方法:
- alter database rename file ··· to ···
- alter tablespace ··· rename datafile ··· to ···
這兩種方法都可以遷移數據文件,但是操作上有些不同,主要體現在以下方面:
方法1:數據庫必須處于mount狀態,該方法適用于所有的數據文件,包括 system 數據文件;- 方法2:與方法1不同,此時數據庫必須處于open狀態,且該方法只適用于非 system 表空間的數據文件。
接下來以遷移TS01表空間的數據為例,分別使用兩種不同的方法進行操作:
一、使用alter database rename file ··· to ···
首先,查看當前數據文件路徑:
SQL> select FILE_NAME,TABLESPACE_NAME from dba_data_files;
FILE_NAME TABLESPACE
-------------------------------------------------- ----------
/u01/app/oracle/oradata/orcl/system01.dbf SYSTEM
/u01/app/oracle/oradata/orcl/sysaux01.dbf SYSAUX
/u01/app/oracle/oradata/orcl/undotbs01.dbf UNDOTBS1
/u01/app/oracle/oradata/orcl/users01.dbf USERS
/u01/app/oracle/oradata/orcl/ts01.dbf TS01
SQL>
在新的磁盤分區上創建新的數據文件存放路徑,并授予相應的用戶權限:
[root@orcldb ~]# /u02/app/oracle/oradata/orcl
[root@orcldb ~]# chown -R oracle:oinstall /u02
關閉數據庫,并拷貝文件:
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> host cp /u01/app/oracle/oradata/orcl/ts01.dbf /u02/app/oracle/oradata/orcl/
將數據庫啟動到mount狀態,并對數據文件進行重命名操作:
SQL> startup mount
ORACLE instance started.
Total System Global Area 2147483648 bytes
Fixed Size 8622776 bytes
Variable Size 1325403464 bytes
Database Buffers 805306368 bytes
Redo Buffers 8151040 bytes
Database mounted.
SQL>
SQL> alter database rename file '/u01/app/oracle/oradata/orcl/ts01.dbf' to '/u02/app/oracle/oradata/orcl/ts01.dbf';
Database altered.
打開數據庫,并查看數據文件的狀態,結果顯示,表空間TS01的數據文件已經在新的路徑下了:
SQL> alter database open;
Database altered.
SQL>
SQL> select file_name,tablespace_name,status from dba_data_files;
FILE_NAME TABLESPACE STATUS
-------------------------------------------- ---------- ---------
/u01/app/oracle/oradata/orcl/system01.dbf SYSTEM AVAILABLE
/u01/app/oracle/oradata/orcl/sysaux01.dbf SYSAUX AVAILABLE
/u01/app/oracle/oradata/orcl/undotbs01.dbf UNDOTBS1 AVAILABLE
/u01/app/oracle/oradata/orcl/users01.dbf USERS AVAILABLE
/u02/app/oracle/oradata/orcl/ts01.dbf TS01 AVAILABLE
查詢表空間中表的數據,用于驗證數據的完整性:
SQL> select owner,table_name,tablespace_name from dba_tables where tablespace_name='TS01';
OWNER TABLE_NAME TABLESPACE
------ ---------- ----------
HARRY EMP TS01
SQL>
SQL> SELECT * FROM HARRY.EMP;
ID USERNAME AGE
---------- ------------------ ----------
1 張三 22
結果顯示數據完好沒有丟失,接下來可以在系統中刪掉原來的文件從而釋放存儲空間:
[root@orcldb ~]# rm -rf /u01/app/oracle/oradata/orcl/ts01.dbf
二、使用alter tablespace ··· rename datafile ··· to ···
還是以TS01表空的數據為例,再把數據遷移回原來的路徑。
首先在EMP表中插入一條新的數據:
SQL> insert into EMP values (2,'李四',20);
1 row created.
SQL> select * from EMP;
ID USERNAME AGE
---------- -------------------------------- ----------
1 張三 22
2 李四 20
將TS01表空間offline:
SQL> alter tablespace TS01 offline normal;
Tablespace altered.
SQL>
將表空間的數據文件拷貝回原來的位置(這里省略了目標位置的用戶權限設置):
SQL> host cp /u02/app/oracle/oradata/orcl/ts01.dbf /u01/app/oracle/oradata/orcl/;
使用alter tablespace命令rename datafile到目標位置:
SQL> alter tablespace TS01 rename datafile '/u02/app/oracle/oradata/orcl/ts01.dbf' to '/u01/app/oracle/oradata/orcl/ts01.dbf';
Tablespace altered.
將目標表空間進行online操作,并檢查數據文件路徑:
SQL> alter tablespace TS01 online;
Tablespace altered.
SQL> select FILE_NAME,TABLESPACE_NAME from dba_data_files;
FILE_NAME TABLESPACE
--------------------------------------------- ----------
/u01/app/oracle/oradata/orcl/system01.dbf SYSTEM
/u01/app/oracle/oradata/orcl/sysaux01.dbf SYSAUX
/u01/app/oracle/oradata/orcl/undotbs01.dbf UNDOTBS1
/u01/app/oracle/oradata/orcl/users01.dbf USERS
/u01/app/oracle/oradata/orcl/ts01.dbf TS01
驗證表空間的數據,查詢表數據沒有異常:
SQL> select * from EMP;
ID USERNAME AGE
---------- -------------------------------- ----------
1 張三 22
2 李四 20
最后在系統中刪掉原來的文件從而釋放存儲空間:
[root@orcldb ~]# rm -rf /u02/app/oracle/oradata/orcl/ts01.dbf