新版本可以給軟件帶來更高效率的技術現在我們可以忘卻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_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
g會做得更好
在
i版本中
閃回查詢受限於數據操作語言(DML
Data 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錯誤信息
即ORA
Oracle 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_REDEFINITION
CAN_REDEF_TABLE來檢查表格滿足在線的重新定義
並指定重新定義是否遵循主要的鍵或者遵循行Ids
在相同規劃中建立一個空表格
但結構是一樣的
省略你想要放棄的列
包含你想要建立的新的列
使用DBMS_REDEFINITION
START_REDEF_TABLE來開始重新定義過程
這一過程的參數說明了舊的表格
新的表格
以及如何將現成的列映射到新表格的列
建立任一約束
索引
使用DBMS_REDEFINITION
FINISH_REDEF_TABLE來完成這一過程
當重新定義在兩個表格之間交換時
無論原來表格的大小
都必須將表格鎖定為一小段時間
放棄在重新定義中使用的臨時表格
而不再使用它
當然
重新定義一個表格不會自動地更新任何可以訪問表格的程序代碼
程序必須分開地更新和調試
然而
DBMS_REDEFINITION does所可以做的就是縮短時間
這正是用戶的需求
只有表格的主人才能分配使用權限 當我提到Oracle安全特性時
客戶都無法相信DBA不能將使用權限分配給表格
除非表格的主人已經將其分配給DBA
然而
在以前就是這樣的情況
這些限制是Oracle設計的一部分
但它使管理更加困難
在Oracle
i
一個新的系統權限改變了這一點
現在的DBA具具備一個名為GRANT ANY OBJECT PRIVILEGE的系統權限
在過去
一個如此的語句
GRANT SELECT ON scott
emp TO giselle;
都會無法通過
除非SCOTT已經將DBA 的SELECT權限分配給他的表格 WITH GRANT OPTION
現在
相同的語句卻可以正確運行
保持忘卻狀態
正如Visa的創始人Dee Hock所說的
問題不是你如何去獲得創新的思想
而是如何去忘卻舊的東西
所以
請保持忘卻狀態
From:http://tw.wingwit.com/Article/program/Oracle/201311/16664.html