04.12.2011-ora-01653

[1]

http://www.google.com.hk/search?q=%E5%A4%84%E7%90%86+ora-01653&hl=en&safe=active&prmd=ivns&ei=CM-jTe3UCIGGvgPay-2HCg&start=10&sa=N

[2]

http://space.itpub.net/15149581/viewspace-673902

http://www.database8.com/ORA_thread-1072-1-1.html

增加多个数据文件,对应同一个表空间。

http://qingzuochen.iteye.com/blog/577257

对应的sqlplus操作语句:
alter tablespace WAPI add datafile '/home/**/**/wapiraextend.dbf' size 256m;

其实自己确切用的语句是:
alter tablespace WAPI add datafile 'wapiraextend' size 256m;
只是这个不知道文件会创建到哪..没去找规律

[3]

http://www.iteye.com/topic/859729

六、扩展表空间



首先查看表空间的名字和所属文件


select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;

1.增加数据文件
ALTER TABLESPACE game
ADD DATAFILE '/oracle/oradata/db/GAME02.dbf' SIZE 1000M;

2.手动增加数据文件尺寸
ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf'
RESIZE 4000M;

3.设定数据文件自动扩展
ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf
AUTOEXTEND ON NEXT 100M
MAXSIZE 10000M;


设定后查看表空间信息


SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND

A.TABLESPACE_NAME = C.TABLESPACE

[4]

http://blog.csdn.net/zzr173/archive/2009/07/24/4377426.aspx

表扩展失败(ORA-01653)后的空间管理问题 收藏

这两天在公司做ORACLE10G的DATAGUARD测试的时候,发现表扩展报错后,后续的一些空间问题。
测试环境中,建了一个500M的TABLESPACE命名为TEST。
导入一张表(TEST_ALL)有280多万的数据,然后建立了有建立了一个同样结构的表TEST1,进行批量插入操作。

SQL> insert into test1 select * from test_all;

ORA-01653: unable to extend table TEST.TEST1 by 1024 in tablespace TEST


这是个较为常见的错误,就是TABLESPACE没有空间了。以下为ORACLE给出的错误解释和解决方法。
10635, 00000, "Invalid segment or tablespace type"
// *Cause: Cannot shrink the segment because it is not in auto segment space
// managed tablespace or it is not a data, index or lob segment.
// *Action: Check the tablespace and segment type and reissue the statement


因为我的表空间没有设置自动增长,所以会有错误报出。但是接下来的问题就很有意思了。我们发现虽然插入操作失败,但是其所占的空间并没有自动收回!我的测试环境中,TEST1表一直占用184M左右的表空间。并且无论我发ROLLBACK,COMMIT,关闭当前SESSION甚至重新启动数据库,这个TEST1表一直会占用着184M的表空间!
我只能手工TRUNCATE TABLE或者MOVE的方法来消减这张表占用的空间。
有意思的是,当我利用ORACLE10G的新方法来试图回缩所占用的空间时,ORACLE报错并且错的让我“找不到北”。如下:

SQL> alter table test1 shrink space cascade;

alter table test1 shrink space cascade

ORA-10635: Invalid segment or tablespace type


这个10635错误也是一个比较典型的错误,ORACLE给出的官方解释:

10635, 00000, "Invalid segment or tablespace type"
// *Cause: Cannot shrink the segment because it is not in auto segment space
// managed tablespace or it is not a data, index or lob segment.
// *Action: Check the tablespace and segment type and reissue the statement


当时我以为自己没有使用ORACLE的ASSM,但是经过确认自己建表空间的SQL,发现我使用的是ASSM的,但还是害怕有问题,对另外一张TEST_ALL的表进行操作,结果正常。


SQL> alter table test.test_all shrink space cascade;

Table altered

Executed in 10.859 seconds


看上去ORACLE报的这个错误也“驴唇不对马嘴”了。让我已经久已不用的MOVE命令关键时刻还是有点作用的。
这占用的表空间只是会造成空间的浪费吗,还是有其他副作用的。我先后做了两个COUNT的SQL,其显示的执行结果比较清楚的说明了这个问题。
第一个COUNT的SQL是没有执行TRUNCATE TABLE命令前的,如下
SQL> select count(*) from test1;

