From d6b00967caa24a1b7ca560e23de3553e4b0527cc Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Tue, 25 Nov 2025 11:19:18 +0800 Subject: [PATCH] fix: Fix the issue of database backup failure (#11060) --- agent/app/service/backup_mysql.go | 15 ++++++--------- agent/app/service/backup_postgresql.go | 10 ++++++++-- .../src/views/cronjob/cronjob/operate/index.vue | 15 ++++++++------- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/agent/app/service/backup_mysql.go b/agent/app/service/backup_mysql.go index 57258bd7d..d77f2e9ad 100644 --- a/agent/app/service/backup_mysql.go +++ b/agent/app/service/backup_mysql.go @@ -8,17 +8,14 @@ import ( "strings" "time" - "github.com/1Panel-dev/1Panel/agent/app/repo" - - "github.com/1Panel-dev/1Panel/agent/constant" - "github.com/1Panel-dev/1Panel/agent/i18n" - - "github.com/1Panel-dev/1Panel/agent/buserr" - "github.com/1Panel-dev/1Panel/agent/app/dto" "github.com/1Panel-dev/1Panel/agent/app/model" + "github.com/1Panel-dev/1Panel/agent/app/repo" "github.com/1Panel-dev/1Panel/agent/app/task" + "github.com/1Panel-dev/1Panel/agent/buserr" + "github.com/1Panel-dev/1Panel/agent/constant" "github.com/1Panel-dev/1Panel/agent/global" + "github.com/1Panel-dev/1Panel/agent/i18n" "github.com/1Panel-dev/1Panel/agent/utils/common" "github.com/1Panel-dev/1Panel/agent/utils/files" "github.com/1Panel-dev/1Panel/agent/utils/mysql/client" @@ -94,7 +91,7 @@ func handleMysqlBackup(db DatabaseHelper, parentTask *task.Task, recordID uint, if parentTask != nil { return itemHandler() } - backupTask.AddSubTaskWithOps(task.GetTaskName(itemName, task.TaskBackup, task.TaskScopeBackup), func(t *task.Task) error { return itemHandler() }, nil, 3, time.Hour) + backupTask.AddSubTaskWithOps(task.GetTaskName(itemName, task.TaskBackup, task.TaskScopeBackup), func(t *task.Task) error { return itemHandler() }, nil, 0, 3*time.Hour) go func() { if err := backupTask.Execute(); err != nil { backupRepo.UpdateRecordByMap(recordID, map[string]interface{}{"status": constant.StatusFailed, "message": err.Error()}) @@ -196,7 +193,7 @@ func handleMysqlRecover(req dto.CommonRecover, parentTask *task.Task, isRollback return recoverDatabase(parentTask) } - itemTask.AddSubTaskWithOps(i18n.GetMsgByKey("TaskRecover"), recoverDatabase, nil, 3, time.Hour) + itemTask.AddSubTaskWithOps(i18n.GetMsgByKey("TaskRecover"), recoverDatabase, nil, 0, 3*time.Hour) go func() { _ = itemTask.Execute() }() diff --git a/agent/app/service/backup_postgresql.go b/agent/app/service/backup_postgresql.go index 43b5e5e94..8d2950dd5 100644 --- a/agent/app/service/backup_postgresql.go +++ b/agent/app/service/backup_postgresql.go @@ -86,7 +86,7 @@ func handlePostgresqlBackup(db DatabaseHelper, parentTask *task.Task, recordID u if parentTask != nil { return itemHandler() } - backupTask.AddSubTaskWithOps(task.GetTaskName(itemName, task.TaskBackup, task.TaskScopeBackup), func(t *task.Task) error { return itemHandler() }, nil, 3, time.Hour) + backupTask.AddSubTaskWithOps(task.GetTaskName(itemName, task.TaskBackup, task.TaskScopeBackup), func(t *task.Task) error { return itemHandler() }, nil, 0, 3*time.Hour) go func() { if err := backupTask.Execute(); err != nil { backupRepo.UpdateRecordByMap(recordID, map[string]interface{}{"status": constant.StatusFailed, "message": err.Error()}) @@ -130,10 +130,12 @@ func handlePostgresqlRecover(req dto.CommonRecover, parentTask *task.Task, isRol if !isRollback { rollbackFile := path.Join(global.Dir.TmpDir, fmt.Sprintf("database/%s/%s_%s.sql.gz", req.Type, req.DetailName, time.Now().Format(constant.DateTimeSlimLayout))) if err := cli.Backup(client.BackupInfo{ + Database: req.Name, Name: req.DetailName, TargetDir: path.Dir(rollbackFile), FileName: path.Base(rollbackFile), + Task: t, Timeout: 300, }); err != nil { return fmt.Errorf("backup postgresql db %s for rollback before recover failed, err: %v", req.DetailName, err) @@ -142,9 +144,11 @@ func handlePostgresqlRecover(req dto.CommonRecover, parentTask *task.Task, isRol if !isOk { global.LOG.Info("recover failed, start to rollback now") if err := cli.Recover(client.RecoverInfo{ + Database: req.Name, Name: req.DetailName, SourceFile: rollbackFile, + Task: t, Timeout: 300, }); err != nil { global.LOG.Errorf("rollback postgresql db %s from %s failed, err: %v", req.DetailName, rollbackFile, err) @@ -167,9 +171,11 @@ func handlePostgresqlRecover(req dto.CommonRecover, parentTask *task.Task, isRol t.LogWithStatus(i18n.GetMsgByKey("Decrypt"), err) } if err := cli.Recover(client.RecoverInfo{ + Database: req.Name, Name: req.DetailName, SourceFile: req.File, Username: dbInfo.Username, + Task: t, Timeout: 300, }); err != nil { global.LOG.Errorf("recover postgresql db %s from %s failed, err: %v", req.DetailName, req.File, err) @@ -182,7 +188,7 @@ func handlePostgresqlRecover(req dto.CommonRecover, parentTask *task.Task, isRol return recoverDatabase(parentTask) } - itemTask.AddSubTaskWithOps(i18n.GetMsgByKey("TaskRecover"), recoverDatabase, nil, 3, time.Hour) + itemTask.AddSubTaskWithOps(i18n.GetMsgByKey("TaskRecover"), recoverDatabase, nil, 0, 3*time.Hour) go func() { _ = itemTask.Execute() }() diff --git a/frontend/src/views/cronjob/cronjob/operate/index.vue b/frontend/src/views/cronjob/cronjob/operate/index.vue index 786187885..1439ca887 100644 --- a/frontend/src/views/cronjob/cronjob/operate/index.vue +++ b/frontend/src/views/cronjob/cronjob/operate/index.vue @@ -1027,18 +1027,16 @@ const verifyScript = (rule: any, value: any, callback: any) => { } callback(); }; -const verifyUrlItems = (rule: any, value: any, callback: any) => { +const verifyUrlItems = () => { if (!form.urlItems || form.urlItems.length === 0) { - callback(new Error(i18n.global.t('commons.rule.requiredInput'))); - return; + return false; } for (const item of form.urlItems) { if (!item) { - callback(new Error(i18n.global.t('cronjob.urlHelper'))); - return; + return false; } } - callback(); + return true; }; const verifySpec = (rule: any, value: any, callback: any) => { @@ -1179,7 +1177,6 @@ const rules = reactive({ websiteList: [Rules.requiredSelect], appIdList: [Rules.requiredSelect], dbNameList: [Rules.requiredSelect], - urlItems: [{ validator: verifyUrlItems, trigger: 'blur', required: true }], files: [{ validator: verifyFiles, trigger: 'blur', required: true }], sourceDir: [Rules.requiredInput], sourceAccountItems: [Rules.requiredSelect], @@ -1458,6 +1455,10 @@ function hasScript() { const onSubmit = async (formEl: FormInstance | undefined) => { let specs = []; + if (form.type === 'curl' && (form.urlItems.length === 0 || !verifyUrlItems())) { + MsgError(i18n.global.t('cronjob.urlHelper')); + return; + } if (!form.specCustom) { for (const item of form.specObjs) { const itemSpec = transObjToSpec(item.specType, item.week, item.day, item.hour, item.minute, item.second);