文件組成原理
SQL Server數(shù)據(jù)庫系統(tǒng)主要由兩大部分組成,分別是數(shù)據(jù)文件以及日志文件。數(shù)據(jù)文件存儲數(shù)據(jù),日志文件存儲操作數(shù)據(jù)的行為。
數(shù)據(jù)文件
SQL Server數(shù)據(jù)庫包含兩種類型的數(shù)據(jù)文件:主數(shù)據(jù)文件和次要數(shù)據(jù)文件。主數(shù)據(jù)文件是數(shù)據(jù)庫的起點,指向數(shù)據(jù)庫中的其他文件。每個數(shù)據(jù)庫都有一個主數(shù)據(jù)文件。主數(shù)據(jù)文件默認文件擴展名是.mdf。除主數(shù)據(jù)文件以外的所有其他數(shù)據(jù)文件都是次要數(shù)據(jù)文件。某些數(shù)據(jù)庫可能不含有任何次要數(shù)據(jù)文件,而有些數(shù)據(jù)庫則含有多個次要數(shù)據(jù)文件。次要數(shù)據(jù)文件的推薦文件擴展名是.ndf。
日志文件
日志文件在數(shù)據(jù)庫中作用十分重要。在執(zhí)行數(shù)據(jù)操作的過程中,首先將數(shù)據(jù)操作命令寫入到緩存中,并立即寫入日志文件,但不會立即寫入數(shù)據(jù)文件。日志文件通過一個標記點來確定某個操作是否已將緩存中的數(shù)據(jù)寫入數(shù)據(jù)文件。當SQLServer重啟后,會自動查看日志中最新的標記點,并將這個標記點后面的交易記錄抹去,因為這些交易記錄并沒有真正地將緩存中的數(shù)據(jù)寫入數(shù)據(jù)文件。這可以防止那些中斷的操作修改數(shù)據(jù)文件。
事務日志記錄數(shù)據(jù)庫操作命令,僅記錄執(zhí)行數(shù)據(jù)發(fā)生的動作,而不是記錄數(shù)據(jù)的執(zhí)行結果。因此備份事務日志后,將備份點之前已經(jīng)完成的事務標記為“不活動”,而且在執(zhí)行完整備份數(shù)據(jù)庫后,將自動截斷標記為“不活動”的日志記錄。合理的安排事務日志備份將提高數(shù)據(jù)恢復的能力,可以將數(shù)據(jù)恢復到發(fā)生故障前的1秒鐘。
各種文件丟失恢復方法
數(shù)據(jù)文件丟失
數(shù)據(jù)庫系統(tǒng)處于運行狀態(tài)時,數(shù)據(jù)庫文件處于“活動”狀態(tài),數(shù)據(jù)庫文件不能被刪除。如果確實出現(xiàn)數(shù)據(jù)文件被刪除的情況,可能由于以下原因:MS SQL Server數(shù)據(jù)庫服務停止;或者在企業(yè)管理器中,數(shù)據(jù)庫管理員使用“分離數(shù)據(jù)庫”功能,分離數(shù)據(jù)庫后將數(shù)據(jù)庫文件刪除。
當出現(xiàn)數(shù)據(jù)庫文件被刪除時,首先需要了解數(shù)據(jù)庫文件如何被刪除,再利用恢復軟件恢復被刪除的文件。如果是在服務被停止的狀態(tài)下刪除,數(shù)據(jù)庫文件恢復后,數(shù)據(jù)庫文件即可正常加載。如果是數(shù)據(jù)庫分離后的刪除,數(shù)據(jù)庫文件恢復后,在企業(yè)管理器中,使用附加數(shù)據(jù)庫功能即可。
日志文件丟失
日志文件丟失,經(jīng)常出現(xiàn)在硬件出現(xiàn)故障時,主要體現(xiàn)在數(shù)據(jù)文件和日志分別存儲在不同的物理介質中,當介質損壞時,日志文件隨之丟失。丟失SQL Server日志文件分為兩類:無活動事務的日志和包含活動事務的日志。
SQL Server在工作狀態(tài)下無法刪除日志文件,事務日志文件在SQL Server服務未啟動的情況下可以被刪除。啟動SQL服務后,數(shù)據(jù)庫即被標志為“置疑”狀態(tài),這種狀態(tài)下丟失的日志文件為無活動事務日志文件。無活動事務的日志丟失時,首先在企業(yè)管理器中,使用分離數(shù)據(jù)庫功能,分離“置疑”的數(shù)據(jù)庫。然后,使用附加數(shù)據(jù)庫功能附加數(shù)據(jù)庫,在附加的過程中創(chuàng)建新的日志文件即可。
當包含活動事務日志的文件丟失時,使用無活動事務的日志丟失處理方法,將顯示“數(shù)據(jù)庫和日志文件不符合,不能附加數(shù)據(jù)庫”錯誤信息。數(shù)據(jù)庫管理員首先要停止SQL Server服務,將數(shù)據(jù)文件備份到安全區(qū)域。然后啟動SQL Server服務,創(chuàng)建新的同名數(shù)據(jù)庫,再停止SQL Server服務,用備份的數(shù)據(jù)文件覆蓋新創(chuàng)建的數(shù)據(jù)文件。以單用戶模式啟動SQL Server服務后,將數(shù)據(jù)庫模式設置為緊急模式,使用“DBCC CHECKDB”命令檢驗數(shù)據(jù)庫的狀態(tài),完成后將數(shù)據(jù)庫設置為正常模式,即可完成數(shù)據(jù)庫的修復。
數(shù)據(jù)表文件丟失
在業(yè)務系統(tǒng)中提供的數(shù)據(jù)刪除功能和數(shù)據(jù)庫管理員在維護數(shù)據(jù)庫過程中,使用Delete命令刪除數(shù)據(jù)表中的數(shù)據(jù),產(chǎn)生的結果完全相同。在工作中經(jīng)常會遇到誤刪數(shù)據(jù)的情況。管理員發(fā)出刪除數(shù)據(jù)命令后,首先將刪除命令記錄在日志文件中,然后在數(shù)據(jù)庫中執(zhí)行刪除操作。由于數(shù)據(jù)行記錄在數(shù)據(jù)頁中,已經(jīng)刪除的數(shù)據(jù)頁并沒有真正刪除“Slot”中的數(shù)據(jù),只是將數(shù)據(jù)頁標記為已經(jīng)使用,如果有新的數(shù)據(jù)寫入,不會對此類數(shù)據(jù)頁寫入數(shù)據(jù)。
在SQL Server 數(shù)據(jù)庫中,沒有提供恢復數(shù)據(jù)行命令,標準的恢復刪除數(shù)據(jù)的方法是使用基于備份的事務日志時間點功能。管理員在使用日志恢復時,經(jīng)過多次定位時間點,可以還原刪除的數(shù)據(jù)。
Log Explorer for SQL Server能夠幫助管理員管理、監(jiān)控數(shù)據(jù)庫日志,如圖1所示。Log Explorer支持聯(lián)機事務日志文件和離線事務日志文件。當管理員發(fā)現(xiàn)數(shù)據(jù)誤刪后,建議立即備份數(shù)據(jù)庫,停止SQL Sever服務。啟動該工具,使用離線事務日志文件功能,加載誤刪的日志文件。選擇目標數(shù)據(jù)表以及執(zhí)行刪除操作的數(shù)據(jù)庫用戶,設置過濾條件,在瀏覽日志窗口中顯示相關的日志,使用“Undo Transactions”功能生成InsertSQL代碼并保存到文本文件中,確認腳本正確后,使用“Run SQL Script” 功能即可完成數(shù)據(jù)恢復。用戶錯誤執(zhí)行“Update”腳本后,使用同樣的方法可以生成“Update”腳本,將數(shù)據(jù)恢復到修改前的狀態(tài)。
數(shù)據(jù)庫恢復
數(shù)據(jù)庫恢復是數(shù)據(jù)庫管理員必須掌握的基本技能。SQL Server數(shù)據(jù)庫提供了3種數(shù)據(jù)恢復模型,分別為:簡單模型、完全模型、大容量日志記錄模型。
如果數(shù)據(jù)庫可用,可按照如下流程恢復數(shù)據(jù)庫:
1. 備份尾日志。尾日志記錄是自上一次數(shù)據(jù)庫完整備份、差異備份或者日志備份后生成的日志。
2. 還原數(shù)據(jù)庫備份。該恢復過程可以在圖形模式和查詢分析器中完成,如圖2所示。當數(shù)據(jù)庫不能訪問時,也可恢復數(shù)據(jù)庫或者日志,數(shù)據(jù)庫處于恢復過程中顯示的狀態(tài)為“正在裝載”。
3.還原備份的事務日志備份,恢復參數(shù)為“No Recovery”。
4.用同樣的方法還原尾日志。在還原尾日志的過程中恢復參數(shù)設置為“With Recovery”,恢復過程中自動回滾未提交的事務日志,根據(jù)需要選擇時間點,數(shù)據(jù)庫恢復即可完成。
企業(yè)備份數(shù)據(jù)的方法各不相同,數(shù)據(jù)庫管理員應該了解數(shù)據(jù)庫備份策略,要經(jīng)常對數(shù)據(jù)庫恢復和恢復過程進行測試,以便應對突發(fā)的數(shù)據(jù)庫災難。