資料庫備份
# 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
。