0%

Gitea與SQLSERVER定期備份

1.Gitea與SQLSERVER定期備份

1.1. 前言

架設Gitea Server時是搭配MSSQL。同時研究gitea內鍵備份功能中,發現備份方式是以SQL指令進行備份,這個部分預期的結果不會是我想要的…

並試著還原…還原過程不是很順暢,如果災害發生時,時間通常較為緊急。所以,才想到要搭配維護計畫的方式進行資料庫備份。

接下來,會以gitea備份維護計劃備份進行筆記記錄。

1.2. Gitea 定期備份

1.2.1. Gitea 備份指令

在使用gitea dump指令時,請先關閉gitea服務,備份時command line 才不會噴錯誤,指令如下:

1
C:\gitea>gitea dump

執行後結果如下:

image-20240103093416807

在c槽會看到一個壓縮檔

image-20240103093513456

解壓縮內容如下

image-20240103093635864

打開gitea-db.sql查看

1
2
3
4
5
6
7
8
9
10
11
12
13
/*Generated by xorm 2024-01-03 09:22:54, from mssql to mssql*/

IF NOT EXISTS (SELECT [name] FROM sys.tables WHERE [name] = '[oauth2_application]' ) CREATE TABLE [oauth2_application] ([id] BIGINT PRIMARY KEY IDENTITY NOT NULL, [uid] BIGINT NULL, [name] NVARCHAR(255) NULL, [client_id] NVARCHAR(255) NULL, [client_secret] NVARCHAR(255) NULL, [confidential_client] BIT DEFAULT 1 NOT NULL, [redirect_uris] NVARCHAR(MAX) NULL, [created_unix] BIGINT NULL, [updated_unix] BIGINT NULL);
SET IDENTITY_INSERT [oauth2_application] ON;
CREATE INDEX [IDX_oauth2_application_uid] ON [oauth2_application] ([uid]);
CREATE UNIQUE INDEX [UQE_oauth2_application_client_id] ON [oauth2_application] ([client_id]);
CREATE INDEX [IDX_oauth2_application_created_unix] ON [oauth2_application] ([created_unix]);
CREATE INDEX [IDX_oauth2_application_updated_unix] ON [oauth2_application] ([updated_unix]);
INSERT INTO [oauth2_application] ([id], [uid], [name], [client_id], [client_secret], [confidential_client], [redirect_uris], [created_unix], [updated_unix]) VALUES (1,0,N'Git Credential Manager',N'e90ee53c-94e2-48ac-9358-a874fb9e0662','',0,N'["http://127.0.0.1","https://127.0.0.1"]',1704186188,1704186188);
INSERT INTO [oauth2_application] ([id], [uid], [name], [client_id], [client_secret], [confidential_client], [redirect_uris], [created_unix], [updated_unix]) VALUES (2,0,N'git-credential-oauth',N'a4792ccc-144e-407e-86c9-5e7d8d9c3269','',0,N'["http://127.0.0.1","https://127.0.0.1"]',1704186188,1704186188);

....
....

1.2.2. 撰寫BAT腳本

gitea_backup.bat

1
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
REM 更改當前的字符編碼頁(code page)。而 65001 是 Unicode UTF-8 的字符編碼頁。
chcp 65001

REM 停止gitea
sc.exe stop gitea

REM 睡10秒,讓gitea可以順利休眠完畢再執行備份。秒數可調
timeout /t 10

REM 設定備份目的路徑
set backup_directory="C:\Backup\Gitea"

REM 設定檔案格式
set yyyyMMdd=%date:~3,4%%date:~8,2%%date:~11,2%

REM 使用gitea dump 指令進行備份
C:\gitea\gitea dump --file "%backup_directory%\%yyyyMMdd%"

REM 睡10秒,讓gitea可以順利備份完後,再執行啟動。秒數可調
timeout /t 10

REM 啟動gitea
sc.exe start gitea

REM 刪除7天前的檔案
forfiles /p %backup_directory% /s /m *.zip /d -7 /c "cmd /c del @file"

延伸學習

forfiles /p C:\Backup\Gitea\ /s /m *.zip /d -7 /c “cmd /c echo @file the zip file is over 7days”

以上指令會print出符合刪除條件的檔案

1.2.3. 造假資料測試備份運行結果

這邊造假了好幾個zip檔案如下:

image-20240103113004435

因為forfiles指令會看建立日期,因此再透過以下指令(powershell),修改檔案的日期:

1
2
3
$(Get-Item C:\Backup\Gitea\20231226.zip).creationtime=$(Get-Date "12/26/2023")
$(Get-Item C:\Backup\Gitea\20231226.zip).lastaccesstime=$(Get-Date "12/26/2023")
$(Get-Item C:\Backup\Gitea\20231226.zip).lastwritetime=$(Get-Date "12/26/2023")

不過,這個備份檔還是有一些其它以檔案形式存在的資料,之後還原還是會用到,記得之後再設定排程定期備份。

1.3. 維護計畫定期備份

1.3.1. 安裝資訊

  • SQLSERVER 2022 Developer版
  • SSMS 19.2

1.3.2. 確認版本

image-20240103085339474

1.3.3. 勾選Integration Services

image-20240103085542055

因為之前已經安裝過了,所以上圖看起來已經是預設打勾,無法取消勾選。簡單來說,這項要勾。

1.3.4. 連線至新個體

使用瀏覽其他

image-20240103094320630

資料庫引擎下,就會看到剛剛新增的個體

image-20240103094436800

1.3.5. SSMS工具確認維護計劃選項

developer版本下,並且在之前有勾選Integration Services安裝,正常在這邊就會看到下圖的選項維護計畫

image-20240103085850724

1.3.6. 確認啟動SQL Server Agent

在使用維護計畫功能時,請先確認SQL Server Agent是否有啟動

image-20240103090759304

1.3.7. 服務啟動設定確認

同樣,再次檢查服務這邊是否有啟動

image-20240103091057493

1.3.8. 維護計劃備份

設定定期每日備份

image-20240103091625187

1.3.9. 維護計劃清除

定期清除,僅保留7天,可以透過這個方式達成。

image-20240103092146200

下圖是維護清除工作的設定細項,其中可以看到可以設定7天的選項

image-20240103092023146

1.3.10. 確認備份結果

可以看到有一個名字很常的,副檔名為bak的就是我們的備份檔案囉,如下:

image-20240103095305344

1.4. 參考連結