如何使用 SQL Server Express 安排每日备份? [复制]

Posted

技术标签:

【中文标题】如何使用 SQL Server Express 安排每日备份? [复制]【英文标题】:How can I schedule a daily backup with SQL Server Express? [duplicate] 【发布时间】:2010-10-04 00:19:10 【问题描述】:

我正在运行一个使用 SQL Server Express (2005) 作为后端的小型 Web 应用程序。我可以使用 SQL 脚本创建备份,但是,我想每天安排一次。作为额外的选项(应该有),我想只保留最后的 X 备份(显然是为了节省空间的原因)任何指针?

[编辑] SQL Server 代理在 SQL Server Express 中不可用...

【问题讨论】:

您可以简单地使用 SQLBackupAndFTP sqlbackupandftp.com 你可以看看这个,***.com/a/29893738/1101112。这是一个批处理文件,用于制作 sql server express 数据库备份并保留最近 10 个备份(自动删除旧的)。它应该与 windows 调度程序一起使用,以使其定期自动执行。 【参考方案1】:

您不能在 SQL Server Express 中使用 SQL Server 代理。 我之前的做法是创建一个 SQL 脚本,然后每天将其作为计划任务运行,您可以有多个计划任务以适应您的备份计划/保留。我在计划任务中使用的命令是:

"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -i"c:\path\to\sqlbackupScript.sql"

【讨论】:

可爱、漂亮、漂亮。干杯! 只有在你对服务器有这种访问权限时才有效 微软提供了一个很好的脚本和详细的说明来完成这个任务。它缺少的主要内容是清理旧备份文件。 support.microsoft.com/kb/2019698【参考方案2】:

我们使用了以下组合:

    Cobian Backup 用于调度/维护

    ExpressMaint 用于备份

这两个都是免费的。该过程是编写 ExpressMaint 脚本以将备份作为 Cobian“备份前”事件。我通常让它覆盖以前的备份文件。然后 Cobian 从中取出一个 zip/7zip 并将它们存档到备份文件夹中。在 Cobian 中,您可以指定要保留的完整副本的数量、进行多个备份周期等。

ExpressMaint 命令语法示例:

expressmaint -S HOST\SQLEXPRESS -D ALL_USER -T DB -R logpath -RU WEEKS -RV 1 -B backuppath -BU HOURS -BV 3 

【讨论】:

