用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文件并在控制台输出信息。
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文件并在控制台输出信息。
相关文章推荐
- [Jmeter]通过批处理调用java,java从CSV动态读取登录的用户名和密码,并将其作为参数组合成字符串,写入外部.bat文件,然后通过Java执行这个外部批处理文件
- Windows Server 2008通过计划任务定时执行bat文件
- 数 4000 据库备份 runtime.exec 去执行命令 返回 process 读取process的输入流 把数据写入执行文件里
- 数 4000 据库备份 runtime.exec 去执行命令 返回 process 读取process的输入流 把数据写入执行文件里
- 数 4000 据库备份 runtime.exec 去执行命令 返回 process 读取process的输入流 把数据写入执行文件里
- Windows Server 2008通过计划任务定时执行bat文件
- OpenSUSE Leap 42.3下通过Firefox Opera Chromium浏览器直接执行java应用程序(打开java jnlp文件)实现在服务器远程虚拟控制台完成远程管理的方法
- 数 4000 据库备份 runtime.exec 去执行命令 返回 process 读取process的输入流 把数据写入执行文件里
- 通过bat文件 执行jar
- 数 4000 据库备份 runtime.exec 去执行命令 返回 process 读取process的输入流 把数据写入执行文件里
- win2008通过计划任务定时执行bat文件
- 数 4000 据库备份 runtime.exec 去执行命令 返回 process 读取process的输入流 把数据写入执行文件里
- Exp数据库导出(备份)、导入-----可执行文件(bat,cmd,exe)。
- c#执行bat批处理文件,并通过线程将结果显示在控件中
- Java通过生成bat文件执行命令提示行
- 数 4000 据库备份 runtime.exec 去执行命令 返回 process 读取process的输入流 把数据写入执行文件里
- Ubuntu下通过Firefox Opera Chromium浏览器直接执行java应用程序(打开java jnlp文件)实现在服务器远程虚拟控制台完成远程管理的方法
- 通过批处理文件(.bat)执行.sql文件
- 数 4000 据库备份 runtime.exec 去执行命令 返回 process 读取process的输入流 把数据写入执行文件里
- 数 4000 据库备份 runtime.exec 去执行命令 返回 process 读取process的输入流 把数据写入执行文件里