每日自動完整備份本地資料庫,並透過網路共享複製到另一台伺服器(異地備份),可選擇是否保留本地暫存檔。
USE Master;
GO
CREATE PROC [dbo].[bakup_DataBase]
AS
BEGIN
DECLARE @strPsw VARCHAR(50), @strUsr VARCHAR(50), @strCmdShell VARCHAR(300);
DECLARE @strDataBaseName VARCHAR(20), @FullFileName VARCHAR(200);
DECLARE @FileFlag VARCHAR(50), @ToFileName VARCHAR(200);
DECLARE @SQLStr VARCHAR(500), @SQLStr2 VARCHAR(500), @FlagDel VARCHAR(20);
-- 檔名規則:YYYY-MM-DD-HH-MM-SS
SET @FileFlag = REPLACE(REPLACE(CONVERT(CHAR(20), GETDATE(), 20), ':', ''), ' ', '-');
-- 目標機器認證(需具備寫入共享權限的 Windows 帳號)
SET @strUsr = 'DOMAIN\administrator'; -- 修改為實際域\用戶
SET @strPsw = 'password'; -- 修改為實際密碼
-- 建立網路連線
SET @strCmdShell = 'net use \\192.168.0.22\c$ ' + @strPsw + ' /user:' + @strUsr;
-- 要備份的資料庫
SET @strDataBaseName = 'LilianDB';
-- 本地暫存路徑(需 SQL Server 服務帳號有寫入權限)
SET @FullFileName = 'E:\SqlServer自動備份文件\' + 'LilianDB_backup_' + @FileFlag + '.BAK';
-- 遠端儲存路徑(UNC 路徑)
SET @ToFileName = '\\192.168.0.22\D$\OneCardBak\';
-- True=刪除本地暫存檔,False=保留
SET @FlagDel = 'False';
-- 複製與刪除指令
SET @SQLStr = 'copy ' + @FullFileName + ' ' + @ToFileName;
SET @SQLStr2 = 'del ' + @FullFileName;
-- 1. 完整備份到本地
BACKUP DATABASE @strDataBaseName TO DISK = @FullFileName WITH INIT;
-- 2. 建立網路連線
EXEC master..xp_cmdshell @strCmdShell;
-- 3. 複製到遠端
EXEC master..xp_cmdshell @SQLStr;
-- 4. 選擇性刪除本地暫存檔
IF (@FlagDel = 'True')
EXEC master..xp_cmdshell @SQLStr2;
END;
GO
| 參數 | 說明 | 注意事項 |
|---|---|---|
| @strUsr / @strPsw | 目標機器的 Windows 認證 | 帳號需具備遠端共享寫入權限;建議建立專用備份帳號,最小權限原則 |
| @strCmdShell | net use 建立 IPC$ 連線 | 若目標在同網域且 SQL 服務帳號已有權限,可省略此步 |
| @FullFileName | 本地暫存完整路徑 | SQL Server 服務啟動帳號必須有此目錄寫入權限 |
| @ToFileName | 遠端 UNC 路徑 | 確保防火牆開放 445/139 埠,共享權限正確 |
| xp_cmdshell | 執行 OS 指令 | 需啟用:EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;,用畢建議關閉 |
| WITH INIT | 覆蓋同名備份檔 | 配合時間戳檔名實際上不會重複,保留以防萬一 |
EXEC dbo.bakup_DataBase;WITH ENCRYPTION;2005 需第三方工具或透明資料庫加密 (TDE) 為 Enterprise 版專屬。RESTORE VERIFYONLY)。