一、問題描述
在往空間數據庫拷貝數據的時候,發生了ORA-01653的錯誤,提示信息如下:
這主要是因為表空間不足引起的,出現這種表空間不足的問題一般有兩種情況:一種是表空間的自動擴展功能沒有開;另一種是空間確實不夠用了,已經達到了自動擴展的上限。
所以我們解決問題的步驟就是先查看Oracle數據庫表空間大小,然后看一下表空間下的所有的數據文件的自動擴展功能是否打開;若確實是表空間不夠用了,那么我們就需要擴大表空間了。
二、表空間信息查看
通過下面語句,可以查看當前表空間使用情況。
1: SELECT a.tablespace_name "表空間名稱",
2: a.bytes / 1024 / 1024 "表空間大小(M)",
3: (a.bytes - b.bytes) / 1024 / 1024 "已使用空間(M)",
4: b.bytes / 1024 / 1024 "空閑空間(M)",
5: round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "使用比"
6: FROM (SELECT tablespace_name, sum(bytes) bytes
7: FROM dba_data_files
8: GROUP BY tablespace_name) a,
9: (SELECT tablespace_name, sum(bytes) bytes, max(bytes) largest
10: FROM dba_free_space
11: GROUP BY tablespace_name) b
12: WHERE a.tablespace_name = b.tablespace_name
13: ORDER BY ((a.bytes - b.bytes) / a.bytes) DESC
其中:
"表空間大小(M)"
表示表空間所有的數據文件總共在操作系統占用磁盤空間的大小。比如:USER_DATA表空間有2個數據文件,datafile1為300MB,datafile2為400MB,那么USER_DATA表空間的"表空間大小"就是700MB。
"已使用空間(M)"
表示表空間已經使用了多少。
"空閑空間(M)"
表示表空間剩余多少。
"使用比"
表示已經使用的百分比。 比如從上一步驟中查看到SDE表空間已使用百分比達到90%以上,可以查看該表空間總共有幾個數據文件,每個數據文件是否自動擴展,可以自動擴展的最大值。
注意語句中的SDE必須使用大寫。
1: SELECT file_name,
2: tablespace_name,
3: bytes / 1024 / 1024 "bytes MB",
4: maxbytes / 1024 / 1024 "maxbytes MB"
5: FROM dba_data_files
6: WHERE tablespace_name = 'SDE';
查看表空間是否為自動擴展
1: SELECT file_id, file_name, tablespace_name, autoextensible, increment_by
2: FROM dba_data_files
3: WHERE tablespace_name = 'SDE'
4: ORDER BY file_id desc;
查看"AUTOEXTENSIBLE"對應的值是YES還是NO,若是NO,說明表空間的自動擴展功能沒有開,改成YES就可以了。
對於空間數據,最好將自動增長漲幅設置稍微大一些,否則在一些特殊情況下仍然會出現問題。
1: ALTER DATABASE DATAFILE 'D:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\DATABASE\SDE' AUTOEXTEND ON NEXT 10M
三、表空間
如果需要對表空間進行擴容,可以直接在PLSQL中通過執行語句的方式進行對表空間的擴展。
擴大表空間又分兩種做法:一種是增大數據文件大小,一種是增加數據文件數量。
首先找出該表空間對應的數據文件及路徑,該路徑對應FILE_NAME字段。注意這里的路徑最好通過此方式獲取,不一定是本地指定存儲目錄下存儲的DBF文件。
1: SELECT * FROM dba_data_files t WHERE t.tablespace_name='SDE';
1:增大數據文件
alter database datafile '全路徑的數據文件名稱' resize ***M;
增加對應的表空間里面的某個數據文件的大小為***M。
例如在我本機:
1: alter database datafile 'D:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\DATABASE\SDE' resize 1024M;
2:增加數據文件
獲取創建表空間的語句:
1: SELECT dbms_metadata.get_ddl('TABLESPACE', 'SDE') FROM dual;
alter tablespace 表空間名稱 add datafile '全路徑的數據文件名稱' size ***M
autoextend on maxsize 20G;
新增一個數據文件,全路徑的數據文件名稱為該新增數據文件的全路徑文件名稱。大小為***M,自動擴展功能打開,且該數據文件的最大擴展值為20G。
驗證已經增加的數據文件
1: SELECT file_name, file_id, tablespace_name
2: FROM dba_data_files
3: WHERE tablespace_name = 'SDE'
如果刪除表空間數據文件
altertablespace 表空間名稱
DROP datafile '/u01/app/oracle/product/10.2.0/oradata/orcl/SDE.dbf '
說明:表空間一般讓空閑百分比保持在10%以上,且數據文件大小最好不要超過2G。當表空間不足時,要么resieze datafile,要么增加datafile。