利用 `ADODB.Connection` 執行 `BACKUP DATABASE ... TO DISK` 將 `.bak` 寫至伺服器本地路徑,再用 `ADODB.Stream` 二進位輸出供下載。
<%
Response.Charset = "utf-8"
Session.Codepage = 65001
Response.Buffer = True
Response.Clear
' 連線字串 (依實際修改)
conStr = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=endiva;Password=endiva;Data Source=211.160.78.6"
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open conStr
' 備份檔名含時間戳
bkfname = Server.MapPath(FormatDateTime(Now(), 5) & "database.bak") ' 如 20240115103000database.bak
sqlStr = "BACKUP DATABASE fang TO DISK='" & bkfname & "' WITH INIT"
conn.Execute sqlStr
conn.Close
Response.Write "database [fang] backup success!
"
Response.Write "click download"
' 直接串流下載 (註解區塊,啟用即可)
' Set fn = Server.CreateObject("ADODB.Stream")
' fn.Mode = 3 ' adModeReadWrite
' fn.Type = 1 ' adTypeBinary
' fn.Open
' fn.LoadFromFile bkfname
' Response.ContentType = "application/octet-stream"
' Response.AddHeader "Content-Disposition", "attachment; filename=database.bak"
' Response.BinaryWrite fn.Read
' fn.Close
%>
| 項目 | 說明 |
|---|---|
| 權限 | SQL 登入帳號需 `db_backupoperator` 或 `sysadmin`;IIS 應用程式池身分需對目標資料夾 `Write` 權限。 |
| 路徑 | `Server.MapPath` 對應網站虛擬目錄實體路徑,**備份檔會暴露在 Web 根目錄下**,下載後**必須立即刪除或移出 Web 可存取區**。 |
| 檔案大小 | ASP `Response.BinaryWrite` 受限於 `AspMaxRequestEntityAllowed` / `AspBufferingLimit` (IIS 6.0 預設 200KB),**大型資料庫無法直接下載**,需改用 FTP/網路分享/備份工具。 |
| 安全性 | 生產環境**嚴禁**直接暴露備份下載頁面,應納入驗證/授權/稽核/加密/刪除流程。 |
| 編碼 | `FormatDateTime(Now(), 5)` 為 `YYYYMMDDHHMMSS` 格式 (視地區設定),建議改用 `Year(Now)&Right("0"&Month(Now),2)...` 固定格式。 |
ASP + ADO 備份屬於 **「無工具權限、小資料庫、臨時救急」** 的末招。**生產環境請用標準化備份策略**,確保可恢復性 (RPO/RTO)、安全性、可審計性。