| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- using Serilog;
- namespace YZWater.Core.Services;
- /// <summary>
- /// 数据库备份服务
- /// </summary>
- public static class BackupService
- {
- private static readonly string BackupDir = "Backups";
- /// <summary>
- /// 创建数据库备份
- /// </summary>
- public static async Task<(bool Success, string Path)> BackupAsync()
- {
- try
- {
- Directory.CreateDirectory(BackupDir);
- var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
- var backupPath = Path.Combine(BackupDir, $"yzwater_backup_{timestamp}.db");
- // SQLite 备份:复制数据库文件
- var sourcePath = "yzwater.db";
- if (!File.Exists(sourcePath))
- {
- Log.Warning("数据库文件不存在: {Path}", sourcePath);
- return (false, string.Empty);
- }
- // 使用 SqlSugar 的备份功能
- var db = DatabaseService.Db;
- await Task.Run(() =>
- {
- File.Copy(sourcePath, backupPath, true);
- });
- Log.Information("数据库备份成功: {Path}", backupPath);
- AuditService.Log("系统", "Backup", $"数据库备份: {backupPath}");
- return (true, backupPath);
- }
- catch (Exception ex)
- {
- Log.Error(ex, "数据库备份失败");
- return (false, string.Empty);
- }
- }
- /// <summary>
- /// 恢复数据库
- /// </summary>
- public static async Task<bool> RestoreAsync(string backupPath)
- {
- try
- {
- if (!File.Exists(backupPath))
- {
- Log.Warning("备份文件不存在: {Path}", backupPath);
- return false;
- }
- var targetPath = "yzwater.db";
- // 先备份当前数据库
- var preRestoreBackup = Path.Combine(BackupDir, $"yzwater_pre_restore_{DateTime.Now:yyyyMMdd_HHmmss}.db");
- if (File.Exists(targetPath))
- {
- File.Copy(targetPath, preRestoreBackup, true);
- }
- await Task.Run(() =>
- {
- File.Copy(backupPath, targetPath, true);
- });
- Log.Information("数据库恢复成功,恢复前备份: {Path}", preRestoreBackup);
- AuditService.Log("系统", "Restore", $"数据库恢复: {backupPath},恢复前备份: {preRestoreBackup}");
- return true;
- }
- catch (Exception ex)
- {
- Log.Error(ex, "数据库恢复失败");
- return false;
- }
- }
- /// <summary>
- /// 获取备份列表
- /// </summary>
- public static List<(string Path, DateTime Time, long Size)> GetBackups()
- {
- if (!Directory.Exists(BackupDir))
- return new List<(string, DateTime, long)>();
- return Directory.GetFiles(BackupDir, "*.db")
- .Select(f => new FileInfo(f))
- .OrderByDescending(f => f.CreationTime)
- .Select(f => (f.FullName, f.CreationTime, f.Length))
- .ToList();
- }
- /// <summary>
- /// 清理旧备份(保留最近 N 个)
- /// </summary>
- public static int CleanupOldBackups(int keepCount = 10)
- {
- if (!Directory.Exists(BackupDir))
- return 0;
- var backups = Directory.GetFiles(BackupDir, "*.db")
- .Select(f => new FileInfo(f))
- .OrderByDescending(f => f.CreationTime)
- .Skip(keepCount)
- .ToList();
- foreach (var backup in backups)
- {
- try
- {
- backup.Delete();
- Log.Debug("已删除旧备份: {Path}", backup.FullName);
- }
- catch (Exception ex)
- {
- Log.Warning(ex, "删除旧备份失败: {Path}", backup.FullName);
- }
- }
- if (backups.Count > 0)
- Log.Information("已清理 {Count} 个旧备份", backups.Count);
- return backups.Count;
- }
- }
|