摘要:該文通過ASP程序實例,介紹了遠程備份和恢復SQL數據庫的方法。
關鍵詞:ASP;SQL;遠程;備份;恢復
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2009)32-8868-02
ASP Remote SQL Database Backup and Restore the Method
WENG Wen-hui
(Huangyan District, Toyama Power Authority, Taizhou 318023, China)
Abstract: Based on ASP program, for example,introduces remote SQL database backup and restore the method.
Key words: ASP; SQL; remote; backup and restore
近年來,SQL數據庫遭到注入攻擊是很常見,通常在程序中加上防注入代碼就可以抵御這類攻擊。但有的時候,因為程序文件比較多或者其他某原因,暫時無法防住注入攻擊,這時網站維護人員就比較頭疼了。本人便遇到過這樣的事,這個網站數據量不大,更新也不算頻繁,所以被注入后就需要恢復之前備份的數據庫。最初是通過遠程桌面連到服務器上,手動恢復SQL數據庫,也不算費勁。但后來有段時間,注入攻擊非常頻繁,一天可能發生好幾次,這樣就比較麻煩了。總是維護人員發現注入,打電話通知我,我再恢復數據庫,這樣經常會使用問題的處理時間比較長。而且有時網站剛更新了一部分數據,不久遭到注入攻擊,這時直接恢復數據庫就會丟失剛更新的數據,沒辦法,只有手工清除注入的代碼或者恢復后重新更新。這樣的事情發生幾次之后,我就產生了做一個程序讓網站維護人員自己在更新數據之后備份數據庫,在發現注入攻擊后自己完成數據庫的恢復。
1 技術準備
1.1 備份
備份的問題比較好處理,與數據庫建立連接后,執行BACKUP語句就可以實現。
BACKUP語句語法為:
BACKUP DATABASE { database_name | @database_name_var }
TO
[
[ WITH { DIFFERENTIAL |
[;]
第一行:BACKUP DATABASE 數據庫名;
第二行:文件名,一般只在數據庫的大小和性能要求使得進行數據庫備份無法實現時用到;
第三行:指定用于備份操作的邏輯備份設備或物理備份設備,這個是我們要用到的;
第四行:指定一組輔助備份設備(最多三個),其中每個設備都將鏡像 TO 子句中指定的備份設備,因為沒這種需求,可以忽略;
第五行:這行比較重要,指定了備份的各種參數,這里只介紹幾種可能用到的,其他的請查閱MSDN。
DIFFERENTIAL:指定數據庫備份或文件備份應該只包含上次完整備份后更改的數據庫或文件部分,即差異備份。
NOINIT | INIT:控制備份操作是追加到還是覆蓋備份媒體中的現有備份集。默認為追加到媒體中最新的備份集 (NOINIT)。
權限要求:默認授予 sysadmin 固定服務器角色和 db_owner 及 db_backupoperator 固定數據庫角色的成員。
1.2 恢復
恢復的問題就比較麻煩,首先要以SA用戶登陸,其次是要中止其他用戶與數據庫的連接,然后才能用RESTORE語句恢復數據庫。
中止其他用戶與數據庫的連接,如不進行這個操作,在恢復過程中多半會出現“因為數據庫正在使用,所以未能獲得對數據庫的排它訪問權。”的提示:
exec p_killspid 數據庫名
這里使用了一個自定義的存儲過程,代碼如下:
CREATEproc p_killspid
@dbname varchar(200)--要關閉進程的數據庫名
as
declare @sqlnvarchar(500)
declare @spid nvarchar(20)
declare #tb cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
open #tb
fetch next from #tb into @spid
while @@fetch_status=0
begin
exec('kill '+@spid)
fetch next from #tb into @spid
end
close #tb
deallocate #tb
GO
RESTORE語句語法為:
RESTORE DATABASE { database_name | @database_name_var }
[ FROM
WITH
{
[ RECOVERY | NORECOVERY ]
[ ,
} [ ,...n ]
[;]
第一行:RESTORE DATABASE 數據庫名;
第二行:文件名,一般只在數據庫的大小和性能要求使得進行數據庫備份無法實現時用到;
第三行:指定用于備份操作的邏輯備份設備或物理備份設備,這個是我們要用到的;
第六行:NORECOVERY 指定不發生回滾。從而使前滾按順序在下一條語句中繼續進行。
在這種情況下,還原順序可還原其他備份,并執行前滾。
RECOVERY(默認值)表示,應在完成當前備份前滾之后執行回滾。
其他參數略。
權限要求:如果不存在要還原的數據庫,則用戶必須有 CREATE DATABASE 權限才能執行 RESTORE。如果該數據庫存在,則 RESTORE 權限默認授予 sysadmin 和 dbcreator 固定服務器角色成員以及該數據庫的所有者 (dbo)(對于 FROM DATABASE_SNAPSHOT 選項,該數據庫始終存在)。
RESTORE 權限被授予那些成員身份信息始終可由服務器使用的角色。因為只有在固定數據庫可以訪問且沒有損壞時(在執行 RESTORE 時并不會總是這樣)才能檢查固定數據庫角色成員身份,所以 db_owner 固定數據庫角色成員沒有 RESTORE 權限。
下面順便說一下有可能出現的一些問題:
1)恢復數據庫后,增加登錄名出現“數據庫中的用戶名存在“,但是登錄名卻顯示<無>而且新加用戶會提示用戶已存在 !”,這時需要執行以下代碼:
sp_change_users_login 'update_one','數據庫用戶名稱','登錄名稱'
2)無法更改數據庫中對象的所有者,這時需要使用如下代碼:
exec sp_changeobjectowner '原所有者名',[dbo]
執行存儲過程changename
exec changename '原所有者名','新所有者名'
2 程序代碼
<%act=request(\"act\")
if act=\"B\" then’備份數據庫
SQL=\"backup database WebSiteData to disk='\"Server.MapPath(\"bk\")\"\\\"\"bk.bak\"\"' with INIT\"
set cnn=Server.createobject(\"adodb.connection\")
cnn.open \"driver={SQL Server};server=(local);uid=abc;pwd=123;database= WebSiteData \" ‘建立與數據庫的連接
cnn.execute SQL
on error resume next
if err<>0 then
response.write \"錯誤:\"err.Descripting
else
response.write \"數據備份成功!\"
end if
cnn.close
set cnn=nothing
end if
if act=\"R\" then’恢復數據庫
SQL=\"Restore database WebSiteData from disk='\"Server.MapPath(\"bk\")\"\\\"\"bk.bak\"\"'\"
set cnn=Server.createobject(\"adodb.connection\")
cnn.open \"driver={SQL Server};server=(local);uid=sa;pwd=123;database=master\" ‘以SA用戶身份登錄
cnn.execute(\"exec p_killspid'WebSiteData'\")’結束其他用戶與數據庫連接
cnn.execute SQL ‘恢復數據庫
on error resume next
if err<>0 then
response.write \"錯誤:\"err.Descripting
else
response.write \"數據恢復成功!\"
end if
cnn.close
set cnn=nothing
end if
%>
3 結束語
接收程序改為多線程異步接收方式后,經測試無丟包現象。通過此次實踐筆者認為多線程異步SOCKET接收并不像想象中那么復雜,只要弄清楚各線程的啟動順序、互相之間的關系就可以很容易地實現各種應用。當然,其中還是有些細節問題需要讀者在實際應用中注意的,如:數據接收線程中無法直接在啟動界面中顯示數據(因為同一線程)、如何把DataGridView中數據直接寫入數據庫等,篇幅有限無法在此討論。
本程序在WINDOWS XP、VS 2005中調試通過。
參考文獻:
[1] Silberschatz A.數據庫系統概念[M].楊冬青,馬秀莉,譯.5版.北京:機械工業出版社,2008.
[2] 唐學忠.SQL Server 2000數據庫教程[M].北京:電子工業出版社,2005.
[3] 張躍廷.ASP.NET數據庫系統開發完全手冊[M].北京:人民郵電出版社,2007.