在SQL Server Express版本中没有代理功能如何自动备份数据库

时间:2024-08-09 13:35:32

因为是免费的且单个数据库可以支持到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数据库中产一个存储过程,如下图示:

在SQL Server Express版本中没有代理功能如何自动备份数据库

现立建立几个数据库来测试,环境中我建立了test、test01、test02三个数据库,

在SQL Server Express版本中没有代理功能如何自动备份数据库

在SSMS中执行刚才建立的存储过程,

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

@后面是指定备份文件存放路径,执行结束后可以在D:\SQLBackups文件夹中看到已经备份的文件,没有错误产生,对比上图中的数据库可以看出这就是想要的结果,如下图:

在SQL Server Express版本中没有代理功能如何自动备份数据库

创建命令备份,这里将离开SSMS环境来操作。

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

对上面的命令做下注释

Sqlcmd 是SQL自带的命令工具,

-S(大写)是指定服务器,在本机的话就用点(.)表示,两边都有空格

-E(大写)表明是信任的连接

-Q(大写)命令行查询并且完成后退出

打开CMD窗口,执行上面的语句输出是正常的,说明备份成功了,如下图:

在SQL Server Express版本中没有代理功能如何自动备份数据库

在C盘bak目录中建立了.bat批处理文件,将上面的语句放入文件中,将如下图:

在SQL Server Express版本中没有代理功能如何自动备份数据库

2、创建系统的计划任务进行每天的备份

文件建立好后打开控制面板-管理工具-任务计划,建立一个任务即可,如下图。 在SQL Server Express版本中没有代理功能如何自动备份数据库

附注:简单的语句,此种情况需要每个数据库建立一个存储过程来操作,适合只有一个数据库或是少量的,将上面的存储过程内容改成如下的即可,其它一样操作。

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