COUNT(*)
----------
0


Execution Plan
----------------------------------------------------------
Plan hash value: 3896847026

--------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5135 (1)| 00:01:02 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| TEST1 | 1 | 5135 (1)| 00:01:02 |
--------------------------------------------------------------------

Note
-----
- dynamic sampling used for this statement


Statistics
----------------------------------------------------------
6 recursive calls
2 db block gets
23641 consistent gets
0 physical reads
228 redo size
410 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed


第二个COUNT的SQL是在执行MOVE TABLE后来完成的
SQL> select /*truncate*/count(*) from test1;

COUNT(*)
----------
0


Execution Plan
----------------------------------------------------------
Plan hash value: 3896847026

--------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| TEST1 | 1 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------

Note
-----
- dynamic sampling used for this statement


Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
410 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed


第二句要明显好于第一句。性能上还有有差别的。即TEST1表的HWM是上升的。
接下来另外一个问题就出现了:如果我可以继续插入的话,空间占用会持续增加吗即HWM会持续增加吗?如果是的话,这样导致的性能问题就大了。然后我正常插入了32000条数据,空间占用没有变化。为了防止是因为空间限制造成空间占用不增加,我调大了表空间到600M,结果相同。即空间占用仍为184M。还好,ORACLE没有犯错误。现在比较两种情况。
情况一:在不回缩空间占用的情况下,执行COUNT(*)

SQL> SELECT /*320000*/ COUNT(*) FROM TEST1 WHERE OWNER='SYS';

COUNT(*)
----------
140216


Execution Plan
----------------------------------------------------------
Plan hash value: 3896847026

----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 17 | 5144 (1)| 00:01:02 |
| 1 | SORT AGGREGATE | | 1 | 17 | | |
|* 2 | TABLE ACCESS FULL| TEST1 | 158K| 2628K| 5144 (1)| 00:01:02 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("OWNER"='SYS')

Note
-----
- dynamic sampling used for this statement


Statistics
----------------------------------------------------------
6 recursive calls
1 db block gets
23639 consistent gets
0 physical reads
176 redo size
413 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed


第二种情况,先进行空间收缩,然后进行COUNT查询。这次使用SHRINK操作,ORACLE没有报错。回缩后,TEST1表空间占用31.8M

SQL> SELECT /*shrinked*/ count(*) from test1 where owner='SYS';

COUNT(*)
----------
140216


Execution Plan
----------------------------------------------------------
Plan hash value: 3896847026

----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 17 | 890 (2)| 00:00:11 |
| 1 | SORT AGGREGATE | | 1 | 17 | | |
|* 2 | TABLE ACCESS FULL| TEST1 | 137K| 2288K| 890 (2)| 00:00:11 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter("OWNER"='SYS')

Note
-----
- dynamic sampling used for this statement


Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4008 consistent gets
0 physical reads
0 redo size
413 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed


不难发现性能上,第二句还是有非常大的优势的。


[5]

http://zdeyuan.blog.163.com/blog/static/422636552010827111532381/

ORA-01653: unable to extend table CHEN.T_SHF_PRODUCT_MOVE_PSNUM by 12137 in tablespace (转载)

数据库 2010-09-27 11:15:32 阅读44 评论0
字号:大中小
订阅


Oracle8.1.7在AIX4.3.3下,应用程序在处理数据过程中,当插入某个大数据表ywty_lsls时,报Ora-1653 错误,提示表空间不够,具体提示是:

ORA-01653:unbale to extend table GAPS.YWTY_LSLS by 138304 in tablespace但是,却查到此用户下的数据表空间还有10G,当时,感觉可能是碎片太多了,于是,使用alter tablespace gapsdata add.......
增加了3G的表空间,再次运行应用程序时还是报相同的错误!但是,把ywty_lsls中的最前面的70万条记录删除后(此表共有450万条记录),却可以顺利到执行,也不再提示Ora-1653错误!
针对这一问题,我找到了相关的参数资料

