[ASP.NET] 自動備份資料庫

由於常常遇到客戶家的 DB 是 SQL Express,每當建置完系統後都會有備份資料庫的需求,
偏偏 SQL Express 不提供自動備份功能,因此只能自己實作排程備份。

基本上,Window Server上要做排程,最簡單就是用內建的工作排程器,必須要寫一個console程式,
或是用bat檔執行SQL指令; 不過,我目前都是用Hanfire,可以產生背景處理程序完成排程工作,並且可以直接在原本的網站專案上寫排程的程式碼,實在是非常的好用。

有了排程系統,接下來就只要準備備份的SQL指令,而除了資料庫備份外,建議在備份後清理一下log file,
因為log file越到後期會肥大,動則好幾10G… 不但佔滿硬碟空間,網站也會跑得比較慢。

備份資料庫的指令碼

1
2
3
4
5
6
-- 準備備份參數
DECLARE @path nvarchar(MAX), @name nvarchar(MAX)
SET @path = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\MyDatabase.bak'
SET @name = N'MyDatabase-完整資料庫備份'
-- 執行備份命令
BACKUP DATABASE [CPCBoard] TO DISK = @path WITH NOFORMAT, NOINIT, NAME = @name, SKIP, NOREWIND, NOUNLOAD, STATS = 10

清理記錄檔案的指令碼

1
2
3
4
5
6
7
8
9
USE [MyDatabase];
-- 轉換資料庫到簡易模式
ALTER DATABASE [MyDatabase]
SET RECOVERY SIMPLE;
-- 壓縮 log file 到 1 MB.
DBCC SHRINKFILE (N'MyDatabase_log', 1);
-- 回復資料庫到恢復模式
ALTER DATABASE [MyDatabase]
SET RECOVERY FULL;