用bat文件备份sqlserver数据库,在通过spring的schedule执行runtime完成周期备份

1首先要有备份数据库的*.sql文件代码如下:

use master
go
--判断存储过程是否存在
if(exists(select * from sys.procedures where name='sp_BackupDatabase' ))
drop proc sp_BackupDatabase
go
--创建存储过程
create procedure sp_BackupDatabase
	@databaseName sysname,--数据库名
	@backupType char(1),--备份类型(f:完整备份d:差异备份l:日志备份)
	@path nvarchar(255)--备份到文件夹的路径(例如f:\sqlserver数据备份)
as
begin
	set nocount on;--不返回计数(表示受 Transact-SQL 语句影响的行数)
	declare @sqlCommand nvarchar(1000)--执行备份的命令
	declare @dateTime nvarchar(20)--备份时间
	--获取当前时间精确到秒
	select @dateTime = REPLACE(CONVERT(varchar, GETDATE(),111),'/','') +
	REPLACE(CONVERT(varchar, GETDATE(),108),':','')
	--判断备份类型
	if @backupType = 'F'
		   set @sqlCommand = 'BACKUP DATABASE ' + @databaseName +
		   ' TO DISK = '''+@path + '\' + @databaseName + '_Full_' + @dateTime + '.BAK'''
	if @backupType = 'D'
		   set @sqlCommand = 'BACKUP DATABASE ' + @databaseName +
		   ' TO DISK = '''+@path + '\' + @databaseName + '_Diff_' + @dateTime + '.BAK''WITH DifFERENTIAL'
	if @backupType = 'L'
		   set @sqlCommand = 'BACKUP LOG ' + @databaseName +
		   ' TO DISK = '''+@path  + '\' + @databaseName + '_Log_' + @dateTime + '.TRN'''
	execute sp_executesql @sqlCommand
end
go


每次备份都是调用这个存储过程来实现的。

2接下来是*.bat文件代码如下:

@echo off
echo sqlserver数据库正在备份,请稍等......
:用户名
set "Username=sa"
:密码
set "Password=123"
:数据库地址
set "host=127.0.0.1"
:数据库名
set "Database=test"
:执行的sql文件(需要在同一目录下)
set "sqlfile=sqlserver备份的存储过程.sql"
:备份类型(f:完整备份d:差异备份l:日志备份)
set "type=f"
:备份目录和文件名
set "directory=F:\sqlserver数据备份"
:根据时间创建备份文件夹
md "%directory%"
sqlcmd -S %host% -U %Username% -P %Password% -i %sqlfile%
sqlcmd -Q "exec sp_BackupDatabase '%Database%','%type%','%directory%'"
sqlcmd -S % host% -U %Username% -P %Password% -i %sqlfile% 执行创建存储过程,sqlcmd是sql2008的cmd命令、-S是数据库地址、-U是用户名、-P是密码、-i是输入的sql文件。

sqlcmd -Q "exec sp_BackupDatabase '%Database%','%type%','%directory%'" 执行存储过程,-Q是执行sql命令后关闭窗口。
(注意*.bat文件和*.sql文件要在同一目录下)

3配置spring的schedule

具体操作参考我的另一篇博客Spring 注解式定时调度任务与cron表达式 

4通过java的runtime调用*.bat文件代码如下:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service  
public class BackDB {
	 @Scheduled(cron="0/10 * * * * ? ")  
	    public void myTestWork(){  
		 try {
				Runtime javaRuntime = Runtime.getRuntime();
				Process pr = javaRuntime.exec("cmd.exe /C F:\\*.bat");
				InputStream in = pr.getInputStream();
				InputStreamReader isr = new InputStreamReader(in, "GBK");
				BufferedReader br = new BufferedReader(isr);
				while (br.readLine()!=null) {
					System.out.println(br.readLine());
				}
				br.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
	    }  
}
类前面要加@Service/@Component让spring扫描到此类, @Scheduled(cron="0/10 * * * * ? ")  被标注的方法会被定时调用,方法内是runtime调用bat文件并在控制台输出信息。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值