| | |
| | | private const double FragmentationThreshold = 30.0; // 30%ç¢ççéå¼ |
| | | private const int MaintenanceIntervalDays = 15; // 15天æ§è¡ä¸æ¬¡ |
| | | private const int BackupRetentionDays = 30; // å¤ä»½ä¿ç30天 |
| | | private const string BackupBasePath = @"D:\DatabaseBackups"; // å¤ä»½æä»¶åå¨ç®å½ |
| | | private static readonly string BackupBasePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DatabaseBackups"); // å¤ä»½æä»¶åå¨ç®å½ |
| | | private const bool UseBackupCompression = true; // æ¯å¦ä½¿ç¨å¤ä»½å缩 |
| | | private const bool VerifyBackup = true; // æ¯å¦éªè¯å¤ä»½ |
| | | private const int MaxBackupRetryCount = 3; // æå¤§éè¯æ¬¡æ° |
| | |
| | | connection.Open(); |
| | | |
| | | // 1. å¤ä»½æ°æ®åº |
| | | BackupDatabase(); |
| | | //BackupDatabase(); |
| | | |
| | | // 2. æ£æ¥æ°æ®åºæä»¶å¤§å° |
| | | CheckDatabaseFileSize(connection); |
| | |
| | | UpdateStatistics(connection); |
| | | |
| | | // 5. æ¸
çæ§å¤ä»½ |
| | | CleanupOldBackups(); |
| | | //CleanupOldBackups(); |
| | | |
| | | // æ´æ°æåæ£æ¥æ¥æ |
| | | lock (_fileSizeLock) |
| | |
| | | fileCount = Convert.ToInt32(reader["FileCount"]); |
| | | } |
| | | } |
| | | |
| | | |
| | | // æ£æ¥ç£çç©ºé´æ¯å¦è¶³å¤ |
| | | if (!CheckDiskSpace(backupFilePath, totalSizeMB)) |
| | | { |
| | | throw new Exception("ç£ç空é´ä¸è¶³ï¼æ æ³æ§è¡å¤ä»½"); |
| | | } |
| | | |
| | | // æå»ºå¤ä»½SQLè¯å¥ |
| | | var backupSql = BuildBackupSql(backupFilePath); |
| | | |
| | |
| | | Console.WriteLine($"æ°æ®åºå¤ä»½å¤±è´¥: {ex.Message}"); |
| | | throw new Exception($"æ°æ®åºå¤ä»½å¤±è´¥: {ex.Message}", ex); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private bool CheckDiskSpace(string backupFilePath, double estimatedBackupSizeMB) |
| | | { |
| | | try |
| | | { |
| | | var driveInfo = new DriveInfo(Path.GetPathRoot(backupFilePath)); |
| | | var freeSpaceMB = driveInfo.AvailableFreeSpace / (1024 * 1024); |
| | | |
| | | // éè¦è³å°1.5åçç©ºé´æ¥ç¡®ä¿å¤ä»½é¡ºå©è¿è¡ |
| | | var requiredSpaceMB = estimatedBackupSizeMB * 1.5; |
| | | |
| | | if (freeSpaceMB < requiredSpaceMB) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"æ£æ¥ç£çç©ºé´æ¶åºé: {ex.Message}"); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | // æ£æ¥æ¶é´æ¯å¦æ¯1ç¹å·¦å³ï¼å
许1:00-1:59ï¼ |
| | | if (now.Hour != 1) |
| | | if (now.Hour != 1 && now.Hour != 2) |
| | | { |
| | | return false; |
| | | } |