數(shù)據(jù)庫失敗類型之用戶錯誤
數(shù)據(jù)庫失敗的類型分為幾大類。對于每種失敗來說,Oracle都會提供適當(dāng)?shù)慕鉀Q方法。
所有失敗類型最好被記錄在一個服務(wù)級別協(xié)議內(nèi),同時在程序手冊中還要記錄解決失敗的相關(guān)步驟。
第四種失敗類型:用戶錯誤
就Oracle而言,所關(guān)心的是事務(wù)。對于DML錯誤來說,用戶在提交之前發(fā)現(xiàn)錯誤時仍然有機(jī)會回滾錯誤的語句。但是對于DDl語句來說,用戶是無法回滾錯誤的語句。
因為,commit被內(nèi)置到DDL語句中。
解決用戶錯誤的理想方式是首先防止這些錯誤的出現(xiàn)。培訓(xùn)用戶只是其中的一部分工作,不過最重要的是設(shè)計軟件。從而使任何用戶進(jìn)程都不允許用戶執(zhí)行不存在where子句的update語句。然而設(shè)計最完美的軟件也沒法防止用戶發(fā)出與指定業(yè)務(wù)不相符的sql語句。Oracle為修正用戶錯誤的dba提供了許多可用的方法,不過使用這些方法通常極為困難,尤其是用戶錯誤在一段時間內(nèi)未被報告時更是如此。可能的技術(shù)包括閃回查詢,閃回刪除,閃回數(shù)據(jù)庫和不完全恢復(fù)。
閃回查詢時針對過去某時存在的數(shù)據(jù)庫所運(yùn)行的查詢。通過使用撤銷數(shù)據(jù),可以只為當(dāng)前會話構(gòu)造讀一致性的數(shù)據(jù)庫。
如下:有一位用戶不小心刪除了emp表中的所有行,并提交了刪除操作,那么隨后通過針對5分鐘之前的表執(zhí)行子查詢檢索這些行。
SQL> delete from emp; 15 rows deleted. SQL> commit; Commit complete. SQL> select count(*) from emp; COUNT(*) ---------- 0 SQL> insert into emp (select * from emp as of timestamp(sysdate-5/1440)); 15 rows created. SQL> select count(*) from emp; COUNT(*) ---------- 15 (2)利用閃回刪除來恢復(fù)被刪掉的表 如下: SQL> drop table emp; Table dropped. SQL> select count(*) from emp; select count(*) from emp * ERROR at line 1: ORA-00942: table or view does not exist SQL> flashback table emp to before drop; Flashback complete. SQL> select count(*) from emp; COUNT(*) ---------- 15 |
對于撤銷用戶錯誤來說,不完全恢復(fù)與閃回數(shù)據(jù)庫是作用更為顯著的方法。使用上述任一種方法,整個數(shù)據(jù)庫會返回發(fā)生錯誤前的時刻。前面介紹的其他方法在保持?jǐn)?shù)據(jù)庫其他部分不發(fā)生變化的情況只撤銷錯誤的事務(wù)。但是,一旦執(zhí)行了數(shù)據(jù)庫的不完全恢復(fù)或閃回操作,就會失去從返回到的時刻開始的所有工作,而不僅僅失去錯誤的事務(wù)。