实现异地备份阿里云服务器数据库

项目已开源,在文末

背景:因为商城项目数据每天都会有大量订单,同时数据需要在另一个系统使用。防止数据丢失,提出将数据备份到本地服务器

基本思路:

​ 最简单的方法就是手动将sql脚本复制到本地服务器(麻烦且容易忘记),同时数据库多了更加麻烦,如果单独使用sql管理工具(如navicat),使用传输的话需要用到本地服务器的数据库密码,对其他系统的数据库有威胁。

​ 同时又考虑到无论是阿里云服务器还是本地服务器,都是windows操作系统,同时对C#语言非常熟悉,所以这里直接想用C#开发一个windows服务程序,安装在阿里云服务器上,本地服务器搭建一个ftp站点,设置用户凭证,windwos服务程序定时备份数据库将脚本通过ftp传输到本地服务器。如果是linux操作系统可以构建shell脚本来完成数据库备份及文件传输。

创建windows服务

sc.exe create

sc.exe start

sc.exe stop

如果windows服务启动不成功,可查看时间查看器(event view)查看应用程序可以看到服务启动记录

强制删除windows服务:

通过WMI直接删除(终极方法)

powershell

plaintext
1
2
>$service = Get-WmiObject -Class Win32_Service -Filter "Name='Backup Shop Service'"
>$service.Delete() | Out-Null

搭建ftp站点

具体实现流程

  1. 服务启动
    • 读取配置文件(appsettings.json),初始化备份参数。
    • 配置Serilog日志。
    • 注册Quartz定时任务调度。
  2. 定时任务调度
    • Quartz根据Cron表达式定时触发备份任务。
  3. 备份任务执行(BackupJob)
    • 测试MySQL数据库连接。
    • 测试目标FTP服务器连接。
    • 调用mysqldump命令生成数据库备份文件。
    • 通过FluentFTP上传备份文件到远程服务器。
    • 验证文件上传结果。
    • 清理本地过期备份文件。
    • 失败时自动重试,重试次数和间隔可配置。
  4. 日志记录
    • 所有关键操作和异常均写入日志文件,便于后续排查。

MySQL自动备份服务

这是一个基于.NET 8的Windows服务,用于自动备份MySQL数据库并通过FTP传输到远程服务器。

使用的主要框架和包

  • .NET 8 Worker Service:作为Windows服务的基础框架。
  • Quartz:任务调度框架,实现定时备份。
  • MySql.Data:MySQL数据库连接和操作。
  • FluentFTP:用于FTP文件传输。
  • Serilog:日志记录。
  • Microsoft.Extensions.Configuration:配置管理。
  • Microsoft.Extensions.Hosting.WindowsServices:支持以Windows服务方式运行。

解决的问题

  • MySQL数据库定时自动备份,减少人工操作。
  • 备份文件自动传输到远程服务器,提升数据安全性。
  • 自动清理过期备份,节省存储空间。
  • 失败自动重试,提升备份可靠性。
  • 详细日志记录,便于运维和问题排查。

实现的主要功能

  • 定时自动备份MySQL数据库(支持自定义Cron表达式)。
  • 使用mysqldump工具生成完整SQL备份文件。
  • 通过FTP协议将备份文件上传到远程服务器。
  • 支持备份失败自动重试和日志记录。
  • 自动清理本地过期备份文件。
  • 可通过配置文件灵活设置数据库、目标服务器、备份策略等参数。

项目地址