在測試系統恢復數據時報錯如下:
ORA-39171: 作業出現可恢復的等待。
ORA-01658: 無法為表空間 NNC_DATA01 中的段創建 INITIAL 區
處理對象類型 SCHEMA_EXPORT/TABLE/TABLE_DATA
ORA-39171: 作業出現可恢復的等待。
ORA-01653: 表 NC0731.SM_BUSILOG_DEFAULT 無法通過 32 (在表空間 NNC_DATA01 中) 擴展
ORA-39171: 作業出現可恢復的等待。
初步判斷是因為名為NNC_DATA01的表空間不足導致,查看對應的數據文件,發現馬上要到32G了,所以報錯。
Oracle單個數據文件超過32G后需要擴容
解決思路
- 查看表空間使用情況等信息
SQL> select file_name,tablespace_name,round(bytes/(1024*1024)) from dba_data_files;
一般來說,單個數據文件最大為32G,我的結果顯示其中一個表空間的數據文件已經達到32G了,所以新建用戶默認使用的是這個表空間,空間不足就會造成數據無法導入,需要更換表空間或者增加數據文件。
- 查看用戶與表空間的關系
SQL> SELECT USERNAME,ACCOUNT_STATUS,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE,CREATED FROM DBA_USERS WHERE ACCOUNT_STATUS = 'OPEN';
注:查詢用戶名,狀態,默認表空間,默認臨時表空間,創建日期
找到上面32G的數據文件對應的表空間,然后看這個表空間上有哪些用戶。就像這個測試系統,開發需要多個用戶,所以導致表空間不夠用。
- 查找哪個用戶占用表空間最大
select *
from (select owner || '.' || tablespace_name name, sum(b) g
from (select owner,
t.segment_name,
t.partition_name,
round(bytes / 1024 / 1024 / 1024, 2) b,
tablespace_name
from dba_segments t)
where owner not in
('SYS', 'OUTLN', 'SYSTEM', 'TSMSYS', 'DBSNMP', 'WMSYS')
group by owner || '.' || tablespace_name)
order by name
解決方案
一、新增數據文件
SQL> select file_name,tablespace_name,round(bytes/(1024*1024)) from dba_data_files;
--找到爆滿的表空間以及對應的數據文件的位置。
SQL> alter tablespace NNC_DATA01 add datafile 'D:\oradata\ncdb\NNC_DATA02.DBF' size 200M autoextend on next 50M maxsize unlimited;
/*
新增一個數據文件到表空間,數據文件可以放到同一個系統目錄下,方便管理。
數據文件初始大小為200M,自動擴展,最大不限制,也就是最大是32G
*/
二、將備份數據恢復到新的表空間
SQL> create tablespace test_data logging datafile 'e:\oradata\test_data.dbf' size 1024m autoextend on next 200m maxsize 30000M extent management local;
-- 創建新的表空間
SQL> create temporary tablespace test_temp tempfile 'e:\oradata\test_temp.dbf' size 1024m autoextend on next 200m maxsize 30000m extent management local;
--創建新的臨時表空間
SQL> create user test123 identified by test123 default tablespace test_data temporary tablespace test_temp;
--創建用戶,并指定表空間與臨時表空間。如果要導入數據,不要忘了授權哦。
SQL>SELECT USERNAME,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE FROM DBA_USERS WHERE USERNAME= 'TEST123';
--查看用戶表空間與臨時表空間
三、刪除爆滿表空間上之前的用戶
SQL> select file_name,tablespace_name,round(bytes/(1024*1024)) from dba_data_files;
--找到爆滿的表空間以及對應的數據文件的位置。
select *
from (select owner || '.' || tablespace_name name, sum(b) g
from (select owner,
t.segment_name,
t.partition_name,
round(bytes / 1024 / 1024 / 1024, 2) b,
tablespace_name
from dba_segments t)
where owner not in
('SYS', 'OUTLN', 'SYSTEM', 'TSMSYS', 'DBSNMP', 'WMSYS')
group by owner || '.' || tablespace_name)
order by name
--查看哪個用戶占用的表空間最大
SQL> drop user test123 cascade;
--刪除用戶及用戶下的數據