忘卻Oracle的5個方面

 
新版本可以給軟件帶來更高效率的技術現在我們可以忘卻Oracle數據庫的5個方面。
1.只有DBA可以恢復數據
以SQL數據庫——DBAs直接工作的人們以及IT資訊人員都可以因爲一個不匹配的命令而導致數據庫的破壞或者數據的丟失。事實上,對於Oracle,用戶的錯誤操作是導致數據庫停止工作的主要原因。從數據庫而不是開發過程得到的一個表單可以造成程序及其所有用戶操作的癱瘓。而且,一個不合適的更新也有可能破壞數據庫操作的結果。
直到現在,從這些錯誤中恢復數據是一個極其耗時的差事,並且只有DBA可以實現。但自從Oracle 9i以來,用戶可以通過SQL命令來修正很多這樣的錯誤。其中的機制是引入了新的Oracle 9i的名爲閃回查詢(Flashback Query)的特性。
這裏是一個在SCOTT schema中操作的範例。範例中,一個職工記錄被刪除,並提交更改結果:
DELETE FROM emp WHERE empno = 7934;
COMMIT;
代碼行丟失了SELECT語句,而且一個ROLLBACK也不能恢復這一行。然而,一個閃回查詢可以顯示10分鐘之前的表單內容:
SELECT * FROM emp
AS OF TIMESTAMP (SYSTIMESTAMP – INTERVAL '10' MINUTE)
WHERE empno = 7934;
SELECT語句可以使用INSERT語句的子查詢來載入被刪除的數據。然而,請注意到,這一INSERT操作必須受限於表單中的約束。
爲了將整個會話返回到特定的時間,可以使用DBMS_FLASHBACK包:
EXEC DBMS_FLASHBACK.ENABLE_AT_TIME(TIMESTAMP ‘yyyy-mm-ddhh:mi:ss’);
在一個閃回查詢過程中,被訪問的數據不能被更改,只能被讀取。這有點象科幻小說中的時間追蹤:你可以訪問過去,但你不改變過去。爲了獲得過去的會話,可以鍵入:
EXEC DBMS_FLASHBACK.DISABLE;
爲了使得閃回查詢得以工作,數據庫必須使用自動刪除管理(AUM, Automated Undo Management),並建立一個刪除表。用戶可以“閃回”的時間限度取決於undo_retention參數和刪除表大小的初始化。
雖然這一特性對於IT諮詢者來說是福音,但是Oracle的主要目的是使得用戶直接鍵入SQL就可以從他或她的錯誤中得以恢復。閃回查詢是一個很好的功能,所以它可以通過系統權限來恢復單一表單或者所有表單。
FLASHBACK ANY TABLE
但是你還可以等待:在Oracle 10g會做得更好。在9i版本中,閃回查詢受限於數據操作語言(DML,Data Manipulation Language)命令,比如SELECT, INSERT, UPDATE, and DELETE。但在10g中,即使一個dropped表也可以通過閃回來恢復。
2.Oracle不能保存小數點的時間
Oracle的DATE數據類型只能以秒來存儲時間數據。需要更精確時間的開發人員只能使用NUMBER數據類型。這一操作使得時間間隔的計算更加困難。
自從9i版本之後,Oracle包含了一個與1999 SQL相互兼容的時間/日期數據類型。爲了聲明諸如一個時間列,可以使用TIMESTAMP數據類型,並顯示需要的小數點個數(缺省情況下爲6):
CREATE TABLE event_ts (
event_id NUMBER(6)
,event_name VARCHAR2(40)
,start_time TIMESTAMP(2)
,elapsed_time TIMESTAMP(2)
);
對於一個TIMESTAMP字面意義,比如DATE,必須被一個單引號包括。以下的字面代表着March 23, 2004,在午夜的半秒時刻:
TIMESTAMP ‘2004-03-23 00:00:00.50’
雖然標準的DATE字面意義沒有包含時間,而一個TIMESTAMP字面意義的標準格式卻需要包含時間。NLS_TIMESTAMP_FORMAT參數控制格式,同樣,NLS_DATE_FORMAT設定了標準DATE格式。一個新的轉換函數,即TO_TIMESTAMP,可以從其它輸入格式建立一個TIMESTAMP,並且TO_CHAR函數可用於顯示一個TIMESTAMP的組成。
爲了以TIMESTAMP格式獲得當前日期和時間,可以使用SYSTIMESTAMP函數,而不是使用SYSDATE函數,例如:
SELECT SYSTIMESTAMP FROM DUAL;
3.一個損壞的塊就需要放棄一個對象
IT資訊人員最害怕這樣的Oracle錯誤信息,即ORA-1578,“Oracle data block corrupted(Oracle數據塊損壞)”。其中一個數據庫塊的內部結構將不能被修正。信息可以通過文件數量和塊數量來識別塊的錯誤。一般而言,補救的方法通過運行以下這樣的查詢:
SELECT owner, segment_name, segment_type
FROM dba_extents
WHERE file_id =
AND BETWEEN block_id AND block_id + blocks - 1;
這裏,爲從錯誤信息得到的數量。這一查詢可得到哪些對象包含被損壞的塊。然後就可以恢復這些損壞的塊,然而這些恢復要麼是直接的(對於索引和臨時成分),要麼是混亂的(對於表單),要麼是十分混亂的(對於動態的roolback部分和部分數據字典)。
然而,在Oracle 9i Enterprise Edition中,一個名爲BLOCKRECOVER的恢復管理器(RMAN)的命令,可以正確地修正這些塊,而不需要放棄和重新建立所涉及的對象。當進入RMAN並連接到目標數據庫之後,鍵入:
BLOCKRECOVER DATAFILE BLOCK ;
一個新的查看,名爲V$DATABASE_BLOCK_CORRUPTION,可以使得在RMAN備份過程中獲得更新,並且當執行一個BLOCKRECOVER時,可以列出塊的內容。爲了恢復所有被損壞的塊,可以使用以下的RMAN:
BACKUP VALIDATE DATABASE;
BLOCKRECOVER CORRUPTION LIST;
如果只需要恢復幾個塊,這一方法非常有用。對於大規模的損壞塊,需要重新存儲數據文件的一個先前圖像,然而恢復整個數據文件,這樣效率更加高。對於任何新的特性,在使用到正式的數據庫之前,請認真地測試,這是有必要的。

