用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文件並在控制檯輸出信息。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章