iT邦幫忙

0

如何自動壓縮MS-SQL的bak及交易記錄檔

etsinz 2010-12-07 10:59:5010854 瀏覽

請問各位大大,我需要做異地備份,假設在a地,每次都有15-20g的資料容量,而每次備份到b地都要花二三天時間(VPN 2M),請問有什麼方法可以讓資料庫自動在每天固定時間自行壓縮成一個縮壓檔,然後我再利用原本的備份軟體備份到B地。

13
liounoon
iT邦新手 1 級 ‧ 2010-12-07 19:39:00
最佳解答

我來借花獻佛一下(所有資料都侍從網路上借用的),目前用在公司主機上,很好!設定排程後每天自動幫我備份。

  1. 首先先在a地主機安裝好7-zip壓縮軟體(免費好用),將7-zip資料夾底下7z.exe複製到windows\system32底下。
  2. 當然『MS-SQL的bak及交易記錄檔』,自己要先設定備份到自己指定的目錄。
  3. 底下虛線內複製起來存成batch檔(檔名自取,路徑自己改),請注意!因為我的MS-SQL的bak記錄檔經壓縮後會全部砍掉(以免佔用空間),故壓縮後的檔案會自動儲存到另一資料夾,而儲存的壓縮檔會自動加入年月日(西元),如SQL20101207.7z,如要紀錄到秒,則改為:
    %date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%

@echo off
7z a X:\SQL-zip\SQL%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.7z X:\SQL
del /Q /S X:\SQL

  1. 底下虛線內複製起來存成vbs檔(路徑自己改),
    『天數』:要保留在a地主機壓縮檔的天數,超過時間就自動砍掉;
    『路徑』:存放壓縮後的『MS-SQL的bak及交易記錄檔』

'自動化檔案維護管理程式
'天數
daysAgo = 3

'路徑
dirPath = "X:\\SQL-zip"

'副檔名
extName = ".7z"

';;;;;程式開始;;;;;
Set fs = CreateObject("Scripting.FileSystemObject")
Set w = WScript.CreateObject("WScript.Shell")

Set f = fs.GetFolder(dirPath)
Set fc = f.Files

dateBefore = Now() - daysAgo

For Each ff in fc
fileName = ff.Name
fileDate = ff.DateLastModified

If Right(fileName, Len(extName)) = extName And fileDate < dateBefore Then
fs.DeleteFile(dirPath & "\\" & fileName)
End If
Next

  1. 以上2個檔案可以放在program files底下或哪裡自行決定。
  2. 建立2個『排程』,batch檔執行時間要在 vbs檔之前,間隔時間視乎壓縮的時間長短(要計算,最好自己紀錄一次然後時間拉長一些)。
  3. 網路上找一個可以支援ftp同步的軟體(自己手動也可),將a地主機備份到b地主機。
  4. 如果懂vbs,可將上述2個檔合而唯一造福其他人更好(我不會)。
8
jackytsao
iT邦研究生 1 級 ‧ 2010-12-07 13:06:50

你可利用 WINZIP 的 COMMAND Line 來排程壓縮檔案

etsinz iT邦新手 5 級 ‧ 2010-12-07 15:09:24 檢舉

但我我每日產生出來的檔案名字會不一樣,這會影嚮嗎

etsinz iT邦新手 5 級 ‧ 2010-12-09 12:33:11 檢舉

請問該如何用呢

4
cym
iT邦新手 5 級 ‧ 2010-12-09 00:37:05

有沒考慮過使用發佈及訂閱的功能,而在B地直接備份可以解決備份速度的問題,不過必須在B地多架一部server。

etsinz iT邦新手 5 級 ‧ 2010-12-09 09:06:45 檢舉

cym提到:
而在B地直接

我們目前的支援就只能用vpn傳輸而以

cym iT邦新手 5 級 ‧ 2010-12-09 13:44:25 檢舉

發佈訂閱和備份機制並不相同,發佈訂閱它只需先同步一次,後續的資料更新皆只更新變動資料,所以傳送的資料量並不多,佔用的頻寬也不太大,而且您可以設定發佈的時間間隔,可以即時也可以幾分鐘也可以幾小時,好像也可以設定系統閒置時間同步。
這樣還有另一好處是如果A地的資料庫掛了B地是可以直接上線使用的,不過AP可能要變動就是了,如果是使用三層式架構那變更中間層即可,缺點是透過2M的vpn也許會慢了點。

etsinz iT邦新手 5 級 ‧ 2010-12-09 17:43:55 檢舉

b地主要是做備份而已

2
jsperng
iT邦研究生 1 級 ‧ 2010-12-10 14:47:48

以下是自己為公司寫的,只是我們是備份到DVD-RW,給您參考。
利用7-zip執行壓縮和VBS同目錄內,大於500K且不是.ZIP&.RAR的檔案
1.將下列程式碼複製起來存成vbs檔,放置在SQL備份同目錄內,壓縮後檔名為原始檔名+".ZIP"
2.建立『排程』於備份時間執行這支VBS,本VBS只有壓縮+刪除原檔功能,不包含異地備份功能

&lt;pre class="c" name="code">'目的:壓縮資料庫備份檔及刪除原始檔,以利備份到異地
Dim fso, f, f1, fc, nn, n1, ns
'------------------------------------
ns = 500000 '長度大於 500k 才壓縮
Set WshShell = WScript.CreateObject("WScript.Shell") '取得 Shell 物件,給 Run 用
Set fso = CreateObject("Scripting.FileSystemObject") '建立 FileSystemObject 物件
'------------------------------------
	Set f = fso.GetFolder(".") '傳回對應到指定路徑中資料夾的 Folder 物件
	Set fc = f.Files '傳回一個包含在指定資料夾中組成所有File物件的Files集合物件,其中包含設定隱藏和系統檔案屬性的資料夾

	'------ 壓縮資料夾內的各個檔案 ------
	For Each f1 in fc
		If Right(f1.name,4) &lt;> ".zip" and Right(f1.name,4) &lt;> ".rar" and Right(f1.name,4) &lt;> ".vbs" Then

			If f1.size > ns Then '長度大於 ns 才壓縮
				nn = " """ & f1.path & ".zip"" " '壓縮後檔名,用雙引號包住,前後各加一個空白
				sCommand = """c:\Program Files\7-Zip\7z.exe""" &" a -tzip -mx=7" & nn & """" & f1.path & """"
				'MsgBox(sCommand)

				If WshShell.Run(sCommand, , true) = 0 Then '執行 7-Zip 壓縮檔案
					On Error Resume Next
						f1.delete '壓縮檔案成功後,刪除原始檔
					On Error GoTo 0
				End If
			'Wscript.Echo f1.path & "/" & nn '顯示新舊檔案之路徑檔名
			End If
		End If
	Next

我要發表回答

立即登入回答