在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

posted on 2017-11-22 13:20  凉拌土豆块  阅读(3716)  评论(1编辑  收藏  举报

导航