關於ORA-01536 報錯的幾種場景:
關於ORA-01536 報錯的幾種場景:
我們都知道unix 或linux下都可以限制某個使用者使用磁碟空間,避免造成空間佔用100%引發系統事故,
oracle也可以實現該功能,就是透過指定使用者對某些表空間的配額quota來實現的。一旦超過配額上限,
就會報ORA-01536,下面的幾個場景就來介紹一下。
場景1:使用者quota不足
sqlplus / as sysdba
drop user test cascade;
create user test identified by abcdefg;
alter user test quota 1m on users ;
grant create session to test;
grant create table to test;
檢視配額情況:
select username, tablespace_name,bytes, max_bytes from dba_ts_quotas where username = 'TEST';
USERNAME TABLESPACE_NAME BYTES MAX_BYTES
------------------------------------------------------------
TEST USERS 1048576 1048576 <<1M
插入資料:
create table test.test_t as select * from dba_objects ;
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'USERS'
上述結果可以看到,因為我們只給了test使用者使用users表空間1m的配額,
所以插入大量資料就會報錯,因為錯誤明顯,檢查dba_ts_quotas就可以解決。
場景2:遞迴cursor
sqlplus / as sysdba
grant dba to maob;
SQL> select username, tablespace_name,bytes, max_bytes from dba_ts_quotas where username = 'MAOB';
no rows selected
上述可以看到這個檢視只能查詢到顯式賦予配額的使用者和大小,我們給maob使用者賦予dba之後,在配額表裡面是沒有任何記錄的,這是因為dba的role在起作用,
SQL> select * from session_privs WHERE PRIVILEGE LIKE '%UNLIMIT%' ;
PRIVILEGE
--------------------------------------------------------------------------------
UNLIMITED TABLESPACE
檢視當前session 的確是有UNLIMITED的quota的許可權的
sqlplus maob/abcdefg
create table maob.test_t2 as select * from dba_objects where 1=2;
create table test.test_t2 as select * from dba_objects where 1=2;
grant all on test.test_t2 to public ;
CREATE OR REPLACE TRIGGER maob.test_trg
BEFORE INSERT OR DELETE OR UPDATE
ON maob.test_t2 FOR EACH ROW
BEGIN
INSERT INTO test.test_t2(object_id,object_name) values(:new.object_id,:new.object_name);
END;
/
SQL> insert into maob.test_T2 select * from dba_objects;
insert into maob.test_T2 select * from dba_objects
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'USERS'
ORA-06512: at "MAOB.TEST_TRG", line 3
ORA-04088: error during execution of trigger 'MAOB.TEST_TRG'
上述可以看到,雖然maob使用者是對任何表空間不限制quota的,但是因為trigger的原因,
導致操作了test使用者下的表,而test使用者是有quota限制的,所以會報錯,不過這個根據報錯
資訊trigger也很容易定位原因。
場景3:錯誤的使用索引,在其他使用者下建立索引
sqlplus maob/abcdefg
create table test_t3 as select * from dba_objects where 1=2;
==在使用者test下的索引卻指向本使用者的表
sqlplus test/abcdefg
create index test.i3 on maob.test_t3( object_name,owner,OBJECT_ID,DATA_OBJECT_ID,OBJECT_TYPE,CREATED ) tablespace users;
sql>insert into maob.test_T3 select * from dba_objects;
SQL> SQL> insert into maob.test_T3 select * from dba_objects;
insert into maob.test_T3 select * from dba_objects
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'USERS'
這個報錯就會讓人很奇怪,因為通常情況下在生產系統上類似test_t3業務表,owner是不會被限制quota的,而且
dba通常進一步檢查dba_ts_quotas和系統許可權就能很快排除可能性,但是卻很容易忽略物件上的索引造成問題,
因為的確很少有人在B使用者下建索引卻指向A使用者的表,往往都是有人錯誤操作造成的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2141798/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於索引空間的重用的幾個場景索引
- redis常見的幾種使用場景Redis
- 事物系統的幾種異常場景
- 幾種場景的資料庫恢復資料庫
- 關於各種List型別特點以及使用的場景型別
- PHP 併發場景的幾種解決方案PHP
- 關於AI、關於chatGPT的幾十種用法AIChatGPT
- spring事務失效的幾種場景以及原因Spring
- git 忽略檔案的幾種方式以及應用場景Git
- 沉浸式空間場景的使用有哪幾種方式?
- 開發中的幾種加密演算法的使用場景加密演算法
- 關於OpenAI GPT-3幾個也許很有用的場景案例 - datamahadevOpenAIGPTdev
- 關於3d場景重建3D
- 一文搞懂,這幾種 API 的不同應用場景API
- Python透過函式名呼叫函式的幾種場景Python函式
- 關於Android的幾種事件處理Android事件
- 基於多種場景DataGuard切換方案
- 8個Spring事務失效的場景,你碰到過幾種?Spring
- sudo命令使用的幾個場景
- 面試場景題:一次關於執行緒池使用場景的討論。面試執行緒
- 關於java獲取本地ip的幾種方法Java
- vscode中關於eslint的各種報黃線錯誤VSCodeEsLint
- 背事故?分享 6 種常見的 Go 致命錯誤場景Go
- NIO是什麼?適用於何種場景?
- 關於Ajax和websocket的區別以及使用場景!Web
- Java中關於OOM的場景及解決方法JavaOOM
- 關於@override報錯的問題IDE
- 關於 Laravel 佇列報錯Laravel佇列
- C語言中幾種報錯型別的解決方案C語言型別
- CCE叢集VPC網路模式下幾種訪問場景模式
- max場景瘦身,加快場景的開啟速度(多種方法)
- 關於SAP-EXCEL的幾種常用輸出方式Excel
- Shell 中 $ 關於指令碼引數的幾種用法指令碼
- Handler的三種互動場景
- 關於iOS中的執行緒安全和使用場景iOS執行緒
- Java中關於OOM的場景及解決方法(轉)JavaOOM
- SparkSQL中產生笛卡爾積的幾種典型場景以及處理策略SparkSQL
- 關於weblogic老報NoClassDefFoundError錯WebError