劉 偉
(武漢鐵路局 信息技術(shù)處 ,武漢 430071)
技術(shù)與方法
Oracle表空間限額技術(shù)細(xì)節(jié)
劉 偉
(武漢鐵路局 信息技術(shù)處 ,武漢 430071)
針對一例用戶表空間限額引起的應(yīng)用故障,分析Oracle 11g表空間限額的技術(shù)細(xì)節(jié)。
表空間;用戶;限額
Oracle 數(shù)據(jù)庫管理員幾乎天天都要關(guān)心數(shù)據(jù)庫表空間的使用狀況,其中包括表空間的使用率以及用戶所占表空間限額的情況。本文描述了一例由用戶表空間限額引起的應(yīng)用故障,在處理的過程中,Oracle表空間限額的技術(shù)細(xì)節(jié)逐步呈現(xiàn)出來。
某日中午 12:45,某鐵路信息系統(tǒng)維護(hù)人員接到用戶的故障報告,稱該系統(tǒng)數(shù)據(jù)不再更新。應(yīng)用系統(tǒng)維護(hù)人員立即排查故障,15 min 后系統(tǒng)自動恢復(fù)正常。數(shù)日后相同的故障又再次出現(xiàn),這次故障沒有在 15 min 內(nèi)恢復(fù),應(yīng)用系統(tǒng)維護(hù)人員立即聯(lián)系Oracle 數(shù)據(jù)庫管理員共同排查故障。
第1步,查看該應(yīng)用系統(tǒng)的日志文件,發(fā)現(xiàn)了報錯,如圖1所示。
圖1 系統(tǒng)日志文件的報錯信息
第 2 步,查看該應(yīng)用的 Oracle 11g 數(shù)據(jù)庫中有哪些用戶使用該表空間,發(fā)現(xiàn)該表空間的從屬對象中包含用戶A,但是用戶A對該表空間限額卻是‘無’。立即更改用戶A對該表空間限額為‘無限制’,隨后該應(yīng)用系統(tǒng)恢復(fù)正常。
看似很簡單的一個問題,但是有兩個疑問需要去解決。(1)在創(chuàng)建用戶 A 時,使用的是如下語句 :
CREATE USER A IDENTIFIED BY "********" DEFAULT TABLESPACE "X_TS" QUOTA UNLIMITED ON "X_TS" ;
該語句表明已經(jīng)為用戶 A 在表空間 X_TS 限額上賦予了‘無限制’的權(quán)限,可是現(xiàn)在為什么查詢到的表空間限額卻是‘無’?
(2)在第 1 次應(yīng)用系統(tǒng)報錯時,為什么 15 min自動恢復(fù)了,而后又再次報錯。用戶A對該表空間限額是‘無’,為什么系統(tǒng)會自動恢復(fù)正常。什么情況下會恢復(fù)正常,什么情況下又再次報錯?
針對問題(1),數(shù)據(jù)庫管理人員仔細(xì)翻查了數(shù)據(jù)庫的日志文件,發(fā)現(xiàn)曾對用戶A做過以下操作:
grant connect, resource to A;
revoke unli-mited tablespace from A;
為了發(fā)現(xiàn)用戶配額的變化,數(shù)據(jù)庫管理人員分別在 Oracle 9i、Oracle 10g、Oracle 11g 3 個實驗機(jī)上利用創(chuàng)建用戶 A 的腳本創(chuàng)建了用戶 test,它使用的表空間為 test_ts。這 3 個實驗機(jī)上,用戶 test創(chuàng)建后,顯示它對表空間 test_ts 的限額是‘無限制’。在執(zhí)行“grant connect , resource to test”語句后,3 個實驗機(jī)都顯示用戶 test對表空間 test_ts 的限額是‘無限制’,并且它對所有其他表空間限額也是‘無限制’。接下來執(zhí)行“revoke unlimited tablespace from test”語句后,結(jié)果則出現(xiàn)了不同。Oracle 9i、Oracle 10g兩臺實驗機(jī)顯示用戶 test對表空間 test_ts 的限額依然是‘無限制’,而 Oracle 11g 實驗機(jī)顯示用戶 test對表空間 test_ts 的限額卻是‘無’。
實 驗 表 明 Oracle 11g 在 用 戶 對 表 空 間 限 額 的處 理上 發(fā) 生 了 變 化。revoke 語 句收 回的 不僅 僅是ulimited tablespace 權(quán)限,連在創(chuàng)建用戶時指定的表空間限額也一并收回。Ulimited tablespace 權(quán)限是在將 resource 角色賦予用戶時,一并賦予用戶的 ;需要指出的是,unlimited tablespace 權(quán)限并不包括在resource 角色中。
針對問題(2),數(shù)據(jù)庫管理員查詢了數(shù)據(jù)庫日志以及用戶A的定時任務(wù),發(fā)現(xiàn)發(fā)生故障當(dāng)日的13:00,用戶 A 有一個清理表數(shù)據(jù)的定時任務(wù)。清理出來的空間與表空間限額的關(guān)系究竟是怎樣的,也通過了一個測試來尋找答案。
第 1 步 :在一臺 Oracle 11g 的實驗機(jī)上使用如下語句創(chuàng)建了表空間 test_ts,用戶 test,以及用戶test下的表 test_table:
第 2 步 :創(chuàng)建一個腳本 insert_test.sql
第 3 步 :在用戶 test下執(zhí)行完腳本 insert_test. sql后,revoke 用戶 test的 unlimited tablespace 權(quán)限。
第 4 步 :在用戶 test下多次執(zhí)行腳本 insert_test. sql, 直 到 數(shù) 據(jù) 庫 報 表 空 間 限 額 錯 誤。 查 詢 此 時test_table 的行數(shù)。
第 5 步 :執(zhí)行 truncate table test_table 語句。
第 6 步 :執(zhí)行 insert into test_table values(1),查看數(shù)據(jù)庫是否報表空間限額錯誤。
第7步:若第6步?jīng)]有報錯,則再次執(zhí)行第4步操作。比對兩次記錄下的 test_table 行數(shù)是否一致。
第 4 步記錄表 test_table 的行數(shù)為 3 300 行 ;且用戶 test只用了表空間 test_ts 空間的 0.1 %。第 6 步的實驗結(jié)果顯示數(shù)據(jù)‘1’插入成功,并沒有報表空間限額錯誤。第 7 步記錄表 test_table 的行數(shù)為 3 300行,用戶 test仍然只用了表空間 test_ts 空間的 0.1%。再次執(zhí)行第 5、6、7 步,記錄表 test_table 的行數(shù)為 3 300 行,用戶 test還是只用了表空間 test_ts空間的 0.1 %。實驗數(shù)據(jù)表明 :在 Oracle 11g 中,當(dāng) revoke 了用戶的表空間限額后,對于之前用戶占有的空間并不收回,同時也不會再分配該用戶其他空間。依據(jù)這個結(jié)論,問題(2)得到了解釋 :第 1 次發(fā)生故障的 15 min 后,由于清理表數(shù)據(jù)的定時任務(wù)啟動,所以用戶A可以再次寫入新數(shù)據(jù),當(dāng)寫滿了已分配的數(shù)據(jù)塊,而又無法分配到新的數(shù)據(jù)塊則再次報錯。
Oracle 表空間限額操作不多,作用卻很大。隨著 Oracle 數(shù)據(jù)庫版本的升級,它的技術(shù)細(xì)節(jié)也發(fā)生了變化。只有捕捉這些技術(shù)細(xì)節(jié),才能在信息系統(tǒng)開發(fā)、維護(hù)中減少出錯的可能,保證系統(tǒng)的穩(wěn)定運行。
[1] Oracle Corporation. Oracle Database Concepts 11g Release 2[Z] . Oracle Press, 2010.
責(zé)任編輯 方 圓
Technical details of Oracle tablespace quota
LIU Wei
( Department of Information Technology, Wuhan Railway Administration, Wuhan 430071, China )
This paper analyzed technical details of Oracle 11g tablespace quota with the example of a fault caused by user tablespace quota.
tablespace; user; quota
U29∶TP39
:A
1005-8451(2015)01-0053-02
2014-02-17
劉 偉,工程師。