4. 列不能被重命名或者重新組織
重新命名一個表格的列或者改變它的數據類型,通常這意味着建立一個新的表格和複製舊的數據到新表格。列根本不能重新命名,數據類型只有在沒有數據(只能爲NULL數值)時才能被改變。
Oracle 9i具有兩種方法以克服這些限制。現在,ALTER TABLE命令可以直接地重新命名列:
ALTER TABLE books RENAME COLUMN tiitle TO title;
同樣,一個名爲DBMS_REDEFINITION的PL/SQL工具包可以使一個DBA改變表格的列結構。這是一個複雜的過程,但通常情況下遵循以下的步驟即可實現:
1 使用DBMS_REDEFINITION.CAN_REDEF_TABLE來檢查表格滿足在線的重新定義,並指定重新定義是否遵循主要的鍵或者遵循行Ids。
2在相同規劃中建立一個空表格,但結構是一樣的。省略你想要放棄的列,包含你想要建立的新的列。
3使用DBMS_REDEFINITION.START_REDEF_TABLE來開始重新定義過程。這一過程的參數說明了舊的表格,新的表格,以及如何將現成的列映射到新表格的列。
4建立任一約束,索引。
5使用DBMS_REDEFINITION.FINISH_REDEF_TABLE來完成這一過程。當重新定義在兩個表格之間交換時,無論原來表格的大小,都必須將表格鎖定爲一小段時間。
6. 放棄在重新定義中使用的臨時表格,而不再使用它。
當然,重新定義一個表格不會自動地更新任何可以訪問表格的程序代碼。程序必須分開地更新和調試。然而,DBMS_REDEFINITION does所可以做的就是縮短時間,這正是用戶的需求。
5.只有表格的主人才能分配使用權限
當我提到Oracle安全特性時,客戶都無法相信DBA不能將使用權限分配給表格,除非表格的主人已經將其分配給DBA。然而,在以前就是這樣的情況。這些限制是Oracle設計的一部分,但它使管理更加困難。在Oracle 9i,一個新的系統權限改變了這一點。
現在的DBA具具備一個名爲GRANT ANY OBJECT PRIVILEGE的系統權限。在過去,一個如此的語句
GRANT SELECT ON scott.emp TO giselle;
都會無法通過,除非SCOTT已經將DBA 的SELECT權限分配給他的表格 WITH GRANT OPTION。現在,相同的語句卻可以正確運行。
保持忘卻狀態
正如Visa的創始人Dee Hock所說的,“問題不是你如何去獲得創新的思想,而是如何去忘卻舊的東西。”所以,請保持忘卻狀態。

0

收藏

cicizz

23篇文章,3W+人氣,0粉絲

Ctrl+Enter 發佈

發佈

取消

0

分享
cicizz
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章