正在開會,同事跑過來講數據庫有問題,通信程序不能入庫,趕快獲取一條insert into a values()語句後在toad工具中手動插入,發現報錯:Ora-01536:超出了表空間users的空間限量。html
該表a的是用戶A下的一個大表,表空是users,而非A用戶的默認表空間。users表空間有大約70%的空閒空間,爲何a表就不能使用了呢?從網上搜索後終於明白:數據庫
ora-1536 是指的你建表的那個user 所能使用的空間沒有了,不是那個表所在的tablespace 沒有free space 了。你須要作的是給那個user 對那個tablespace 有更多的space 可使用。oracle
解決辦法增大可以使用的表空間數或授予無限制的使用權限工具
ALTER USER A QUOTA 50M ON users;post
ALTER USER A QUOTA UNLIMITED ON users;測試
但爲何會出現這樣的問題呢,原來設計的時候用戶A,賦予DBA和resource權限,並無設置表空間限額。但如今怎麼會出現這麼多的空間限額呢?url
會不會是上次更改用戶A的默認表空間形成的呀?spa
上次爲了數據庫便於維護,將用戶A的表從別的表空間移到了表空間中,而後更改表空間TS_A 爲用戶A的默認表空間設計
select 'alter table '||table_name||' move tablespace TS_A ;'htm
from user_tables
where tablespace_name='LEE_TEST' ;
alter user A DEFAULT TABLESPACE TS_A;
把用戶A下的表所有移到表空間TS_A下,但由於a是一個比較大的表,因此沒有移動成功,a的表空間仍然是users;
估計跟此次操做有關係 ,改天進行測試。那天進行移動表的存儲空間時還形成索引無效的錯誤,看來此次操做帶來負面影響仍是真很多。
建立一個用戶,分配了400M的表空間,結果在用到13.3M時報錯:
ORA-01536: 超出表空間 '***' 的空間限額
經查,表空間跟表空間限額兩個值是不同的.
推測按默認的話oracle應該會給每一個用戶分配一個默認的表空間限額,具體比例待查,但這比例確定遠小於100%.
因此說分配了400M的表空間未必能存儲400M的數據.
解決辦法以下:
查看用戶表空間的限額
select * from user_ts_quotas;
max_bytes字段就是了
-1是表明沒有限制,其它值多少就是多少了.
不對用戶作表空間限額控制:
GRANT UNLIMITED TABLESPACE TO ***(用戶);
這種方式是全局性的.
或者
alter user ***(用戶名) quota unlimited on ***(表空間);
這種方式是針對特定的表空間的.
能夠分配天然也能夠回收了:
revoke unlimited tablespace from ***(用戶)
或者
alter user *** quota 0 on ***
表空間的大小與用戶的配額大小是兩種不一樣的概念。表空間的大小是指實際的用戶表空間的大小,而配額大小指的是用戶指定使用表空間的的大小
把表空間文件增大,仍是出現這個問題,用戶在使用表空間的同時使用空間的限額,若是超出限制,就算有空的地方,也不會讓用戶使用。
遇到ORA-01536錯誤,首先要查看用戶的表空間的限額
select * from dba_ts_quotas;
select * from user_ts_quotas;
max_bytes字段-1是表明沒有限制,其它值多少就是多少.
dba_ts_quotas :描述全部用戶表空間的限額
user_ts_quotas :描述當前用戶表空間的限額。
若是查詢結果中max_bytes字段不爲-1,修改成無限制或者指定的大小。
不對用戶作表空間限額控制:
GRANT UNLIMITED TABLESPACE TOuser;
這種方式是全局性的。 或者
alter user user quota unlimited on user_tablespace;
這種方式是針對特定的表空間的.
回收表空間限額控制:
revoke unlimited tablespace from user;
或者
alter user user quota 0 on user_tablespace;