
喜鹊软件数据库备份工具是一款面向 SQL Server 的轻量化自动备份工具。它把“备份哪些库、备份到哪个目录、什么时候备份、备份文件留多久、历史上留过哪些”这五件事收进一个体积不到 10 MB 的桌面程序里:勾选数据库、设定时间节点、开机常驻即可,不必在服务器上配置维护计划,也不必再维护一份没人看的备份脚本。
程序基于 .NET 8 开发,备份过程全程有状态栏进度条,每一次备份(成功或失败)都会写进 SQLite 备份日志,可在【备份历史记录】页按日期与关键字追溯、勾选清理。
多数中小型业务系统的数据库备份,实际都处在下面四种状态之一,各有各的隐患:
本工具的定位很直白:把数据库备份从“偶尔做一次的手工活”,变成一件有台账、可追溯、有人盯的日常事务——到点自己跑,跑完自己记账,坏了自己告诉你。
| 功能模块 | 能力 | 说明 |
|---|---|---|
| 数据库列表 | 多库勾选 | 从实例拉取用户库(自动排除系统库与离线库),可多选;配置项里勾过的库,下次刷新按名字自动回勾 |
| 连接与认证 | 端口 + 两种认证 | 服务器地址可带端口(0 = 不指定);支持 SQL Server 身份验证(sa + 密码),也可勾选Windows 身份验证走集成安全 |
| 备份目录 | 双目录冗余 | 目录 1 必填、目录 2 可留空;填了两个目录时,每个库各备份一份(本地盘 + 移动盘 / 异地目录) |
| 备份执行 | BACKUP DATABASE | 逐库 × 逐目录执行,WITH STATS = 5 回传进度;单个库失败不中断,最后一次性汇总 |
| 备份后处理 | 压缩 + 过期清理 | 压成同名 zip(压缩成功才删 .bak,失败保留原文件);按保留天数自动清理过期备份文件 |
| 定时计划 | 每天 / 指定星期 | 到点自动跑一次无人值守备份:不弹任何框,结果写状态栏 + 托盘气泡 + 日志 |
| 实时倒计时 | 工具栏常驻 | 右侧每秒刷新“距自动备份还有 X 小时 Y 分 Z 秒”,与实际触发共用同一套算法 |
| 备份日志 | SQLite 台账 | 每次备份写一条:备份时间 / 数据库名 / 文件名 / 完整路径 / 文件大小 / 是否压缩 / 成败 / 失败原因 |
| 历史记录 | 查询与清理 | 日期范围 + 关键字(库名 / 文件名 / 路径)模糊检索;可勾选删除,先删文件再删记录 |
| 系统托盘 | 开机启动常驻 | 最小化到托盘,【系统设置】页可勾选开机启动,实现长期无人值守 |
| 可靠性 | 校验 / 预检 / 看门狗 | 见本文第六节 |

