標籤

2009年8月20日 星期四

SQL Server 資料庫檔恢復技術


SQL Server 資料庫備份有兩種方式,一種是使用BACKUP DATABASE 將資料庫檔備份出去,另外一種就是直接拷貝資料庫檔 mdf 和日誌檔ldf的方式。下面將主要討論一下後者的備份與恢復。
本文假定您能熟練使用SQL Server Enterprise Manager (SQL Server企業管理器) 和 SQL Server Quwey Analyser(SQL Server查詢分析器)。

1、正常的備份、恢復方式
正常方式下,我們要備份一個資料庫,首先要先將該資料庫從運行的資料伺服器中斷開,或者停掉整個資料庫伺服器,然後複製檔。
卸下資料庫的命令:Sp_detach_db 資料庫名
連接資料庫的命令:Sp_attach_db
或者
sp_attach_single_file_db
sp_attach_db [@dbname =] 'dbname', [@filename1 =] 'filename_n' [,…16]
sp_attach_single_file_db [@dbname =] 'dbname', [@physname =] 'physical_name'

使用此方法可以正確恢復 SQL Sever7.0 和 SQL Server 2000 的資料庫檔,要點是備份的時候一定要將 mdf 和 ldf 兩個檔都備份下來,mdf 檔是資料庫資料檔案,ldf 是資料庫日誌檔。

例子:
假設資料庫為test,其資料檔案為test_data.mdf,日誌檔為test_log.ldf。下面我們討論一下如何備份、恢復該資料庫。

卸下資料庫:

sp_detach_db 'test'

連接資料庫:

sp_attach_db 'test', 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_data.mdf', 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf'

sp_attach_single_file_db 'test','C:\Program Files\Microsoft SQL S erver\MSSQL\Data\test_data.mdf'

2、只有mdf檔的恢復技術
由 於種種原因,我們如果當時僅僅備份了 mdf 檔,那麼恢復起來就是一件很麻煩的事情了。 如果您的 mdf 檔是當前資料庫產生的,那麼很僥倖,也許你使用 sp_attach_db 或者 sp_attach_single_file_db 可以恢復資料庫,但是會出現類似下面的提示資訊設備啟動錯誤。物理檔案名 'C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF' 可能有誤。
已創建名為 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.LDF' 的新日誌檔。
但是,如果您的資料庫檔是從其他電腦上複製過來的,那麼很不幸,也許上述辦法就行不通了。你也許會得到類似下面的錯誤資訊
伺服器: 消息 1813,級別 16,狀態 2,行 1
未能打開新資料庫 'test'。Create DATABASE 將終止。
設備啟動錯誤。物理檔案名 'd:\test_log.LDF' 可能有誤。
怎麼辦呢?別著急,下面我們舉例說明恢復辦法。
A.我們使用默認方式建立一個供恢復使用的資料庫(如test)。可以在SQL Server Enterprise Manager裏面建立。
B.停掉資料庫伺服器。
C.將剛才生成的資料庫的日誌檔test_log.ldf刪除,用要恢復的資料庫mdf檔覆蓋剛才生成的資料庫資料檔案test_data.mdf。
D.啟動資料庫伺服器。此時會看到資料庫test的狀態為“置疑”。這時候不能對此資料庫進行任何操作。
E.設置資料庫允許直接作業系統表。此操作可以在SQL Server Enterprise
Manager裏面選擇資料庫伺服器,按右鍵,選擇“屬性”,在“伺服器設置”頁面中將“允許對系統目錄直接修改”一項選中。也可以使用如下語句來實現。

use master
go
sp_configure 'allow updates',1
go
reconfigure with override
go

F.設置test為緊急修復模式

update sysdatabases set status=-32768 where dbid=DB_ID('test')

此時可以在SQL Server Enterprise
Manager裏面看到該資料庫處於“唯讀\置疑\脫機\緊急模式”可以看到資料庫裏面的表,但是僅僅有系統表

G.下面執行真正的恢復操作,重建資料庫日誌檔

dbcc rebuild_log('test','C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf')

執行過程中,如果遇到下列提示資訊:
伺服器: 消息 5030,級別 16,狀態 1,行 1
未能排它地鎖定資料庫以執行該操作。
DBCC 執行完畢。如果 DBCC 輸出了錯誤資訊,請與系統管理員聯繫。
說明您的其他程式正在使用該資料庫,如果剛才您在F步驟中使用SQL Server Enterprise
Manager打開了test庫的系統表,那麼退出SQL Server Enterprise Manager就可以了。
正確執行完成的提示應該類似於:
警告: 資料庫 'test' 的日誌已重建。已失去事務的一致性。應運行 DBCC CHECKDB
以驗證物理一致性。將必須重置資料庫選項,並且可能需要刪除多餘的日誌檔。
DBCC 執行完畢。如果 DBCC 輸出了錯誤資訊,請與系統管理員聯繫。
此時打開在SQL Server Enterprise Manager裏面會看到資料庫的狀態為“只供DBO使用”。此時可以訪問資料庫裏面的用戶表了。
H.驗證資料庫一致性(可省略)

dbcc checkdb('test')

一般執行結果如下:
CHECKDB 發現了 0 個分配錯誤和 0 個一致性錯誤(在資料庫 'test' 中)。
DBCC 執行完畢。如果 DBCC 輸出了錯誤資訊,請與系統管理員聯繫。
I.設置資料庫為正常狀態

sp_dboption 'test','dbo use only','false'

如果沒有出錯,那麼恭喜,現在就可以正常的使用恢復後的資料庫啦。
J.最後一步,我們要將步驟E中設置的“允許對系統目錄直接修改”一項恢復。因為平時直接作業系統表是一件比較危險的事情。當然,我們可以在SQL Server
Enterprise Manager裏面恢復,也可以使用如下語句完成

