使用Windows批处理命令定时备份sqlserver数据库

1、写一个sql 脚本来作数据库备份。

例如:backup.sql ,我们把它放在 F:\Database_Backup下,以后的备份文件也放在这个目录下。

复制代码

GO 
DECLARE 
@backupTime VARCHAR(20)
DECLARE 
@fileName VARCHAR(1000)  
SELECT
 @backupTime=(CONVERT(VARCHAR(8), GETDATE(), 112) +REPLACE(CONVERT(VARCHAR(5), GETDATE(), 114), ':', ''))  
SELECT
 @fileName='F:\Database_Backup\DB_'+@backupTime+'.bak'
backup database DBName to disk=@fileName

复制代码

DBName就是你的数据库的名称了,备份的文件名形如 DB_201302252140.bak。

2、写一个批处理文件,执行此sql脚本。

例如:backup_database.bat ,我们也把它放在 F:\Database_Backup下。

@echo off
osql -S " MicroWin10-1536\SQLEXPRESS" -U "sa" -P "123" -i "F:\Database_Backup\backup.sql"

双击运行批处理文件测试,如没有报错表示创建成功。

注:如果批处理运行错误,在 批处理命令的后面加上 pause,批处理命令就不会闪过,可以查看出错信息

3、新建一个Windows计划任务,定期(比如每天)执行此批处理命令。

选择管理工具里的“计划任务”

选择“创建基本任务”

输入任务名称和描述

选择执行时间

选择操作为“启动程序”

下一步的程序或脚本就选择我们建好的 backup_database.bat

 

到此,定时备份已经做好了,到了时间自动进行备份

但是还原备份时,显示

System.Data.SqlClient.SqlError: 尚未备份数据库<数据库名称>的日志尾部。如果该日志包含您不希望丢失的工作,请使用 BACKUP LOG WITH NORECOVERY 备份该日志。请使用 RESTORE 语句的 WITH REPLACE 或 WITH STOPAT 子句来只覆盖该日志的内容。 (Microsoft.SqlServer.Smo)

解决方法:

经过网上查阅的资料,有两种方法可以解决,只需要在还原的时候使用下面两种方法中的一种:

1、还原数据库时,点击选择页上的选项,勾选覆盖现有数据库(WITH REPLACE),点确定后即可成功还原数据库(推荐此方法)。

使用Windows批处理命令定时备份sqlserver数据库_第1张图片

 

2、进行还原操作时,点击选择页上的选项,勾选保持源数据库处于正在还原状态(BACKUP LOG WITH NORECOVERY),即可解决问题。

使用Windows批处理命令定时备份sqlserver数据库_第2张图片

 

从错误信息中我们可以看出,出现这种问题主要是在进行还原操作时,该Sql Server数据库正好在写入日志,所以导致操作冲突。上面的两种方法都可解决尚未备份数据库日志尾部的问题。

定时删除文件

至于删除过期的备份文件,我们也可以通过任务计划来完成。forfiles命令,可以实现批量删除文件,用法可以自行百度。我们写一个批处理文件delete_bakFile.bat,内容如下:


forfiles /p F:\Database_Backup /m *.bak /d -7 /c "cmd /c del /f @path"
          在这里,我们删除7天以前的备份,同样地新建一个任务计划,将它执行的程序指向这个bat 即可,执行时间可以指定为一个月一次或一周一次等。

 

本文是对网上资料数据库的定期备份和定期删除备份的整合,希望其他人也能用得上。

 

 

 

 

 

你可能感兴趣的:(database)