在SQL Server Express版本中沒有代理功能如何自動備份數據庫


因為是免費的且單個數據庫可以支持到10GB,對於一般企業完全足夠了,也就將就使用了,備份將分為兩步:

1、創建備份腳本

2、創建系統的計划任務進行每天的備份

 

詳細做法如下:

1、創建備份腳本

         打開SSMS/用其它編輯器也可以,新建查詢,輸入如下代碼,這里考慮到要備份所有數據庫,所以使用master數據庫來創建執行腳本,亦可使用超簡單的對於單獨數據庫操作,只需要幾個命令即可,后文會給出示例,以下為完整備份所有數據庫的語句。

USE [master] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO  
 
CREATE PROCEDURE [dbo].[sp_BackupDatabases]  
            @databaseName sysname = null,   --數據庫名稱            
            @backupLocation nvarchar(200)   --備份位置
AS  
      SET NOCOUNT ON;            
      DECLARE @DBs TABLE
      (
            ID int IDENTITY PRIMARY KEY,
            DBNAME nvarchar(500)
      )           
      --用一個表來存放找到的所有數據庫名
      INSERT INTO @DBs (DBNAME)
      SELECT Name FROM master.sys.databases
      where state=0 AND name=@DatabaseName OR @DatabaseName IS NULL ORDER BY Name
           
      -- 過濾掉不需要備份的數據庫(自定不需要備份的數據庫名稱填入括號內)
      DELETE @DBs where DBNAME IN ('master','model','msdb','tempdb')         
            
      DECLARE @BackupFile varchar(100)    --備份文件名稱
      DECLARE @DBNAME varchar(300)        --數據庫名稱
      DECLARE @sqlCommand NVARCHAR(1000)  --命令名稱
      DECLARE @dateTime NVARCHAR(20)      --日期時間
      DECLARE @Loop int                   --循環備份所找到的數據庫                       
            
      SELECT @Loop = min(ID) FROM @DBs   --從第1個開始備份
 
      WHILE @Loop IS NOT NULL   --有數據庫要備份時進行操作
      BEGIN 
      --獲得得數據庫ID
      SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']'
 
      --設置當前日期和時間,格式為年月日
      SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),112),'/','')
 
      --設置備份文件名稱,例如: D:\SQLBak\dbname_FULL_20171121.BAK
      SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK'      
      
      --按類型執行備份操作 
      SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NOSKIP, NOFORMAT'
     
      --開始執行備份命令
      EXEC(@sqlCommand)
 
      --備份下一個數據庫
      SELECT @Loop = min(ID) FROM @DBs where ID>@Loop
 
END

 

在SSMS中執行完上面的代碼后,將會在master數據庫中產一個存儲過程,如下圖示:

 

 

現立建立幾個數據庫來測試,環境中我建立了test、test01、test02三個數據庫,

 

 

在SSMS中執行剛才建立的存儲過程,

EXEC master.dbo.sp_BackupDatabases @backupLocation='D:\SQLBackups\'

@后面是指定備份文件存放路徑,執行結束后可以在D:\SQLBackups文件夾中看到已經備份的文件,沒有錯誤產生,對比上圖中的數據庫可以看出這就是想要的結果,如下圖:

 

創建命令備份,這里將離開SSMS環境來操作。

sqlcmd -S . -E -Q "EXEC master.dbo.sp_BackupDatabases @backupLocation='D:\SQLBackups\'"

對上面的命令做下注釋

Sqlcmd 是SQL自帶的命令工具,

-S(大寫)是指定服務器,在本機的話就用點(.)表示,兩邊都有空格

-E(大寫)表明是信任的連接

-Q(大寫)命令行查詢並且完成后退出

打開CMD窗口,執行上面的語句輸出是正常的,說明備份成功了,如下圖:

 

 在C盤bak目錄中建立了.bat批處理文件,將上面的語句放入文件中,將如下圖:

 

 

2、創建系統的計划任務進行每天的備份

文件建立好后打開控制面板-管理工具-任務計划,建立一個任務即可,如下圖。

 

 

附注:簡單的語句,此種情況需要每個數據庫建立一個存儲過程來操作,適合只有一個數據庫或是少量的,將上面的存儲過程內容改成如下的即可,其它一樣操作。

USE test
CREATE PROCEDURE [dbo].[sp_BackupDatabases]
AS
      --先設置一個變量存放保存位置不然會出錯,因為要按日期來備份,不用的可以去掉這部分,則只需要一條語句即可。
      DECLARE @SavePath NVARCHAR(300)
      SET @SavePath='D:\SqlFullBak\test_BAK'+ CONVERT(VARCHAR, GETDATE(),112)
      BACKUP DATABASE  test  TO DISK = @SavePath WITH INIT, NOSKIP, NOFORMAT    

END

 

 

 PS: 歡迎轉載,轉載請保留出處,謝謝。

參考鏈接:https://support.microsoft.com/en-us/help/2019698/how-to-schedule-and-automate-backups-of-sql-server-databases-in-sql-se


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM