diff --git a/src-tauri/src/database/backup.rs b/src-tauri/src/database/backup.rs
index e59f79d66..1fb66aaf8 100644
--- a/src-tauri/src/database/backup.rs
+++ b/src-tauri/src/database/backup.rs
@@ -7,7 +7,7 @@ use super::{lock_conn, Database, SCHEMA_VERSION};
use crate::config::get_app_config_dir;
use crate::error::AppError;
use chrono::{Local, Utc};
-use rusqlite::backup::Backup;
+use rusqlite::backup::{Backup, StepResult};
use rusqlite::config::DbConfig;
use rusqlite::limits::Limit;
use rusqlite::types::{Value, ValueRef};
@@ -17,6 +17,7 @@ use std::io::{Read, Take, Write};
use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
use std::sync::Arc;
+use std::time::Duration;
use tempfile::NamedTempFile;
const CC_SWITCH_SQL_EXPORT_HEADER: &str = "-- CC Switch SQLite 导出";
@@ -28,6 +29,10 @@ const MAX_SQL_VALUE_BYTES: i32 = 64 * 1024 * 1024;
const MAX_VM_STEPS: u64 = 50_000_000;
const PROGRESS_GRANULARITY: u64 = 1_000;
const MAX_PAGE_COUNT: u64 = 524_288;
+const BACKUP_PAGES_PER_STEP: i32 = 256;
+const MAX_BACKUP_TRANSIENT_RETRIES: u32 = 100;
+const MAX_BACKUP_STEPS: u32 = 100_000;
+const BACKUP_RETRY_DELAY: Duration = Duration::from_millis(10);
#[cfg(test)]
thread_local! {
@@ -35,6 +40,8 @@ thread_local! {
const { std::cell::Cell::new(None) };
static TEST_MAX_PAGE_COUNT: std::cell::Cell