SQL Server 2008 Express-“最佳”备份解决方案?


20

使用SQL Server 2008 Express时,您会建议哪些备份解决方案?我对SQL Server还是很陌生,但是由于我来自MySQL背景,因此我想到了在另一台计算机上设置复制并只对该服务器进行Xcopy备份的想法。

但是不幸的是,Express Edition中没有复制功能。

该站点的访问量很高,因此没有延迟和停机时间。我还考虑每天进行两次备份。

你会推荐什么?我可以使用多台计算机,但是由于使用Express版本,因此我不知道是否对我有帮助。


有人知道仅使用Windows Server Backup这样做是否有问题?
詹姆斯,

Answers:


30

SQL Server Express 2008支持数据库备份。它缺少允许计划备份的SQL Agent和用于创建备份任务的维护计划向导。

您可以通过两种不同的方式备份数据库:

  1. 使用Microsoft SQL Server Management Studio Express,该菜单在“任务”下的每个数据库的右键单击菜单上均具有“备份”选项。
  2. 使用T-SQL手动编写备份脚本。阅读有关T-SQL BACKUP命令MSDN文档
    语法类似:BACKUP DATABASE MyDatabase TO DISK='C:\MyDatabase.bak';

如果要计划备份作业,则必须编写一个T-SQL脚本,然后使用Windows任务计划来调用SQLCmd以按照您感兴趣的每个计划运行脚本:

 sqlcmd -s server_name\sqlexpress -i C:\SqlJobs\backup.sql -o C:\Logs\output.txt

1
BACKUP语法如下所示:BACKUP DATABASE MyDatabase TO DISK ='C:\ MyDatabase.bak';
Martin Marconcini,2009年

感谢您提供的这些信息,我将尝试一下。
亚历森

使用T-sql脚本时,请确保您的数据库名称不包含空格。
redknight 2010年

+1其他信息:-S ".\SomeInstance"如果您从sqlcmd获得登录错误,请不要忘记通过提及实例名称。
Tomalak 2010年

如果您包括用于运行备份的SQL,那么对于我们其余的人来说,寻找相同的答案将很有帮助。
伊恩·博伊德

6

我使用SQLBackupAndFTP-出色而简单的产品。


sqlbackupandftp最好..如果您要返回+压缩+自动删除(在指定的日期之后)
suraj jain 2012年

是的,我也用这个。效果很好。
艾伦B

5

我写了备份脚本供自己使用,并按splattne的说明安装:

----- Version: 2.0 - 2009-12-12 - SQL 2000 Compatible
----- Pham Kim Ngan (jbngan@gmail.com)
----- Usage:
-- Copy 7za.exe (http://www.7-zip.org/download.html - Command Line Version) to @CFG_BACKUP_PATH
-- Modify @CFG_BACKUP_PATH = <Backup Store Path> - no long filename/directory please
-- Modify @CFG_DAYS_DELETE = Days to keep backups
-- Enable 'xp_cmdshell' (SQL 2005/EXPRESS or higher)

----- Configuration Variables
DECLARE @CFG_BACKUP_PATH NVARCHAR(256)
DECLARE @CFG_DAYS_DELETE INT

SET @CFG_BACKUP_PATH = 'C:\DatabaseBackup'
SET @CFG_DAYS_DELETE = 30

DECLARE @Today DATETIME
DECLARE @TodayName CHAR(8)
SET @Today = GETDATE()
SET @TodayName = CONVERT(CHAR(8), @Today, 112)

DECLARE @id INT
DECLARE @name VARCHAR(50)
DECLARE @path VARCHAR(256)
DECLARE @cmd VARCHAR(256)

----- Create Temporarity Directory
DECLARE @TempDir VARCHAR(256)
SET @TempDir = @CFG_BACKUP_PATH + '\' + CONVERT(VARCHAR(256), NEWID())
SET @cmd = 'md ' + @TempDir
EXEC xp_cmdshell @cmd, no_output

----- List of current databases, only 'ONLINE' databases to be backup
DECLARE @dbList TABLE
    (
      dbno INT IDENTITY,
      dbname NVARCHAR(256)
    )

INSERT  INTO @dbList ( dbname )
        SELECT  name
        FROM    master.dbo.sysdatabases
        WHERE   ( name NOT IN ( 'tempdb' ) )
                AND DATABASEPROPERTYEX(name, 'Status') = 'ONLINE'


------ Starting backup, one by one
SELECT  @id = dbno,
        @name = dbname
FROM    @dbList
WHERE   dbno = 1
WHILE @@ROWCOUNT = 1
    BEGIN
        PRINT N'++ Backup: ' + @name
        SET @path = @TempDir + '\' + @name + '.bak'

        BACKUP DATABASE @name TO DISK = @path

        SELECT  @id = dbno,
                @name = dbname
        FROM    @dbList
        WHERE   dbno = @id + 1
    END

PRINT N'++ Compressing: ' + @TempDir

----- Delete output file if existed
SET @cmd = 'del /f /q ' + @CFG_BACKUP_PATH + '\' + @TodayName + '.ZIP'
EXEC xp_cmdshell @cmd, no_output

DECLARE @Count INT
DECLARE @StartTime DATETIME
SET @StartTime = GETDATE()
----- Compress, -mx1 = Set Compression Ratio to 1 (very low)
SET @cmd = @CFG_BACKUP_PATH + '\7za.exe a -bd -y -tzip -mx1 '
SET @cmd = @cmd + @CFG_BACKUP_PATH + '\' + @TodayName + '.ZIP ' + @TempDir + '\*.bak"'
EXEC xp_cmdshell @cmd, no_output

SET @Count = DATEDIFF(second, @StartTime, GETDATE())
PRINT N'++ Compression Time: ' + CONVERT(VARCHAR, @Count) + ' seconds'
SET @Count = DATEDIFF(second, @Today, GETDATE())
PRINT N'++ Total Execution Time: ' + CONVERT(VARCHAR, @Count) + ' seconds'

---- Delete temporarity directory
SET @cmd = 'rd /s /q ' + @TempDir
EXEC xp_cmdshell @cmd, no_output

---- Delete previous backup versions
DECLARE @OlderDateName CHAR(8)
SET @OlderDateName = CONVERT(CHAR(8), @Today - @CFG_DAYS_DELETE, 112)

----- List all .ZIP files
CREATE TABLE #delList
    (
      subdirectory VARCHAR(256),
      depth INT,
      [file] BIT
    )
INSERT  INTO #delList
        EXEC xp_dirtree @CFG_BACKUP_PATH, 1, 1
DELETE  #delList
WHERE   RIGHT(subdirectory, 4) <> '.ZIP'

SELECT  @Count = COUNT(1)
FROM    #delList
PRINT N'++ Number of Backups: ' + CONVERT(NVARCHAR, @Count)

SELECT TOP 1
        @name = subdirectory
FROM    #delList
WHERE   LEN(subdirectory) = 12
        AND RIGHT(subdirectory, 4) = '.ZIP'
        AND REPLACE(subdirectory, '.ZIP', '') < @OlderDateName

WHILE ( @@ROWCOUNT = 1 ) 
    BEGIN
        PRINT N'++ Delete Older Backup: ' + @name
        SET @cmd = 'del /f /q ' + @CFG_BACKUP_PATH + '\' + @name
        EXEC xp_cmdshell @cmd, no_output

        DELETE  #delList
        WHERE   subdirectory = @name

        SELECT TOP 1
                @name = subdirectory
        FROM    #delList
        WHERE   LEN(subdirectory) = 12
                AND RIGHT(subdirectory, 4) = '.ZIP'
                AND REPLACE(subdirectory, '.ZIP', '') < @OlderDateName
    END

DROP TABLE #delList

PRINT N'++ Done.'
PRINT ''
PRINT ''
PRINT ''

2

我使用ExpressMaint,它可以很好地完成预定任务。只需为您正在执行的工作类型传递适当的参数即可。

源代码也在那里。我们对其进行了少许更改,以在失败的应用程序事件日志中添加一个条目。


1

根据UndertheFold的帖子,我进行了一些谷歌搜索,并发现了ExpressMaint的详细信息。我以前从未见过,所以很高兴找到它。

仅供参考,网页是http://expressmaint.codeplex.com/

然后,我使用发现的示例之一创建了我计划每天在夜间运行的此批处理文件。

c:\expressmaint\expressmaint -S (local)\SQLExpress -D ALL_USER -T DB -R E:\backups\sqlexpress\backupreports -RU WEEKS -RV 1 -B E:\backups\sqlexpress -BU DAYS -BV 4 -V -C

这需要一个备份,每个备份(-BU)保留四天,因此如果有损坏,您将获得历史记录。日志(-RU)保存一周。

我只使用了几个星期,但我对此感到非常满意,因为它是一种无需干预的方法。我在本地将备份放在第二个磁盘上,然后使用JungleDiskAmazon EC2云存储进行异地备份。


expressmaint的问题在于它不支持SQL Server 2008 R2。它可以与2008一起使用,并且在安装2008然后升级到2008 R2时可以使用,但是在全新安装的2008 R2上找不到数据库。这是提交补丁程序的已知错误,但可执行文件尚未使用补丁程序进行更新。
詹姆斯

1

您可以使用DBSave。这是一个很棒的免费软件工具,用于备份和还原MS SQL Server。设置和使用非常简单。


0

我正在使用Windows Scheduler作业通过使用批处理文件每隔几个小时备份一次SQL Server Express数据库。似乎工作正常。


您还应该提到批处理文件如何备份数据库。
伊恩·博伊德

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.