可用于:表空间、回滚段、表、索引、分区、快照、快照日志参数名称 缺省值 最小值 最大值 说明
INITIAL 5(数据块) 2(数据块) 操作系统限定 分配给Segment的第一个Extent的大小,以字节为单位,这个参数不能在alter语句中改变,如果指定的值小于最小值,则按最小值创建。
NEXT 5(数据块) 1(数据块) 操作系统限定 第二个Extent的大小等于NEXT的初值,以后的NEXT值=前一NEXT大小乘以(1+PCTINCREASE/100),如果指定的值小于最小值,则按最小值创建。
如果在alter语句中改变NEXT的值,则下一个分配的Extent将具有指定的大小,而不管上一次分配的Extent大小和PCTINCREASE参数值。
MINEXTENTS 1(Extent)
回滚段为2个Extent 1(Extent)
回滚段为2个Extent 操作系统限定 Segment第一次创建时分配的Extent数量
MAXEXTENTS 根据数据块大小而定 1(Extent)
回滚段为2个Extent 无限制 随着Segment中数据量的增长,最多可分配的Extent数量
PCTINCREASE 50%
(Oracle816中为0%) 0% 操作系统限定 指定第三个及其后的Extent相对于上一个Extent所增加的百分比,
如果PCTINCREASE为0,则Segment中所有新增加的Extent的大小都相同,等于NEXT的值,
如果PCTINCREASE大于0,则每次计算NEXT的值(用上面的公式),
PCTINCREASE不能为负数。
创建回滚段时,不可指定此参数,回滚段中此参数固定为0。
OPTIMAL ---- 不能小于回滚段初始分配空间 操作系统限定 仅与回滚段有关,当回滚段因为增长、扩展而超过此参数的设定范围时,Oracle系统会根据情况动态地重新分配Extents,试图收回多分配的Extent。

FREELISTS 1 1 数据块大小限制 只能在CREATE TABLE、CLUSTER、INDEX中指定FREELISTS和FREELIST GROUPS参数。
模式对象中每一个自由列表组中自由列表的数量
FREELIST GROUPS 1 1 取决于Oracle并行实例的数量 用户创建的数据库对象的自由列表组的数量,只有用OPS并行服务器选项时才使用这一参数,一个实例对应一个组。
BUFFER_POOL ---- ---- ---- 给模式对象定义缺省缓冲池(高速缓存),该对象的所有块都存储在指定的高速缓存中,对于表空间或回滚段无效。



建议PCTINCREASE参数设置为0,可使碎片最小化,使每一个Extent都相同(等于NEXT值)

一旦建立了某个对象,它的INITIAL和MINEXTENTS参数不能修改(Oracle 816中可修改MINEXTENTS参数)

对于NEXT和PCTINCREASE的任何修改都只影响后来分配的那些Extent

在分配一个新Extent时,系统直接按NEXT的值分配一个Extent,
然后用公式:前一NEXT值*(1+PCTINCREASE/100) 计算出下一个应该分配的Extent的大小,
并把计算结果保存到相关数据字典的NEXT_EXTENT列上,做为下一个应该分配的Extent的大小。

CREATE TABLE test(a number)
STORAGE(
INITIAL 100K
NEXT 100K
MINEXTENTS 2
MAXEXTENTS 100
PCTINCREASE 100);

解释:
初始给test表分配两个Extent,
第一个Extent是100K,因INITIAL=100K
第二个Extent是100K,因NEXT=100K
如果因表内数据增长,需要分配第三个Extent,因PCTINCREASE是100,则
第三个Extent是200K=100K+100K
第四个Extent是400K=200K+200K

可通过数据字典表DBA_TABLES、ALL_TABLES、USER_TABLES查看参数设置情况,如:
select table_name,initial_extent,next_extent,min_extents,max_extents,pct_increase from user_tables;

