1. 程式人生 > >關於ORA-1658錯誤和使用者表空間配額

關於ORA-1658錯誤和使用者表空間配額

如圖四川網省在匯入總部匯出的DMP檔案中報1658錯誤,但是經過查詢,表空間的使用率才10%,最後查明的使用者空間配額給的太小造成的問題。

使用者表空間配額與使用者表空間是完全不一樣的概念:如果對使用者進行了表空間配額限制,哪怕使用者就算擁有再大的表空間也只能使用被限制的那部分大小的表空間。

預設情況下使用者對所有表空間都是沒有配額限制的,即不受空間限制。

建立使用者時指定表空間限額:

CREATE USER SG_ODS IDENTIFIED BY SG_ODS
DEFAULT TABLESPACE ODSVIEW
TEMPORARY TABLESPACE temp
QUOTA 1000M ON ODSVIEW;--執行使用者的表空間配額

如何檢視某使用者是否有表空間限額:

在此可以使用dba_ts_quotas和use_ts_quotas來查詢,select * from quotas,如果max_bytes欄位是-1則代表沒有表空間限額,如果有不為-1的值則代表有此值大小的表空間限額,單位是B。

說道表空間限額不得不說一下unlimited tablespace許可權,該許可權屬於系統許可權:

1.首先是一個爭議,unlimited tablespace許可權是否包含在resources和dba角色中,有人說是隱含在這兩個角色中,有人說不包含在這兩個角色中。本人認為是隱含在這兩個角色中的。

2.unlimited tablespace許可權可以授予使用者,但是不能被授予角色。

3.unlimited tablespace許可權不會隨著resources和dba角色授予其他角色而被授予使用者,例如我有一個角色SGOMCW,我將resources角色授予SGOMCW,然後我再把SGOMCW角色授予omcw_app使用者,你會發現unlimited tablespace許可權沒有被授予omcw_app使用者(假設omcw_app使用者設定了配額)。

對於修改使用者的表空間限額有三種辦法。

1.alter user USERNAME quota 50M on TABLESPACENAME;

這種是對使用者的表空間限額進行重新修正。

2.alter user USERNAME quota unlimited on TABLESPACENAME; 

第二種是針對特定表空間來進行修正,使使用者在該表空間上沒有配額限制。

3.grant unlimited tablespace to USERNAME;

當授予使用者該許可權時,會覆蓋所有單個表空間的配額,此時使用者擁有了對所有表空間的無限制配額,當然也包括system和sysaux表空間,這樣比較危險。

如何回收配額?

第一種和第二種的可以使用:alter user username quota 0 on tablespacename;來進行回收。

第三種可以使用 revoke unlimited tablespace from username; 來進行回收

待編輯。