fix: Fix the issue of database backup failure (#11060)

This commit is contained in:
ssongliu 2025-11-25 11:19:18 +08:00 committed by GitHub
parent 6d4c1f8e79
commit d6b00967ca
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 22 additions and 18 deletions

View file

@ -8,17 +8,14 @@ import (
"strings" "strings"
"time" "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/dto"
"github.com/1Panel-dev/1Panel/agent/app/model" "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/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/global"
"github.com/1Panel-dev/1Panel/agent/i18n"
"github.com/1Panel-dev/1Panel/agent/utils/common" "github.com/1Panel-dev/1Panel/agent/utils/common"
"github.com/1Panel-dev/1Panel/agent/utils/files" "github.com/1Panel-dev/1Panel/agent/utils/files"
"github.com/1Panel-dev/1Panel/agent/utils/mysql/client" "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 { if parentTask != nil {
return itemHandler() 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() { go func() {
if err := backupTask.Execute(); err != nil { if err := backupTask.Execute(); err != nil {
backupRepo.UpdateRecordByMap(recordID, map[string]interface{}{"status": constant.StatusFailed, "message": err.Error()}) 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) 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() { go func() {
_ = itemTask.Execute() _ = itemTask.Execute()
}() }()

View file

@ -86,7 +86,7 @@ func handlePostgresqlBackup(db DatabaseHelper, parentTask *task.Task, recordID u
if parentTask != nil { if parentTask != nil {
return itemHandler() 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() { go func() {
if err := backupTask.Execute(); err != nil { if err := backupTask.Execute(); err != nil {
backupRepo.UpdateRecordByMap(recordID, map[string]interface{}{"status": constant.StatusFailed, "message": err.Error()}) 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 { 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))) 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{ if err := cli.Backup(client.BackupInfo{
Database: req.Name,
Name: req.DetailName, Name: req.DetailName,
TargetDir: path.Dir(rollbackFile), TargetDir: path.Dir(rollbackFile),
FileName: path.Base(rollbackFile), FileName: path.Base(rollbackFile),
Task: t,
Timeout: 300, Timeout: 300,
}); err != nil { }); err != nil {
return fmt.Errorf("backup postgresql db %s for rollback before recover failed, err: %v", req.DetailName, err) 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 { if !isOk {
global.LOG.Info("recover failed, start to rollback now") global.LOG.Info("recover failed, start to rollback now")
if err := cli.Recover(client.RecoverInfo{ if err := cli.Recover(client.RecoverInfo{
Database: req.Name,
Name: req.DetailName, Name: req.DetailName,
SourceFile: rollbackFile, SourceFile: rollbackFile,
Task: t,
Timeout: 300, Timeout: 300,
}); err != nil { }); err != nil {
global.LOG.Errorf("rollback postgresql db %s from %s failed, err: %v", req.DetailName, rollbackFile, err) 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) t.LogWithStatus(i18n.GetMsgByKey("Decrypt"), err)
} }
if err := cli.Recover(client.RecoverInfo{ if err := cli.Recover(client.RecoverInfo{
Database: req.Name,
Name: req.DetailName, Name: req.DetailName,
SourceFile: req.File, SourceFile: req.File,
Username: dbInfo.Username, Username: dbInfo.Username,
Task: t,
Timeout: 300, Timeout: 300,
}); err != nil { }); err != nil {
global.LOG.Errorf("recover postgresql db %s from %s failed, err: %v", req.DetailName, req.File, err) 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) 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() { go func() {
_ = itemTask.Execute() _ = itemTask.Execute()
}() }()

View file

@ -1027,18 +1027,16 @@ const verifyScript = (rule: any, value: any, callback: any) => {
} }
callback(); callback();
}; };
const verifyUrlItems = (rule: any, value: any, callback: any) => { const verifyUrlItems = () => {
if (!form.urlItems || form.urlItems.length === 0) { if (!form.urlItems || form.urlItems.length === 0) {
callback(new Error(i18n.global.t('commons.rule.requiredInput'))); return false;
return;
} }
for (const item of form.urlItems) { for (const item of form.urlItems) {
if (!item) { if (!item) {
callback(new Error(i18n.global.t('cronjob.urlHelper'))); return false;
return;
} }
} }
callback(); return true;
}; };
const verifySpec = (rule: any, value: any, callback: any) => { const verifySpec = (rule: any, value: any, callback: any) => {
@ -1179,7 +1177,6 @@ const rules = reactive({
websiteList: [Rules.requiredSelect], websiteList: [Rules.requiredSelect],
appIdList: [Rules.requiredSelect], appIdList: [Rules.requiredSelect],
dbNameList: [Rules.requiredSelect], dbNameList: [Rules.requiredSelect],
urlItems: [{ validator: verifyUrlItems, trigger: 'blur', required: true }],
files: [{ validator: verifyFiles, trigger: 'blur', required: true }], files: [{ validator: verifyFiles, trigger: 'blur', required: true }],
sourceDir: [Rules.requiredInput], sourceDir: [Rules.requiredInput],
sourceAccountItems: [Rules.requiredSelect], sourceAccountItems: [Rules.requiredSelect],
@ -1458,6 +1455,10 @@ function hasScript() {
const onSubmit = async (formEl: FormInstance | undefined) => { const onSubmit = async (formEl: FormInstance | undefined) => {
let specs = []; let specs = [];
if (form.type === 'curl' && (form.urlItems.length === 0 || !verifyUrlItems())) {
MsgError(i18n.global.t('cronjob.urlHelper'));
return;
}
if (!form.specCustom) { if (!form.specCustom) {
for (const item of form.specObjs) { for (const item of form.specObjs) {
const itemSpec = transObjToSpec(item.specType, item.week, item.day, item.hour, item.minute, item.second); const itemSpec = transObjToSpec(item.specType, item.week, item.day, item.hour, item.minute, item.second);