TABLE_NAME INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE
---------- -------------- ----------- ----------- ----------- ------------
TEST 106496 212992 2 100 100
原来这个表的空间问题是跟扩展参数有关,于是,我把我的参数通过如下sql调出来
SELECT * FROM USER_SEGMENTS WHERE SEGMENT_NAME = 'ywty_lsls';
SELECT TABLE_NAME,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS,PCT_INCREASE FROM USER_TABLES;
BYTES BLOCKS EXT INI_EXT NEXT_EXT MIN_EXT MAX_EXT PCT_INC
2266742784 276702 26 40960 1132576768 1 505 50
我试着将PCT_INCREASE 改成0,MAX_EXTENTS 改成 unlimited

ALTER TABLE ywty_lsls STORAGE(MAXEXTENTS UNLIMITED
PCTINCREASE 0);

同理表空间也可以这样改:

alter tablespace JISHU default storage(maxextents unlimited pctincrease 0);

同理索引也可以这样修改:

alter index PK_T_SHF_PRODUCT_MOVE_PSNUM storage(MAXEXTENTS unlimited PCTINCREASE 0);




[6]

http://suan2046.iteye.com/blog/379539

2009-05-05
查看Oracle数据库表空间大小(空闲、已使用),是否要增加表空间的数据文件
关键字: 表空间

Oracle10g10.2.0.1.0
标题:查看Oracle数据库表空间大小,是否需要增加表空间的数据文件

在数据库管理中,磁盘空间不足是DBA都会遇到的问题,问题比较常见。



--1查看表空间已经使用的百分比

Sql代码
select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/1024 "used MB",b.bytes/1024/1024 "free MB",round(((a.bytes-b.bytes)/a.bytes)*100,2) "percent_used"
from
(select tablespace_name,sum(bytes) bytes from dba_data_files group by tablespace_name) a,
(select tablespace_name,sum(bytes) bytes,max(bytes) largest from dba_free_space group by tablespace_name) b
where a.tablespace_name=b.tablespace_name
order by ((a.bytes-b.bytes)/a.bytes) desc





“Sum MB”表示表空间所有的数据文件总共在操作系统占用磁盘空间的大小


比如:test表空间有2个数据文件,datafile1为300MB,datafile2为400MB,那么test表空间的“Sum MB”就是700MB
“userd MB”表示表空间已经使用了多少
“free MB”表示表空间剩余多少
“percent_user”表示已经使用的百分比



--2比如从1中查看到MLOG_NORM_SPACE表空间已使用百分比达到90%以上,可以查看该表空间总共有几个数

据文件,每个数据文件是否自动扩展,可以自动扩展的最大值。
Sql代码
select file_name,tablespace_name,bytes/1024/1024 "bytes MB",maxbytes/1024/1024 "maxbytes MB" from dba_data_files
where tablespace_name='MLOG_NORM_SPACE';

--2.1 查看 xxx 表空间是否为自动扩展


Sql代码
select file_id,file_name,tablespace_name,autoextensible,increment_by from dba_data_files order by file_id desc;





--3比如MLOG_NORM_SPACE表空间目前的大小为19GB,但最大每个数据文件只能为20GB,数据文件快要写满,可以增加表空间的数据文件
用操作系统UNIX、Linux中的df -g命令(查看下可以使用的磁盘空间大小)
获取创建表空间的语句:
Sql代码
select dbms_metadata.get_ddl('TABLESPACE','MLOG_NORM_SPACE') from dual;




--4确认磁盘空间足够,增加一个数据文件
Sql代码
alter tablespace MLOG_NORM_SPACE
add datafile '/oracle/oms/oradata/mlog/Mlog_Norm_data001.dbf'
size 10M autoextend on maxsize 20G






--5验证已经增加的数据文件
Sql代码
select file_name,file_id,tablespace_name from dba_data_files
where tablespace_name='MLOG_NORM_SPACE'





--6如果删除表空间数据文件,如下:


Sql代码
alter tablespace MLOG_NORM_SPACE
drop datafile '/oracle/oms/oradata/mlog/Mlog_Norm_data001.dbf'



转自http://space.itpub.net/12778571/viewspace-582695

posted @ 2011-04-12 13:54  陳聽溪  阅读(479)  评论(0)    收藏  举报