您的位置:首页 > 编程语言 > Java开发

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

2015-04-02 09:34 288 查看
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文件并在控制台输出信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bat sql spring runtime 定时
相关文章推荐