2011年9月19日 星期一

MS-SQL Server 2K Backup/Restore

原出處
---
在資料庫總資料量約 1.2GB, 兩部機器間的頻寬最多 512Kbps 的情況下, SQL Server 2000 連 Snapshot 的初始化階段都過不了, Replication 的希望終究破滅.
但無論如何總得想個辦法把資料給弄過來, 管他是土法煉鋼還是不擇手段... 這就是 MIS 的宿命嗎...?
環境:
Host A 與 Host B 分屬不同網段
Host A 與 Host B 同時擁有相同的資料庫
系統皆為 Windows Server 2000 & SQL Server 2000
目的:
以 Windows 工作排程器 (Windows Task Manager) 進行排程
定時備份 Host A 資料庫
自動將 Host A 備份檔案壓縮後, FTP 至 Host B
Host B 自動解壓縮備份資料, 並 Restore 至 Host B 的資料庫
PATH 環境變數:
PATH=%PATH%;C:\Program Files\Microsoft SQL Server\80\TOOLS\BINN;C:\Program Files\WinRAR
Host A:
排程
每週六 19:00 執行完整備份
每週一~六 12:30 執行差異備份
每週一~五 19:00 執行差異備份
C:\PATH\TO\SCRIPTS
action.bat 參數 full = 執行完整備份
參數 diff = 執行差異備份
full_backup.sql 完整備份 T-SQL
full_backup.ftp 將完整備份檔案以 FTP 傳輸至 Host B
diff_backup.sql 差異備份 T-SQL
diff_backup.ftp 將差異備份資料以 FTP 傳輸至 Host B
D:\PATH\TO\BACKUP\
mydb.full 由 full_backup.sql 建立的資料庫完整備份檔案
mydb.full.rar 由 action.bat 產生的完整備份檔案壓縮檔
mydb.diff 由 diff_backup.sql 建立的資料庫差異備份檔案
mydb.diff.rar 由 action.bat 產生的差異備份檔案壓縮檔
ok.full 事先建立的空檔, 給 Host B 判斷用
ok.diff 同上
action.bat
@echo off
if "%1"=="" goto hint
isql -S localhost -U sa -P -i %1_backup.sql > nul
rar a -o+ -m5 D:\PATH\TO\BACKUP\mydb.%1.rar D:\PATH\TO\BACKUP\mydb.%1 > nul
ftp -n -s:%1_backup.ftp > nul
goto end
:hint
echo.
echo Usage: action [ full / diff ]
echo.
:end
rar.exe parameter notes:
a = Add files to archive
-o+ = Overwrite existing files
-m5 = Set compression level (0-store...3-default...5-maximal)
full_backup.sql
backup database mydb
to disk='D:\PATH\TO\BACKUP\mydb.full'
with format
(覆寫備份媒體, 將此備份作為備份媒體中第一個檔案)
go
full_backup.ftp
open HOST_B.IP.ADDR
user
someone
somone's_password
binary
lcd D:\PATH\TO\BACKUP
put mydb.full.rar
ascii
put ok.full
quit
diff_backup.sql
backup database mydb
to disk='D:\PATH\TO\BACKUP\mydb.diff'
with format, differential
go
說明: 覆寫備份媒體, 並指定只有自前次資料庫完整備份以來, 此資料庫中有變動的部份才需要備份.
覆寫備份媒體 (format) 的好處是, restore 時不需指定 file number.
diff_backup.ftp
同 full_backup.ftp, 內容 full 改 diff 即可

Host B:
排程
每五分鐘執行一次 action.bat ( 判斷 Host A 是否已傳入最新的備份資料, 若是則執行資料庫還原)
action.bat
@echo off
if exist ok.full goto full
if exist ok.diff goto diff
goto end
:full
rar e -o+ -ep mydb.full.rar > nul
isql -S localhost -U sa -P -i full_restore.sql > nul
del ok.full
goto end
:diff
rar e -o+ -ep mydb.diff.rar > nul
isql -S localhost -U sa -P -i diff_restore.sql > nul
del ok.diff
:end
rar.exe parameter notes:
e = Extract files to current directory
-o+ = Overwrite existing files
-ep = Exclude paths from names
full_restore.sql
use master
go
alter database mydb set single_user with rollback immediate
go
restore database mydb
from disk='D:\PATH\TO\DBBAK\mydb.full'
with recovery
go
diff_restore.sql
use master
go
alter database mydb set single_user with rollback immediate
go
restore database mydb
from disk='D:\PATH\TO\DBBAK\mydb.full'
with norecovery
(還原完整備份資料庫後還需還原差異資料, 須指定
norecovery)
go
restore database mydb
from disk='D:\PATH\TO\DBBAK\mydb.diff'
with recovery
go

沒有留言:

張貼留言