熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

忘卻Oracle的5個方面

2013-11-13 15:24:56  來源: Oracle 

  新版本可以給軟件帶來更高效率的技術現在我們可以忘卻Oracle數據庫的個方面
  
  只有DBA可以恢復數據
  以SQL數據庫——DBAs直接工作的人們以及IT資訊人員都可以因為一個不匹配的命令而導致數據庫的破壞或者數據的丟失事實上對於Oracle用戶的錯誤操作是導致數據庫停止工作的主要原因從數據庫而不是開發過程得到的一個表單可以造成程序及其所有用戶操作的癱瘓而且一個不合適的更新也有可能破壞數據庫操作的結果
  
  直到現在從這些錯誤中恢復數據是一個極其耗時的差事並且只有DBA可以實現但自從Oracle i以來用戶可以通過SQL命令來修正很多這樣的錯誤其中的機制是引入了新的Oracle i的名為閃回查詢(Flashback Query)的特性
  
  這裡是一個在SCOTT schema中操作的范例范例中一個職工記錄被刪除並提交更改結果
  
  DELETE FROM emp WHERE empno = ;
  COMMIT;
  
  代碼行丟失了SELECT語句而且一個ROLLBACK也不能恢復這一行然而一個閃回查詢可以顯示分鐘之前的表單內容
  
  SELECT * FROM emp
    AS OF TIMESTAMP (SYSTIMESTAMP – INTERVAL MINUTE)
    WHERE empno = ;
  
  SELECT語句可以使用INSERT語句的子查詢來載入被刪除的數據然而請注意到這一INSERT操作必須受限於表單中的約束
  
  為了將整個會話返回到特定的時間可以使用DBMS_FLASHBACK包
  
  EXEC DBMS_FLASHBACKENABLE_AT_TIME(TIMESTAMP yyyymmddhh:mi:ss);
  
  在一個閃回查詢過程中被訪問的數據不能被更改只能被讀取這有點象科幻小說中的時間追蹤你可以訪問過去但你不改變過去為了獲得過去的會話可以鍵入
  
  EXEC DBMS_FLASHBACKDISABLE;
  
  為了使得閃回查詢得以工作數據庫必須使用自動刪除管理(AUM Automated Undo Management)並建立一個刪除表用戶可以閃回的時間限度取決於undo_retention參數和刪除表大小的初始化
  
  雖然這一特性對於IT咨詢者來說是福音但是Oracle的主要目的是使得用戶直接鍵入SQL就可以從他或她的錯誤中得以恢復閃回查詢是一個很好的功能所以它可以通過系統權限來恢復單一表單或者所有表單
  
  FLASHBACK ANY TABLE
  
  但是你還可以等待在Oracle g會做得更好i版本中閃回查詢受限於數據操作語言(DMLData Manipulation Language)命令比如SELECT INSERT UPDATE and DELETE但在g中即使一個dropped表也可以通過閃回來恢復
  
  Oracle不能保存小數點的時間
  Oracle的DATE數據類型只能以秒來存儲時間數據需要更精確時間的開發人員只能使用NUMBER數據類型這一操作使得時間間隔的計算更加困難
  
  自從i版本之後Oracle包含了一個與 SQL相互兼容的時間/日期數據類型為了聲明諸如一個時間列可以使用TIMESTAMP數據類型並顯示需要的小數點個數(缺省情況下為)
  
  CREATE TABLE event_ts (
   event_id NUMBER()
   event_name VARCHAR()
   start_time TIMESTAMP()
   elapsed_time TIMESTAMP()
  );
  
  對於一個TIMESTAMP字面意義比如DATE必須被一個單引號包括以下的字面代表著March 在午夜的半秒時刻
  
  TIMESTAMP ::
  
  雖然標准的DATE字面意義沒有包含時間而一個TIMESTAMP字面意義的標准格式卻需要包含時間NLS_TIMESTAMP_FORMAT參數控制格式同樣NLS_DATE_FORMAT設定了標准DATE格式一個新的轉換函數即TO_TIMESTAMP可以從其它輸入格式建立一個TIMESTAMP並且TO_CHAR函數可用於顯示一個TIMESTAMP的組成
  
  為了以TIMESTAMP格式獲得當前日期和時間可以使用SYSTIMESTAMP函數而不是使用SYSDATE函數例如
  
  SELECT SYSTIMESTAMP FROM DUAL;
  
  一個損壞的塊就需要放棄一個對象
  IT資訊人員最害怕這樣的Oracle錯誤信息即ORAOracle data block corrupted(Oracle數據塊損壞)其中一個數據庫塊的內部結構將不能被修正信息可以通過文件數量和塊數量來識別塊的錯誤一般而言補救的方法通過運行以下這樣的查詢
  
  SELECT owner segment_name segment_type
  FROM dba_extents
  WHERE file_id = <filenumber>
  AND <blocknumber> BETWEEN block_id AND block_id + blocks ;
  
  這裡<filenumber> 和 <blocknumber>為從錯誤信息得到的數量這一查詢可得到哪些對象包含被損壞的塊然後就可以恢復這些損壞的塊然而這些恢復要麼是直接的(對於索引和臨時成分)要麼是混亂的(對於表單)要麼是十分混亂的(對於動態的roolback部分和部分數據字典)
  
  然而在Oracle i Enterprise Edition中一個名為BLOCKRECOVER的恢復管理器(RMAN)的命令可以正確地修正這些塊而不需要放棄和重新建立所涉及的對象當進入RMAN並連接到目標數據庫之後鍵入
  
  BLOCKRECOVER DATAFILE <filenumber> BLOCK <blocknumber>;
  
  一個新的查看名為V$DATABASE_BLOCK_CORRUPTION可以使得在RMAN備份過程中獲得更新並且當執行一個BLOCKRECOVER時可以列出塊的內容為了恢復所有被損壞的塊可以使用以下的RMAN
  
  BACKUP VALIDATE DATABASE;
  BLOCKRECOVER CORRUPTION LIST;
  
  如果只需要恢復幾個塊這一方法非常有用對於大規模的損壞塊需要重新存儲數據文件的一個先前圖像然而恢復整個數據文件這樣效率更加高對於任何新的特性在使用到正式的數據庫之前請認真地測試這是有必要的
  
   列不能被重命名或者重新組織
  重新命名一個表格的列或者改變它的數據類型通常這意味著建立一個新的表格和復制舊的數據到新表格列根本不能重新命名數據類型只有在沒有數據(只能為NULL數值)時才能被改變
  
  Oracle i具有兩種方法以克服這些限制現在ALTER TABLE命令可以直接地重新命名列
  
  ALTER TABLE books RENAME COLUMN tiitle TO title;
  
  同樣一個名為DBMS_REDEFINITION的PL/SQL工具包可以使一個DBA改變表格的列結構這是一個復雜的過程但通常情況下遵循以下的步驟即可實現
  
   使用DBMS_REDEFINITIONCAN_REDEF_TABLE來檢查表格滿足在線的重新定義並指定重新定義是否遵循主要的鍵或者遵循行Ids
  
  在相同規劃中建立一個空表格但結構是一樣的省略你想要放棄的列包含你想要建立的新的列
  
  使用DBMS_REDEFINITIONSTART_REDEF_TABLE來開始重新定義過程這一過程的參數說明了舊的表格新的表格以及如何將現成的列映射到新表格的列
  
  建立任一約束索引
  
  使用DBMS_REDEFINITIONFINISH_REDEF_TABLE來完成這一過程當重新定義在兩個表格之間交換時無論原來表格的大小都必須將表格鎖定為一小段時間
  
   放棄在重新定義中使用的臨時表格而不再使用它
  
  當然重新定義一個表格不會自動地更新任何可以訪問表格的程序代碼程序必須分開地更新和調試然而DBMS_REDEFINITION does所可以做的就是縮短時間這正是用戶的需求
  
  只有表格的主人才能分配使用權限
  當我提到Oracle安全特性時客戶都無法相信DBA不能將使用權限分配給表格除非表格的主人已經將其分配給DBA然而在以前就是這樣的情況這些限制是Oracle設計的一部分但它使管理更加困難在Oracle i一個新的系統權限改變了這一點
  
  現在的DBA具具備一個名為GRANT ANY OBJECT PRIVILEGE的系統權限在過去一個如此的語句
  
  GRANT SELECT ON scottemp TO giselle;
  都會無法通過除非SCOTT已經將DBA 的SELECT權限分配給他的表格 WITH GRANT OPTION現在相同的語句卻可以正確運行
  
  保持忘卻狀態
  正如Visa的創始人Dee Hock所說的問題不是你如何去獲得創新的思想而是如何去忘卻舊的東西所以請保持忘卻狀態
From:http://tw.wingwit.com/Article/program/Oracle/201311/16664.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.