SQL Server自动备份

30

有哪些软件产品推荐用于创建SQL Server 2008数据库的自动备份?

备份应在不使数据库离线/脱机的情况下进行。


只需使用 SqlBak https://sqlbak.com - user6155322
3个回答

73
如果你正在使用SQL Server Express,你将找不到用于运行定期备份的用户界面。
在这种情况下,您需要使用Windows计划任务或类似工具运行批处理文件。

不要忘记使用拥有足够权限访问SQL Server的用户。

在批处理文件中

"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

请记得在SQL安装文件夹内设置备份位置。我曾经遇到过“SQL Server操作系统错误5: 5(拒绝访问)”的问题,因为我将备份设置到了“官方”的SQL服务器安装文件夹之外(SQL Server数据库引擎服务帐户必须具有在新文件夹中读/写的权限)。或者,可以查看此解决方案 - full_prog_full
有没有一种方法可以将时间戳附加到备份文件的名称上,以便每次不会被覆盖? - rodsarria
备份到磁盘时,NOREWIND和NOUNLOAD选项是否有任何影响?我认为没有,因为它们是“磁带选项”。 - jacktric

17

11

我遇到了一些困难,因为不清楚如何处理生成具有不同名称的文件的程序,以便一次运行不会覆盖另一个。最终创建了以下Windows批处理文件。

:: Daily Backup of SQLSERVER databases

:: AKC 30 Apr 2011

::

:: Set environment variables

SET SQLCMDPASSWORD=xxxxxx
SET BACKUPDIR=C:\backups\db\

SET SCRIPTDIR=D:\Public\DB\batch_scripts\

:: Issue backup commands from a sql script

SQLCMD -U a_backup -S SERVER\SQLEXPRESS -i %SCRIPTDIR%daily_backup.sql

:: Tidy Up Old Backup Files (keep for 5 days)

FORFILES /P %BACKUPDIR% /S /M "*.bak" /D -5 /C "cmd /c del @path"

a_backup是我的SQL Server登录带有备份权限。相应的SQL语句为:

DECLARE @thistime nvarchar(25);

DECLARE @filename nvarchar(255);

SET @thistime = CONVERT(nvarchar,GETDATE(),126);

SET @filename = "$(BACKUPDIR)" + N'PASL' + SUBSTRING(@thistime,1,10) + N'_DB.bak';

BACKUP DATABASE DB_live

    TO DISK = @FILENAME

    WITH INIT;

GO

对我来说,发现“FORFILES”命令清理旧文件是关键发现。

交易日志的等效物是

:: Transaction Log Backups of SQLSERVER databases

:: AKC 30 Apr 2011

:: Run at reasonably spread out times of the day

:: Set environment variables

SET SQLCMDPASSWORD=xxxxxx
SET BACKUPDIR=C:\backups\db\
SET SCRIPTDIR=D:\Public\DB\batch_scripts\

:: Issue backup commands from a sql script

SQLCMD  -U a_backup -S SERVER\SQLEXPRESS -i %SCRIPTDIR%tlog_backup.sql

使用 SQL 文件

DECLARE @thistime nvarchar(25);

DECLARE @filename nvarchar(255);

SET @thistime = CONVERT(nvarchar,GETDATE(),126);

SET @filename = "$(BACKUPDIR)" + N'PASL' + SUBSTRING(@thistime,1,10) + SUBSTRING(@thistime,11,3) + N'_LOG.bak';

BACKUP LOG DB_live

    TO DISK = @FILENAME

    WITH INIT;

GO

我应该注意到,数据库文件在我的 D: 驱动器上,这就是为什么我将备份放在 C: 驱动器上的原因。

每日备份被设置为作业,以在 Windows 任务计划程序中每天 4:00am 运行。事务日志备份被设置为每天在 8:00am 运行,每 4 小时重复一次,在 13 小时后完成(导致它在每天的上午 8 点、中午 12 点、下午 4 点和晚上 8 点运行)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接