一、選擇題
1.一個事務的執行,要么全部完成,要么全部不做,一個事務中對數據庫的所有操作都是一個不可分割的操作序列的屬性是( ) 。
A. 原子性 B. 一致性
C. 獨立性 D. 持久性
2.表示兩個或多個事務可以同時運行而不互相影響的是( )。
A. 原子性 B. 一致性
C. 獨立性 D. 持久性
3. 事務的持續性是指( )
A.事務中包括的所有操作要么都做,要么都不做。
B.事務一旦提交,對數據庫的改變是永久的。
C.一個事務內部的操作對並發的其他事務是隔離的。
D.事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。
4.SQL語言中的COMMIT語句的主要作用是( )。
A. 結束程序 B. 返回系統
C. 提交事務 D. 存儲數據
5.SQL語言中用( )語句實現事務的回滾
A. CREATE TABLE B. ROLLBACK
C. GRANT和REVOKE D. COMMIT
6. 若系統在運行過程中,由於某種硬件故障,使存儲在外存上的數據部分損失或全部損失,這種情況稱為( )。
A. 介質故障 B. 運行故障
C. 系統故障 D. 事務故障
7. 在DBMS中實現事務持久性的子系統是( )。
A. 安全管理子系統 B. 完整性管理子系統
C. 並發控制子系統 D. 恢復管理子系統
8. 后援副本的作用是( )。
A. 保障安全性 B. 一致性控制
C. 故障后的恢復 D. 數據的轉儲
9. 事務日志用於保存( )。
A. 程序運行過程 B. 程序的執行結果
C. 對數據的更新操作 D. 數據操作
10. 數據庫恢復的基礎是利用轉儲的冗余數據。這些轉儲的冗余數據包括( )。
A. 數據字典、應用程序、審計檔案、數據庫后備副本
B. 數據字典、應用程序、審計檔案、日志文件
C. 日志文件、數據庫后備副本
D. 數據字典、應用程序、數據庫后備副本
選擇題答案:
(1) A (2) C (3) B (4) C (5) B
(6) A (7) D (8) C (9) C (10) C
二、簡答題
1.試述事務的概念及事務的四個特性。
答: 事務是用戶定義的一個數據庫操作序列,這些操作要么全做要么全不做,是一個不可分割的工作單位。
事務具有四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續性(Durability)。這個四個特性也簡稱為ACID特性。
原子性:事務是數據庫的邏輯工作單位,事務中包括的諸操作要么都做,要么都不做。
一致性:事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。
隔離性:一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對其他並發事務是隔離的,並發執行的各個事務之間不能互相干擾。
持續性:持續性也稱永久性(Permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其執行結果有任何影響。
2.為什么事務非正常結束時會影響數據庫數據的正確性,請列舉一例說明之。
答: 事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。如果數據庫系統運行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對數據庫所做的修改有一部分已寫入物理數據庫,這時數據庫就處於一種不正確的狀態,或者說是不一致的狀態。
例如某工廠的庫存管理系統中,要把數量為Q的某種零件從倉庫1移到倉庫2存放。
則可以定義一個事務T,T包括兩個操作;Q1=Q1-Q,Q2=Q2+Q。如果T非正常終止時只做了第一個操作,則數據庫就處於不一致性狀態,庫存量無緣無故少了Q。
3.數據庫中為什么要有恢復子系統?它的功能是什么?
答: 因為計算機系統中硬件的故障、軟件的錯誤、操作員的失誤以及惡意的破壞是不可避免的,這些故障輕則造成運行事務非正常中斷,影響數據庫中數據的正確性,重則破壞數據庫,使數據庫中全部或部分數據丟失,因此必須要有恢復子系統。
恢復子系統的功能是:把數據庫從錯誤狀態恢復到某一已知的正確狀態(亦稱為一致狀態或完整狀態)。
4.數據庫運行中可能產生的故障有哪幾類?哪些故障影響事務的正常執行?哪些故障破壞數據庫數據?
答:數據庫系統中可能發生各種各樣的故障,大致可以分以下幾類:
(1)事務內部的故障;
(2)系統故障;
(3)介質故障;
(4)計算機病毒。
事務故障、系統故障和介質故障影響事務的正常執行;介質故障和計算機病毒破壞數據
庫數據。
5.據庫恢復的基本技術有哪些?
答:數據轉儲和登錄日志文件是數據庫恢復的基本技術。
當系統運行過程中發生故障,利用轉儲的數據庫后備副本和日志文件就可以將數據庫恢復到故障前的某個一致性狀態。
6. 數據庫轉儲的意義是什么? 試比較各種數據轉儲方法。
答: 數據轉儲是數據庫恢復中采用的基本技術。所謂轉儲即DBA定期地將數據庫復制到磁帶或另一個磁盤上保存起來的過程。當數據庫遭到破壞后可以將后備副本重新裝入,將數據庫恢復到轉儲時的狀態。
靜態轉儲:在系統中無運行事務時進行的轉儲操作。靜態轉儲簡單,但必須等待正運行的用戶事務結束才能進行。同樣,新的事務必須等待轉儲結束才能執行。顯然,這會降低數據庫的可用性。
動態轉儲:指轉儲期間允許對數據庫進行存取或修改。動態轉儲可克服靜態轉儲的缺點,它不用等待正在運行的用戶事務結束,也不會影響新事務的運行。但是,轉儲結束時后援副本上的數據並不能保證正確有效。因為轉儲期間運行的事務可能修改了某些數據,使得后援副本上的數據不是數據庫的一致版本。
為此,必須把轉儲期間各事務對數據庫的修改活動登記下來,建立日志文件(log file)。這樣,后援副本加上日志文件就能得到數據庫某一時刻的正確狀態。
轉儲還可以分為海量轉儲和增量轉儲兩種方式。
海量轉儲是指每次轉儲全部數據庫。增量轉儲則指每次只轉儲上一次轉儲后更新過的數據。從恢復角度看,使用海量轉儲得到的后備副本進行恢復一般說來更簡單些。但如果數據庫很大,事務處理又十分頻繁,則增量轉儲方式更實用更有效。
7. 什么是日志文件?為什么要設立日志文件?
答: (1)日志文件是用來記錄事務對數據庫的更新操作的文件。
(2)設立日志文件的目的是: 進行事務故障恢復;進行系統故障恢復;協助后備副本進行介質故障恢復。
8. 登記日志文件時為什么必須先寫日志文件,后寫數據庫?
答: 把對數據的修改寫到數據庫中和把表示這個修改的日志記錄寫到日志文件中是兩個不同的操作。有可能在這兩個操作之間發生故障,即這兩個寫操作只完成了一個。
如果先寫了數據庫修改,而在運行記錄中沒有登記這個修改,則以后就無法恢復這個修改了。如果先寫日志,但沒有修改數據庫,在恢復時只不過是多執行一次UNDO操作,並不會影響數據庫的正確性。所以一定要先寫日志文件,即首先把日志記錄寫到日志文件中,然后寫數據庫的修改。
9. 針對不同的故障,試給出恢復的策略和方法。(即如何進行事務故障的恢復?系統故障的恢復?介質故障恢復?)
答: 事務故障的恢復:
事務故障的恢復是由DBMS自動完成的,對用戶是透明的。
DBMS執行恢復步驟是:
(1)反向掃描文件日志(即從最后向前掃描日志文件),查找該事務的更新操作。
(2)對該事務的更新操作執行逆操作。即將日志記錄中“更新前的值”寫入數據庫。
(3)繼續反向掃描日志文件,做同樣處理。
(4)如此處理下去,直至讀到此事務的開始標記,該事務故障的恢復就完成了。
答: 系統故障的恢復:
系統故障可能會造成數據庫處於不一致狀態:
一是未完成事務對數據庫的更新可能已寫入數據庫;
二是已提交事務對數據庫的更新可能還留在緩沖區,沒來得及寫入數據庫。
因此恢復操作就是要撤銷(UNDO)故障發生時未完成的事務,重做(REDO)已完成的事務。
系統的恢復步驟是:
(1)正向掃描日志文件,找出在故障發生前已經提交的事務隊列(REDO隊列)和未完成的事務隊列(UNDO隊列)。
(2)對撤銷隊列中的各個事務進行UNDO處理。
進行UNDO處理的方法是,反向掃描日志文件,對每個UNDO事務的更新操作執行逆操作,即將日志記錄中“更新前的值”(Before Image)寫入數據庫。
(3)對重做隊列中的各個事務進行REDO處理。
進行REDO處理的方法是:正向掃描日志文件,對每個REDO事務重新執行日志文件登記的操作。即將日志記錄中“更新后的值”(After Image)寫入數據庫。
*解析:
在第(1)步中如何找出REDO隊列和UNDO隊列?請大家思考一下。
下面給出一個算法:
1) 建立兩個事務隊列:
· UNDO-LIST: 需要執行undo操作的事務集合;
· REDO-LIST: 需要執行redo操作的事務集合;
兩個事務隊列初始均為空。
2) 從日志文件頭開始,正向掃描日志文件
· 如有新開始(遇到Begin Transaction)的事務Ti,把Ti暫時放入UNDO-LIST隊列;
· 如有提交的事務(遇到End Transaction)Tj,把Tj從UNDO-LIST隊列移到REDO-LIST隊列;
直到日志文件結束
答: 介質故障的恢復:
介質故障是最嚴重的一種故障。
恢復方法是重裝數據庫,然后重做已完成的事務。具體過程是:
(1)DBA裝入最新的數據庫后備副本(離故障發生時刻最近的轉儲副本),使數據庫恢復到轉儲時的一致性狀態。
(2)DBA裝入轉儲結束時刻的日志文件副本
(3)DBA啟動系統恢復命令,由DBMS完成恢復功能,即重做已完成的事務。
*解析
1)我們假定采用的是靜態轉儲,因此第(1)步裝入數據庫后備副本便可以了。
2)如果采用的是靜動態轉儲,第(1)步裝入數據庫后備副本還不夠,還需同時裝入轉儲開始時刻的日志文件副本,經過處理后才能得到正確的數據庫后備副本。
3)第(2)步重做已完成的事務的算法是:
a. 正向掃描日志文件,找出故障發生前已提交的事務的標識,將其記入重做隊列
b. 再一次正向掃描日志文件,對重做隊列中的所有事務進行重做處理。即將日志記錄中“更新后的值”寫入數據庫。
10. 具有檢查點的恢復技術有什么優點?
答: 利用日志技術進行數據庫恢復時,恢復子系統必須搜索日志,確定哪些事務需要REDO,哪些事務需要UNDO。一般來說,需要檢查所有日志記錄。這樣做有兩個問題:
一是搜索整個日志將耗費大量的時間。
二是很多需要REDO處理的事務實際上已經將它們的更新操作結果寫到數據庫中了,恢復子系統又重新執行了這些操作,浪費了大量時間。
檢查點技術就是為了解決這些問題。
11. 試述使用檢查點方法進行恢復的步驟。
答: ① 從重新開始文件中找到最后一個檢查點記錄在日志文件中的地址,由該地址在日志文件中找到最后一個檢查點記錄。
② 由該檢查點記錄得到檢查點建立時刻所有正在執行的事務清單ACTIVE-LIST。
這里建立兩個事務隊列:
· UNDO-LIST: 需要執行undo操作的事務集合;
· REDO-LIST: 需要執行redo操作的事務集合;
把ACTIVE-LIST暫時放入UNDO-LIST隊列,REDO隊列暫為空。
③ 從檢查點開始正向掃描日志文件
· 如有新開始的事務Ti,把Ti暫時放入UNDO-LIST隊列;
· 如有提交的事務Tj,把Tj從UNDO-LIST隊列移到REDO-LIST隊列,直到日志文件結束;
④ 對UNDO-LIST中的每個事務執行UNDO操作, 對REDO-LIST中的每個事務執行REDO操作。
12. 什么是數據庫鏡像?它有什么用途?
答: 數據庫鏡像即根據DBA的要求,自動把整個數據庫或者其中的部分關鍵數據復制到另一個磁盤上。每當主數據庫更新時,DBMS自動把更新后的數據復制過去,即DBMS自動保證鏡像數據與主數據的一致性。
數據庫鏡像的用途有:
一是用於數據庫恢復。當出現介質故障時,可由鏡像磁盤繼續提供使用,同時DBMS自動利用鏡像磁盤數據進行數據庫的恢復,不需要關閉系統和重裝數據庫副本。
二是提高數據庫的可用性。在沒有出現故障時,當一個用戶對某個數據加排它鎖進行修改時,其他用戶可以讀鏡像數據庫上的數據,而不必等待該用戶釋放鎖。
*13. 試述你了解的某一個實際的DBMS產品中采用的恢復策略。
答:
下面簡單介紹一下Oracle的恢復技術:
Oracle中恢復機制也采用了轉儲和登記日志文件兩個技術。
Oracle向DBA提供了多種轉儲后備副本的方法,如文件拷貝、利用Oracle的Export實用程序、用SQL命令Spool以及自己編程實現等。相應地,Oracle也提供了多種重裝后備副本的方法,如文件拷貝、利用Oracle的Import實用程序、利用SQL*LOADER以及自己編程實現等。
在Oracle 早期版本(V.5)中,日志文件以數據塊為單位,也就是說,Oracle的恢復操作是基於數據塊的,不是基於操作的。Oracle中記錄數據庫更新前的舊值的日志文件稱為數據庫前像文件(Before Image,簡稱BI文件),記錄數據庫更新后的新值的日志文件稱為數據庫的后像文件(After Image,簡稱AI文件)。BI文件是必須配置的,AI文件是可以任選的。
Oracle7為了能夠在出現故障時更有效地恢復數據,也為了解決讀“臟”數據問題,提供了REDO日志文件和回滾段(Rollback Segment)。REDO日志文件中記錄了被更新數據的前像和后像。回滾段記錄更新數據的前像,設在數據庫緩沖區中。在利用日志文件進行故障恢復時,為減少掃描日志文件的遍數,Oracle7首先掃描REDO日志文件,重做所有操作,包括未正常提交的事務的操作,然后再根據回滾段中的數據,撤銷未正常提交的事務的操作。
詳細技術希望同學自己設法了解Oracle最新版本的介紹,例如通過INTERNET訪問Oracle公司的網站。也可以了解其他DBMS廠商的產品情況。
*14. 試用恢復的基本技術設計一個恢復子系統,給出這個子系統的恢復策略,包括:
(a) 當產生某一類故障時如何恢復數據庫的方法;
(b) 日志文件的結構;
(c) 登記日志文件的方法;
(d) 利用日志文件恢復事務的方法;
(e) 轉儲的類型;
(f) 轉儲的后備副本和日志文件如何配合使用。
*解析
這是一個大作業。可以綜合復習和運用學到的知識。設計一個恢復子系統。
例如,日志文件的結構你可以記錄為單位,也可以以數據塊為單位。不同的日志文件結構,登記的日志內容,日志文件恢復事務的方法也就不同了。
對於研究生,還應該上機模擬實現你設計的恢復子系統。