在测试系统恢复数据时报错如下:
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;
--删除用户及用户下的数据
网友评论