2012年4月8日 星期日

SQL Server Express 自動化管理 (一) 定期備份


本文將介紹如何以 DOS Batch、SQL Scripts、Windows 7 工作排程器來開發一個簡易的資料庫自動備份功能。包括:
  • Backup.bat:DOS Batch 檔案,負責備份的啟動工作。
  • Backup.sql:SQL Scripts 檔案,內含備份指令,由 Backup.bat 呼叫。
  • 工作排程器:Windows 所內附功能,此處將以 Windows 7 進行說明。

建置步驟

1) 在已安裝 SQL Server 2008 R2 Express 的電腦上,建立目錄 C:\Home\Expense,用以存放 Script 檔案以及備份資料 。


2) 建立帳目資料庫 Expense,並以下列 SQL 指令建置 DETAIL_RECORD Table (記載帳目詳細資料)。
use Expense;

Create Table DETAIL_RECORD(
  Record_Date   datetime,
  Expense_Name   nvarchar(50),
  Expense_Amount   int,
  Memo   nvarchar(500)
Constraint PK_HIS_DETAIL_RECORD Primary Key (Record_Date));

Insert Into DETAIL_RECORD (Record_Date, Expense_Name, Expense_Amount, Memo)
Values ('2012/01/01', '花費 1', 10000, '說明 1');

Insert Into DETAIL_RECORD (Record_Date, Expense_Name, Expense_Amount, Memo)
Values ('2012/01/02', '花費 2', 20000, '說明 2');

Insert Into DETAIL_RECORD (Record_Date, Expense_Name, Expense_Amount, Memo)
Values ('2012/01/03', '花費 3', 30000, '說明 3');

Insert Into DETAIL_RECORD (Record_Date, Expense_Name, Expense_Amount, Memo)
Values ('2012/01/04', '花費 4', 40000, '說明 4');

Insert Into DETAIL_RECORD (Record_Date, Expense_Name, Expense_Amount, Memo)
Values ('2012/01/05', '花費 5', 50000, '說明 5');

3) 建立一個供排程作業使用的 Backup.bat DOS Batch 檔案,並將其存放到 C:\Home\Expense 目錄。當被執行時,將呼叫 Backup.sql (詳見下步驟) 來生成一個名為 Jobs.sql 的臨時檔 (內含備份指令),再以 sqlcmd 執行此一臨時檔來完成備份工作。當然也可用 Stored Procedure 來達到相同的效果,這裡只是介紹另一種開發方法供各位參考。
@echo off

rem C:\Home\Expense
rem Expense Table

rem Create Backup Directory ----------
for /f "tokens=1-3 delims=/ " %%a in ('date/t') do (
   set year=%%a
   set month=%%b
   set day=%%c
)

if exist C:\Home\Expense\%year%_%month%_%day% rmdir C:\Home\Expense\%year%_%month%_%day%

mkdir C:\Home\Expense\%year%_%month%_%day%

set backup_path=C:\Home\Expense\%year%_%month%_%day%

rem Create SQL Script File ----------
echo use master;                                  >  C:\Home\Expense\Jobs.sql
echo set nocount on                               >> C:\Home\Expense\Jobs.sql 
echo declare @Backup_Path nvarchar(200)           >> C:\Home\Expense\Jobs.sql
echo select  @Backup_Path = '%backup_path%\'      >> C:\Home\Expense\Jobs.sql
type C:\Home\Expense\Backup.sql                   >> C:\Home\Expense\Jobs.sql
echo set nocount off                              >> C:\Home\Expense\Jobs.sql

rem Execute Generated SQL Script File ----------
sqlcmd -S localhost\SQLEXPRESS -E -d master -i C:\Home\Expense\Jobs.sql

if exist C:\Home\Expense\Jobs.sql del C:\Home\Expense\Jobs.sql   



4) 撰寫 Backup.sql Scripts 檔案,並將其存放到 C:\Home\Expense 目錄。該檔案內容如下:
-- Backup.bat will generate the following two commented lines.
-- declare @Backup_Path   nvarchar(200)    
-- select @Backup_Path = 'C:\Home\Expense\Backup\2012_01_01\' 

declare @SQL_String   nvarchar(2000)
 
-- Backup Command Format --------------------------------
--    BACKUP DATABASE Expense TO  
--       DISK = N'C:\Home\Expense\2012_01_01\Expense.BAK' 
--       WITH NOFORMAT, INIT,  NAME = N'Expense Backup', 
--       SKIP, NOUNLOAD,  STATS = 10 
---------------------------------------------------------
select @SQL_String = 'BACKUP DATABASE Expense TO ' +
                                    ' DISK = N' + '''' + @Backup_Path + 'Expense.BAK' + '''' +
                                    ' WITH NOFORMAT, INIT, NAME = N' + '''' + 'Expense Backup' + '''' + ', ' +
                                    ' SKIP, NOUNLOAD, STATS = 10 '
exec (@SQL_String)


5) 設定工作排程器在每個月 1 號下午 01:00:00 執行備份 :(螢幕左下方) 開始 --> 所有程式 --> 附屬應用程式 --> 系統工具 --> 工作排程器 
(1). 於 "工作排程器" 視窗中,highlight 畫面左方的 "工作排程器程式庫"後,按一下滑鼠右鍵,選取 "建立工作"。
(2). 此時將出現 "建立工作" 視窗 (目前位於 "一般" 頁籤)。
(3). 在 "名稱" 欄位輸入 DB Backup,勾選 "只有使用者登入時才執行"、"以最高權限執行" 欄位後,點選上方 "觸發程序" 頁籤繼續設定。
(4). 於 "觸發程序" 頁籤點選 "新增",出現 "新增觸發程序" 視窗 --
  • 選擇 "每月"。
  • "開始" 欄位,選取 2012/4/1 下午 01:00:00 。
  • "月份" 欄位,選取 "選取每個月"。
  • "日期" 欄位,選取 "1"。
  • 按下 "確定" 功能鍵後,點選上方 "動作" 頁籤繼續設定。
(5). 於 "動作" 頁籤點選 "新增",此時出現 "新的執行動作" 視窗 --
  • "執行" 欄位,選取 "啟動程式"。
  • 按下 "瀏覽",於出現的視窗中,選擇 C:\Home\Expense\Backup.BAT,按 "開啟舊檔"。
  • 按下 "確定" 功能鍵後,再按一次 "確定"。
自 2012/4/1 起,每個月 1 號下午 01:00:00 便會自動將 Expense 資料庫的資料備份至 C:\Home\Expense\YYYY_MM_DD 目錄中。 (YYYY、MM、DD 分別代表備份日期的年、月、日。)