sp_configure 'allow updates',0
go
reconfigure with override
go

參考:http://bbs.suncity.net.tw/viewtopic.php?f=9&t=110&view=previous

MSSQL 備份還原

完整備份 - 包括資料表、索引、系統資料表、資料庫物件、交易日誌

差異備份 - 從上一次的完整備份後,備份所作過的變動,而下一個差異備份檔是有包含上一個差異備份檔的內容的,
所以只要還原差異備份檔最新一個就可以了,
在還原差異前要先還原完整備份檔再加上 standby 或 norecovery

交易日誌備份 - 備份變動,可以還原特定時間點之前的交易,與差異不同的是每個交易備份檔內容是沒有重複的

差異備份還原測試

1。建立資料庫 cross_db、資料表 table_1

內容
row1 row2
---------- ----------
1 2
3 4

2。完整備份(第一次)

清除MSSQL的log

清除MSSQL的log

清除SQL Log的指令… DUMP TRANSACTION 資料庫名稱 WITH NO_LOG
dbcc shrinkdatabase(資料庫名稱)

2009年8月16日 星期日

無法上網,修復被惡意程式破壞的Winsock

如何修復被惡意程式破壞的Winsock?

有些惡意程式 (Trojan.Riler.FTROJ_AGENT.CAC) 或間諜軟體(NewDotNetWebHancer) 安裝一些附加元件至系統的Winsock2機碼中 (有時候稱為Layered Service Provider, aka, LSP),以利於監視系統的網路訊息。當你 (防毒軟體或反間諜軟體) 不小心移除它時,會造成網路中斷或網路不穩定。如果發生這種情形,如何檢查及修復它呢?

如何判斷Winsock2已經被損毀了呢?

方法一:使用 Windows XP SP2 所提供的命令 (netsh winsock show catalog)
1. 按一下 [開始],然後按一下 [執行],輸入cmd,然後按一下 [確定]。
2. 在命令列視窗中,輸入netsh winsock show catalog。
3. 如果Winsock2機碼沒有損壞且只安裝TCP/IP的話,[通訊協定] 中會有10個區段,每個區段的名稱將如下所示:
‧ MSAFD Tcpip [TCP/IP]
‧ MSAFD Tcpip [UDP/IP]
‧ RSVP UDP Service Provider
‧ RSVP TCP Service Provider
‧ MSAFD NetBIOS [\Device\NetBT_Tcpip...
‧ MSAFD NetBIOS [\Device\NetBT_Tcpip...
‧ MSAFD NetBIOS [\Device\NetBT_Tcpip...
‧ MSAFD NetBIOS [\Device\NetBT_Tcpip...
‧ MSAFD NetBIOS [\Device\NetBT_Tcpip...
‧ MSAFD NetBIOS [\Device\NetBT_Tcpip...

方法二:使用msinfo32.exe
1. 按一下 [開始],然後按一下 [執行],輸msinfo32,然後按一下 [確定]。
2. 展開 [元件],再展開 [網路],然後按一下 [通訊協定]。
3. 如果Winsock2機碼沒有損壞且只安裝TCP/IP的話,[通訊協定] 中會有10個區段,每個區段的名稱將如下所示:
‧ MSAFD Tcpip [TCP/IP]
‧ MSAFD Tcpip [UDP/IP]
‧ RSVP UDP Service Provider
‧ RSVP TCP Service Provider
‧ MSAFD NetBIOS [\Device\NetBT_Tcpip...
‧ MSAFD NetBIOS [\Device\NetBT_Tcpip...
‧ MSAFD NetBIOS [\Device\NetBT_Tcpip...
‧ MSAFD NetBIOS [\Device\NetBT_Tcpip...
‧ MSAFD NetBIOS [\Device\NetBT_Tcpip...
‧ MSAFD NetBIOS [\Device\NetBT_Tcpip...

如何修復已經被損毀的Winsock2呢?

方法一:
如果你的系統已經是Windows XP SP2的話,只要在命令列視窗中,輸入下列的命令即可:netsh winsock reset
不過,如果你有安裝其他的附加元件的話 (如Google Toolbar),此命令會還原至只有TCP/IP的狀況。

方法二:使用LSP-Fix程式
1. 你可以從http://cexx.org/lspfix.htm下載此程式。

方法三:刪除毀損的登錄機碼,然後重新安裝 TCP/IP 通訊協定
1. 按一下 [開始],然後按一下 [執行]。
2. 在 [開啟] 方塊中,輸入regedit,然後按一下 [確定]。
3. 在 [登錄編輯程式] 中找出下列機碼,再用滑鼠右鍵按一下每個機碼,然後按[刪除]:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Winsock
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Winsock2
4. 提示您是否確定要刪除時,請按一下 [是]。
注意 刪除Winsock機碼之後,請重新啟動電腦,否則,下列的步驟就會無法正確執行。
5. 安裝 TCP/IP,用滑鼠右鍵按一下網路連線,再按一下 [內容]。
6. 按一下 [安裝],按一下 [通訊協定],然後按一下 [新增]。
7. 按一下 [從磁片安裝],輸入C:\Windows\inf,然後按一下 [確定]。
8. 在可用通訊協定的清單中按一下 [Internet Protocol (TCP/IP)],然後按一下 [確定],然後重新啟動電腦。

參考:
1. KB811259
2. LSP-Fix

使用 DiskSpd 測試磁碟效能

  DiskSpd 是微軟創建的命令行磁碟測試工具。它結合了強大的IO工作負載定義來測量磁碟效能。由於它支援自由配置和調整參數,使其成為存儲效能測試、驗證和基準測試的理想工具。 步驟 1. 從 GitHub (說明) https://github.com/Microsoft/di...