右栏第一行填服务器地址与端口,点【测试连接】连通后,程序会自动加载该实例下的数据库列表并按配置回勾此前勾选过的库,省去每次重新勾选。
认证方式二选一:默认 SQL Server 身份验证(登录名 + 密码);勾选【Windows 身份验证】后改用集成安全连接,以当前登录的 Windows 账号连库,登录名与密码自动置灰。
两个实测会卡住的点:
① 填了端口时,程序会自动把 localhost / . 替换成 127.0.0.1
② 1434 是 DAC 专用保留端口,实例端口填成 1434 时备份会被拒绝(专用管理员连接下禁止并行操作)。
左侧列表勾选要备份的库,右侧填备份目录。文件名统一为 库名_yyyyMMdd.bak(压缩后为同名 .zip),例如 AIS20210906162930_20261010.bak——固定格式的好处是:清理时能准确识别“哪些是本工具生成的”,不会误删别人手工拷进来的备份。
目录 2 建议留给第二块物理盘或移动硬盘:两个目录都填时,每个库会在两个目录各落地一份,本地盘故障时还有一份可恢复。
勾选【备份后压缩】后,备份完成会压成 zip,压缩成功才删除原 .bak(压缩失败则保留 .bak,不至于两头空);【删除 n 天之前的备份文件】填 0 表示不清理,填 7 表示每次备份完成后自动清理 7 天前的文件。
凡是涉及删文件的逻辑,都做了三重保险:
在【备份配置】页勾选周期(每天,或指定周一至周日中的某几天)并填写备份时间(HH:mm,默认 23:59),保存后即生效。到点时程序自动跑一次备份,规则上有两条刻意的取舍:
验证链路不用真等到半夜:启动时加参数 --simulate-schedule,会立刻模拟一次“到点触发”,走的是与真实触发完全相同的无人值守路径。
工具栏右侧常驻一行倒计时:距自动备份还有 X 小时 Y 分 Z 秒,每秒刷新;超过一天会自动带上天数。它显示的下一次时刻,与状态栏提示、与实际触发判定共用同一个算法,不会出现“界面说还有 10 分钟、实际 10 分钟后没跑”的两套口径;改动周期或时间点后,下一秒就会跟着变。
三种特殊状态也有明确提示:备份进行中显示“备份进行中…”;没有勾选任何周期时提示未设置周期;备份时间格式填写错误时提示应为 HH:mm。
定时计划只在工具运行期间有效,因此长期无人值守的做法是:到【系统设置】页勾选开机启动,工具随系统启动并驻留托盘,到点自行备份。
无人值守路径下一个模态框都不弹——半夜弹出的确认框没人点,线程会一直卡在那里,后面几天的备份全废。备份结果通过三种方式告知:状态栏文字、托盘气泡通知、以及写入备份日志。
每一次备份(含失败)都会写进程序目录下的 backuplog.db(SQLite),字段包括备份时间、数据库名、备份文件名、完整路径、文件大小、是否压缩、是否成功、失败原因。日志单独成库而不写进配置文件,是因为它是只增的时间序列数据,与配置文件(通常与其他服务共用)混写既越写越大,语义也不对。
【备份历史记录】页可按日期范围 + 关键字(对数据库名 / 文件名 / 完整路径模糊匹配)检索,结果直接列出备份时间、库名、文件名、大小、成败与完整路径;需要清理时可勾选删除,删除顺序是先删文件、再删记录,避免出现“记录没了、文件还在占空间”或“文件没了、记录还显示存在”的错位。
这套台账解决的其实是一个管理问题:随时能回答“过去一个月每天都备份了吗”“上周三那一份多大、在哪个目录”“哪一次失败过、失败原因是什么”。

备份工具最怕的不是“报错”,而是静默失效——界面看着一切正常,实际已经好几天没备份成功。针对这类问题做了以下处理:
| 机制 | 作用 |
|---|---|
| RESTORE VERIFYONLY 校验 | 备份文件落盘后先做一次恢复校验,坏备份不会被记成成功 |
| .part 中转转正 | 先写临时文件、写完再 Move 成正式文件,避免写入中断留下“看起来存在、实际是坏的”备份 |
| 磁盘空间预检 | 按上次成功体积 × 1.1 预估,空间不足提前拦下并提示,不写到一半才失败 |
| 6 小时命令超时 + 8 小时看门狗 | 一次备份卡死后自动复位忙标记并告警,避免“卡一次,之后所有自动备份全部静默跳过” |
| 单实例保护 | Mutex 保证只有一个实例运行,第二个实例会把已运行的窗口唤到前台,防止两实例并发写同一文件 |
| 全局异常兜底 + 滚动日志 | 自绘界面抛异常不会静默崩;运行日志按月滚动保留(logs\backup-yyyyMM.log) |
| 距上次成功备份提醒 | 状态栏常驻“距上次成功备份已 N 天”,长期没成功会主动提醒 |
| 清理保底策略 | 同 3.3:只删自己的文件、本次无成功不清理、每库保底留最近 2 份 |

appsettings.json 配置与 backuplog.db 日志库。
做完这五步,日常要做的只剩下:偶尔扫一眼工具栏右侧的倒计时,以及状态栏那句“距上次成功备份已 N 天”。