科比安死了;( @PiotrKula Cobian Backup 仍然是免费软件,可从该站点获得cobiansoft.com【参考方案3】:

MSSQLTips 的人们有一些非常有用的文章,与此最相关的是“Automating SQL Server 2005 Express Backups and Deletion of Older Backup Files”

基本方法是使用 Windows 任务计划程序设置两个任务。一项任务运行一个 TSQL 脚本,该脚本为所有 MSSQL 数据库(TEMPDB 除外)生成单独的备份文件,其中数据库名称和文件名中的日期/时间戳记到指定目录中。第二个任务运行一个 VBScript 脚本,该脚本遍历该目录并删除所有 .BAK 扩展名超过 3 天的文件。

这两个脚本需要对您的环境进行小幅编辑(路径、保留这些数据库转储的时间),但非常接近即插即用。

请注意,如果您对这些或目录权限马虎,则可能存在安全隐患,因为它们是纯文本文件,需要以某种级别的权限运行。不要马虎。

【讨论】:

另外值得注意的是 - 如果您使用 DFS 自动将备份文件推送到其他系统,请记住 .bak 通常是排除的扩展名 - 要么更改它,要么更改过滤。跨度> 【参考方案4】:

Eduardo Molteni 给出了一个很好的答案:

SQL Server Automated Backups

使用 Windows 计划任务:

在批处理文件中

"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE" -S 
(local)\SQLExpress -i D:\dbbackups\SQLExpressBackups.sql

在 SQLExpressBackups.sql 中

BACKUP DATABASE MyDataBase1 TO  DISK = N'D:\DBbackups\MyDataBase1.bak' 
WITH NOFORMAT, INIT,  NAME = N'MyDataBase1 Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

BACKUP DATABASE MyDataBase2 TO  DISK = N'D:\DBbackups\MyDataBase2.bak' 
WITH NOFORMAT, INIT,  NAME = N'MyDataBase2 Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO

【讨论】:

无论如何要在创建的备份文件上附加一个时间戳,这样它就不会写入现有文件? 太棒了!另外,我必须按照这个来获得创建备份文件的正确权限:***.com/questions/3960257/… Damien > 如果您想备份更多天,请将 INIT 参数替换为 NOINIT。 INIT 意味着备份文件总是从头开始重写。您应该使用带有时间戳的方式,或者使用将备份附加到现有文件的 NOINIT 参数。使用类似 RETAINDAYS 参数是一个很好的做法,否则备份文件将永远增长。如果是时间戳,您必须自己解决。更多信息请见technet.microsoft.com/en-us/library/ms186865.aspx 记得在 SQL 安装文件夹中设置备份位置。我得到:“SQL Server 操作系统错误 5:5(访问被拒绝。)”因为我将备份设置为超出“官方”SQL Server 安装文件夹(SQL Server 数据库引擎服务帐户必须具有读/写权限在新文件夹中)。或者,查看this solution 对于 SQL Server 2014 Express,SqlCmd.exe 现在位于:“C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\SQLCMD.EXE”跨度> 【参考方案5】:

只需使用this 脚本即可动态备份服务器上的所有数据库。然后根据文章创建批处理文件。创建两个批处理文件很有用,一个用于完整备份,一个用于差异备份。然后在Task Scheduler中创建两个任务,一个用于full,一个用于diff。

-- // Copyright © Microsoft Corporation.  All Rights Reserved.
-- // This code released under the terms of the
-- // Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)
USE [master] 
GO 
/****** Object:  StoredProcedure [dbo].[sp_BackupDatabases] ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

-- ============================================= 
-- Author: Microsoft 
-- Create date: 2010-02-06
-- Description: Backup Databases for SQLExpress
-- Parameter1: databaseName 
-- Parameter2: backupType F=full, D=differential, L=log
-- Parameter3: backup file location
-- =============================================

CREATE PROCEDURE [dbo].[sp_BackupDatabases]  
            @databaseName sysname = null,
            @backupType CHAR(1),
            @backupLocation nvarchar(200) 
AS 

       SET NOCOUNT ON; 

            DECLARE @DBs TABLE
            (
                  ID int IDENTITY PRIMARY KEY,
                  DBNAME nvarchar(500)
            )

             -- Pick out only databases which are online in case ALL databases are chosen to be backed up
             -- If specific database is chosen to be backed up only pick that out from @DBs
            INSERT INTO @DBs (DBNAME)
            SELECT Name FROM master.sys.databases
            where state=0
            AND name=@DatabaseName
            OR @DatabaseName IS NULL
            ORDER BY Name

            -- Filter out databases which do not need to backed up
            IF @backupType='F'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','AdventureWorks')
                  END
            ELSE IF @backupType='D'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
                  END
            ELSE IF @backupType='L'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
                  END
            ELSE
                  BEGIN
                  RETURN
                  END

            -- Declare variables
            DECLARE @BackupName varchar(100)
            DECLARE @BackupFile varchar(100)
            DECLARE @DBNAME varchar(300)
            DECLARE @sqlCommand NVARCHAR(1000) 
        DECLARE @dateTime NVARCHAR(20)
            DECLARE @Loop int                  

            -- Loop through the databases one by one
            SELECT @Loop = min(ID) FROM @DBs

      WHILE @Loop IS NOT NULL
      BEGIN

-- Database Names have to be in [dbname] format since some have - or _ in their name
      SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']'

-- Set the current date and time n yyyyhhmmss format
      SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' +  REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')  

-- Create backup filename in path\filename.extension format for full,diff and log backups
      IF @backupType = 'F'
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK'
      ELSE IF @backupType = 'D'
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_DIFF_'+ @dateTime+ '.BAK'
      ELSE IF @backupType = 'L'
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_LOG_'+ @dateTime+ '.TRN'

-- Provide the backup a name for storing in the media
      IF @backupType = 'F'
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' full backup for '+ @dateTime
      IF @backupType = 'D'
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' differential backup for '+ @dateTime
      IF @backupType = 'L'
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' log backup for '+ @dateTime

-- Generate the dynamic SQL command to be executed

       IF @backupType = 'F' 
                  BEGIN
               SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'
                  END
       IF @backupType = 'D'
                  BEGIN
               SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'        
                  END
       IF @backupType = 'L' 
                  BEGIN
               SET @sqlCommand = 'BACKUP LOG ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'        
                  END

-- Execute the generated SQL command
       EXEC(@sqlCommand)

-- Goto the next database
SELECT @Loop = min(ID) FROM @DBs where ID>@Loop

END

批处理文件可以是这样的:

sqlcmd -S localhost\myDB -Q "EXEC sp_BackupDatabases @backupLocation='c:\Dropbox\backup\DB\', @backupType='F'"  >> c:\Dropbox\backup\DB\full.log 2>&1

sqlcmd -S localhost\myDB -Q "EXEC sp_BackupDatabases @backupLocation='c:\Dropbox\backup\DB\', @backupType='D'"  >> c:\Dropbox\backup\DB\diff.log 2>&1

这种方法的优点是添加新数据库或删除数据库时不需要更改任何内容,甚至不需要在脚本中列出数据库。 JohnB 的回答对于具有一个数据库的服务器来说更好/更简单,这种方法更适合多数据库服务器。

【讨论】:

工作如梦!谢谢你! +1【参考方案6】:

你可以在服务器对象中创建一个备份设备,让我们说

BDT测试

然后创建一个包含以下命令的批处理文件

sqlcmd -S 192.168.1.25 -E -Q "BACKUP DATABASE dbtest TO BDTEST"

让我们说出名字

backup.bat

那你就可以打电话了

backup.bat

根据您的方便在任务调度程序中

【讨论】:

以上是关于如何使用 SQL Server Express 安排每日备份? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 代码将 SQL Server CE 迁移到 SQL Server 2012 Express

SQL server 2008 express安装失败 数据库引擎 sql server复制安装失败

如何使用 SQL Server Express 安排每日备份? [复制]

如何使用VS2008中集成的SQL Server 2005 Express?

如何将所有数据库(快速)自 sql server 2008 express 传递到 sql server 2008 R2(无 express)

如何连接到 SQL Server 2008 Express 的本地实例