ORA-01536的分析和解决



ORA-01536 space quota exceeded for tablespace '%s'
超出了表空间users的空间配额限量

[oracle@oraserv ~]$ oerr ora 01536
01536, 00000, "space quota exceeded for tablespace '%s'"
// *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.


Solution:
=================
select owner, tablespace_name, table_name
    from dba_tables
 where tablespace_name = '<TABLESPACENAME>';

先查看用户的表空间的限额

select * from dba_ts_quotas;
select * from user_ts_quotas;

max_bytes字段-1是代表没有限制,其它值多少就是多少.

dba_ts_quotas :描述所有用户表空间的限额
user_ts_quotas :描述当前用户表空间的限额。

如果查询结果中max_bytes字段不为-1,修改为无限制或者指定的大小。因此解决方法如下:
1) 增加配额:
alter user <USERNAME> quota <size_M> on <TABLESPACENAME>

2) 赋予unlimited配额:
不对用户做表空间限额控制:
    GRANT UNLIMITED TABLESPACE TO <USERNAME>;
这种方式是全局性的。  
或者
    alter user  <USERNAME> quota unlimited on  <TABLESPACENAME>;
 这种方式是针对特定的表空间的.

回收表空间限额控制:
    revoke unlimited tablespace from  <USERNAME>;
或者
    alter user  <USERNAME> quota 0 on  <TABLESPACENAME>;

如果还不能解决问题,需要注意当前用户的角色。
当给用户授权RESOURCE或DBA角色时,Oracle会顺便将UNLIMED TABLESPACE权限授权给用户,一旦回收其中任意一个角色,会同时将该权限收回。

记得曾经有一个案例:
一个线上数据库报这个错误,是因为dba先进行了grant dba,然后又revoke dba,按理说revoke dba后其他已经赋予用户的权限都应该还在。
通过查询:
select* from dba_sys_privs where grantee='<USERNAME>';
grant resource to <USERNAME>;

但事实上回收revoke dba后发现只少了"UNLIMITED TABLESPACE"权限,问题就是出在这里!revoke dba后应再赋予一次resource角色。


你可能感兴趣的:(ORA-01536的分析和解决)