数据库备份
# TaskRunner 自定程序 - 数据库备份
# 1. 说明
- 任务运行器 TaskRunner 通过自定程序,调用数据查询执行备份操作。
- 示例使用了压缩工具7-zip对数据库备份文件执行压缩操作。请在使用示例前下载并安装 7-zip (opens new window)。
- 数据库备份的执行时长受到数据库大小影响,如使用 RestAPI 调用,在备份执行期间可能会出现客户端未响应的情况,请耐心等待。
# 2. 设计程序
TaskRunner 的初始示例已包含 数据库备份
自定程序。下面介绍创建自定程序的流程。
- 点击
自定程序
选项卡,在自定程序界面中点击新建
按钮,打开新建程序界面。 - 在新建程序界面,填写要设计的自定程序的基本信息。如下图所示。填写完成点击
保存
按钮。
- 返回自定程序列表界面,选择刚才创建的
JS010
自定程序,点击菜单栏中的设计
按钮,打开程序设计器界面。 - 在程序设计器界面中输入自定程序代码,代码示例如下。完成后,点击
保存
按钮。
//数据库备份主程序
//可运用参数:
//database 备份的数据库名称
//dir 备份的目录名称
//compressed 是否启用压缩,设置为0 表示不启用,设置其余值表示启用
//day 设置备份保留的天数
//使用压缩设置的默认程序为7-zip ,可至https://7-zip.org 下载安装包进行安装,压缩后文件后缀名为 zip
{
var dir,database,compressed,day,D,DB,vSQL;
database = iif(UgParams.Values["database"] == "","demo",UgParams.Values["database"]);
if(UgParams.Values["dir"] == "")
dir = "D:\\"
else
dir = UgParams.Values["dir"];
compressed = iif(UgParams.Values["compressed"] == "0","0","1");
day = iif(UgParams.Values["day"] == "","15",UgParams.Values["day"]);
vSQL = "EXEC master.dbo.sp_configure 'show advanced options', 1;" + #13#10 +
"RECONFIGURE WITH OVERRIDE;" + #13#10 +
"EXEC master.dbo.sp_configure 'xp_cmdshell', 1;" + #13#10 +
"RECONFIGURE WITH OVERRIDE;" + #13#10 +
"declare @prefix nvarchar(100)," + #13#10 +
" @datefile nvarchar(100)," + #13#10 +
" @bakfile nvarchar(100)," + #13#10 +
" @zipfile nvarchar(100)," + #13#10 +
" @zipcmd nvarchar(150)," + #13#10 +
" @str_date nvarchar(100)," + #13#10 +
" @sql nvarchar(100)" + #13#10 +
"declare @A nvarchar(100),@B nvarchar(100),@C int,@D int" + #13#10 +
"select" + #13#10 +
" @A= '" + dir + "', --数据库名称" + #13#10 +
" @B= '" + database + "', --备份目录" + #13#10 +
" @C= " + compressed + ", --是否压缩" + #13#10 +
" @D= " + day + " --备份保留天数" + #13#10 +
"--设置备份的目录" + #13#10 +
"set @prefix=@A" + #13#10 +
"set @str_date = replace(replace(replace(convert(varchar(20),getdate(), 120),' ',''),'-',''),':','')" + #13#10 +
"set @datefile = @B +@str_date" + #13#10 +
"set @bakfile = @prefix+@datefile+'.bak'" + #13#10 +
"set @zipfile = @prefix+@datefile+'.zip'" + #13#10 +
"--备份" + #13#10 +
"BACKUP Database @B TO DISK = @bakfile WITH NOFORMAT, NOINIT, NAME = N'Full_Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10" + #13#10 +
"if @C = 1" + #13#10 +
"begin" + #13#10 +
"--压缩zip,需使用7-zip,也可使用其它压缩软件压缩为zip格式" + #13#10 +
"set @zipcmd ='\"C:\\Program Files\\7-zip\\7z.exe\" ' +'a ' +@zipfile+' '+@bakfile" + #13#10 +
"exec master..xp_cmdshell @zipcmd,NO_OUTPUT;" + #13#10 +
"--删除D天之前的备份" + #13#10 +
"set @sql='del '+@A+@B+rtrim(replace(replace(replace(convert(varchar(20),getdate()-@D, 120),' ',''),'-',''),':',''))+'.zip'" + #13#10 +
"exec master..xp_cmdshell @sql,NO_OUTPUT;" + #13#10 +
"end" + #13#10 +
"else" + #13#10 +
"begin" + #13#10 +
"--删除D天之前的备份" + #13#10 +
"set @sql='del '+@A+@B+rtrim(replace(replace(replace(convert(varchar(20),getdate()-@D, 120),' ',''),'-',''),':',''))+'.zip'" + #13#10 +
"exec master..xp_cmdshell @sql,NO_OUTPUT;" + #13#10 +
"end" + #13#10 +
"select 'ok' as msg";
D = new TFDQuery(nil);
//使用数据库设置的连接
DB = UGMM.GetDBConnection("master");
D.Connection = DB;
//使用预设SQL
D.SQL.Text = vSQL;
D.Open;
D.Free;
DB.Free;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

- 如需要测试效果,可在程序设计器界面中点击
运行
按钮进行测试。可在 D 盘中找到备份的文件。
程序中定义的参数说明如下:
名称 | 说明 | 是否必填 | 默认值 |
---|---|---|---|
database | 备份的数据库的名称 | 是 | demo |
dir | 备份文件存放的目录 | 是 | D:\ |
compressed | 是否启用压缩,若取值为 0 表示为不启用压缩,其它取值会表示为 1 | 否 | 1 |
day | 备份保存的天数 | 否 | 15 |
# 3. 调用执行
设计完成的自定程序可使用以下方式来调用执行。
# 3.1. RestAPI
使用浏览器或RestAPI 客户端,访问以下地址,执行自定程序调用。请将 {ip}
修改为运行 TaskRunner 主机的IP地址,{port}
修改为 TaskRunner WebSocket 服务端监听的地址。
http://{ip}:{port}?restapi=script&taskname=JS011
如需要自定义参数,参照以下方式执行。其中将 {database}
替换为备份的数据库名称, {dir}
替换为备份文件的目录, compressed
与 day
为非必填项,URL 中可不使用这两项。
http://{ip}:{port}?restapi=script&taskname=JS011&database={database}&dir={dir}&compressed={compressed}&day={day}
# 3.2. WebSocket
使用WebSocket客户端,连接至 TaskRunner 中的 WebSocket 服务端。向 WebSocket 服务端发送以下文本实现自定程序的调用。
{"action":"script","taskname":"JS011"}
如需要自定义参数,参照以下方式执行。其中将 {database}
替换为备份的数据库名称, {dir}
替换为备份文件的目录, compressed
与 day
为非必填项,参数列中可不引入。
{"action":"script","taskname":"JS011","params":[{"name":"database","value":"{database}"},{"name":"dir","value":"{dir}"},{"name":"compressed","value":"1"},{"name":"day","value":"15"}]}
注意
JSON 字符串中,{dir}
中的目录分隔符号 \
需要增加转义符号 \
后使用,比如目录 D:\backup\database
应写成 D:\\backup\\database
。
# 3.3. MQTT
使用 MQTT 客户端,连接至 TaskRunner 连接的 MQTT 服务器。MQTT 客户端向 TaskRunner 订阅的主题发送以下文本实现自定程序的调用。
{"action":"script","taskname":"JS011"}
如需要自定义参数,参照以下方式执行。其中将 {database}
替换为备份的数据库名称, {dir}
替换为备份文件的目录, compressed
与 day
为非必填项,参数列中可不引入。
{"action":"script","taskname":"JS011","params":[{"name":"database","value":"{database}"},{"name":"dir","value":"{dir}"},{"name":"compressed","value":"1"},{"name":"day","value":"15"}]}
注意
JSON 字符串中,{dir}
中的目录分隔符号 \
需要增加转义符号 \
后使用,比如目录 D:\backup\database
应写成 D:\\backup\\database
。