今天遭遇到一个表空间扩展性问题

来源:互联网 发布:解决网络劫持 编辑:程序博客网 时间:2024/06/09 17:45

   今天上午到单位,接到客户的电话说是报表打印无数据。 连到数据库上看统计日志,发现报错   ora-01536 ....错误。根据错误提示,是表空间daf有问题了。

   表空间不够的问题已经很久了,因为新加的磁盘还没有分配,所以最近总是按拆东墙补西墙的方式来扩展表空间。daf这个表空间不够,也是很久以来的事情了。于是今天我采取了以下步骤:

1 登录dba studio,增大daf表空间的数据文件大小。

2 重新执行统计数据的存储过程,但是很遗憾,依然报错 ora-01536

3 于是检查报错的地方是执行一个Insert语句报错,检查insert到的表叫da_db_fix_temp表。

4 检查这个表,发现表的扩展性以及Index的扩展性都是unlimited ,应该没有问题啊。

5 后来又发现next extendt 居然是24M,想是不是因为这个太大了呢?于是将next extendt 的单位从mb修改成kb

6 再次执行统计数据的存储过程,依然很遗憾,继续报错 ora-01536

7 因为da_db_fix_temp是个临时使用的表,每次使用完后数据都要清除,我检查了一下语句,使用的是delete ,想可能是因为delete的问题,于是执行truncate table da_db_fix_temp,结果提示必须使用storage ,于是执行 truncate table da_db_fix_temp drop storage 成功

8 再次执行统计数据的存储过程,依然很遗憾,继续报错 ora-01536

9 快疯掉了,于是仔细看了一下 ora-01536 的说明,如下:

             Cause: The space quota for the segment owner in the tablespace has been exhausted and the operation attempted the creation of a new segment extent in the tablespace.

Action: Either drop unnecessary objects in the tablespace to reclaim space or have a privileged user increase the quota on this tablespace for the segment owner.

10 我忽然意识到这里面提到了Owner,我想是不是和用户的表空间限制有关啊!!立刻检查一看,果然daf这个用户(它的默认表空间是daf)的 system privliage 里面没有 unlimited tablespace 。
11 于是执行 grant unlimited tablespace to daf;
12 再次执行统计数据的存储过程,成功没有报错。
13 但是我忽然想起来,前几天检查用户权限时,daf这个用户是有unlimited tablespace 权限的,不知道为什么忽然没有了?当时daf这个用户具备dba角色,因为想收回dba角色,所以执行了revoke dba from daf 。执行之前,仔细上网搜索了一下收回dba权限的用户,必须具备unlimited tablespace,因为daf已经有了,所以就执行收回了。第2天也没发现什么问题,以为就ok了呢,谁知道还是引起了问题。难道执行 revoke dba from daf 也会将unlimited tablespace权限收回吗??
14 我仔细检查了一下其他几个同时收回dba权限的用户,发现他们的unlimited tablespace权限还在,但是daf的居然没有了,不知道是不是当时误操作给删除了还是怎么回事。。

15 上网搜索了一下,在 http://www.az2007.com/view/45372.html 发现如下描述:
作者:jimmylee    时间:02-07-26 17:04
我终于找到了问题的原因。resouce角色确实拥有unlimited tablespace系统权限,但原来nowuser拥有的角色是connect、resource、dba,当revoke dba from nowuser时,将unlimited tablespace权限也给revoke回去了,不知道是oracle的一个bug还是有意如此。我发现oracle817上也是如此。
谢谢各位的解答。
作者:rejoice999    时间:02-07-27 00:08
 ....
这不是BUG,就是这样的。
另外你说RESOURCE拥有UNLIMITED TABLESPACE是不准确的。
这个系统权限不是包含在RSOURCE ROLE之中,而是GRANT
RESOURCE或DBA时,系统同是给这个用户UNLIMITED TABLESPACE权限,当REVOKE RESOURCE或REVOKE DBA时,
就会同时收回UNLIMITED TABLESPACE。如果这个权限包含在
ROLE中是不会有这个效果的。

 

 由此看来,我是遇上了难得一遇的问题了,oracle的细枝末节有太多猫腻了:)

原创粉丝点击