mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 08:20:25 +08:00 
			
		
		
		
	!84 fix: 修复数据库备份与恢复问题
* refactor dbScheduler * fix: 按团队名称检索团队 * feat: 创建数据库资源时支持全选数据库 * refactor dbScheduler * fix: 修复数据库备份与恢复问题
This commit is contained in:
		@@ -16,8 +16,6 @@ import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/pkg/errors"
 | 
			
		||||
	"golang.org/x/sync/singleflight"
 | 
			
		||||
 | 
			
		||||
	"mayfly-go/internal/db/config"
 | 
			
		||||
	"mayfly-go/internal/db/dbm/dbi"
 | 
			
		||||
	"mayfly-go/internal/db/domain/entity"
 | 
			
		||||
@@ -186,6 +184,12 @@ func (svc *DbProgramMysql) downloadBinlogFilesOnServer(ctx context.Context, binl
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Parse the first binlog eventTs of a local binlog file.
 | 
			
		||||
func (svc *DbProgramMysql) parseLocalBinlogLastEventTime(ctx context.Context, filePath string) (eventTime time.Time, parseErr error) {
 | 
			
		||||
	// todo: implement me
 | 
			
		||||
	return time.Now(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Parse the first binlog eventTs of a local binlog file.
 | 
			
		||||
func (svc *DbProgramMysql) parseLocalBinlogFirstEventTime(ctx context.Context, filePath string) (eventTime time.Time, parseErr error) {
 | 
			
		||||
	args := []string{
 | 
			
		||||
@@ -227,36 +231,8 @@ func (svc *DbProgramMysql) parseLocalBinlogFirstEventTime(ctx context.Context, f
 | 
			
		||||
	return time.Time{}, errors.New("解析 binlog 文件失败")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var singleFlightGroup singleflight.Group
 | 
			
		||||
 | 
			
		||||
// FetchBinlogs downloads binlog files from startingFileName on server to `binlogDir`.
 | 
			
		||||
func (svc *DbProgramMysql) FetchBinlogs(ctx context.Context, downloadLatestBinlogFile bool, earliestBackupSequence, latestBinlogSequence int64) ([]*entity.BinlogFile, error) {
 | 
			
		||||
	var downloaded bool
 | 
			
		||||
	key := strconv.FormatUint(svc.dbInfo().InstanceId, 16)
 | 
			
		||||
	binlogFiles, err, _ := singleFlightGroup.Do(key, func() (interface{}, error) {
 | 
			
		||||
		downloaded = true
 | 
			
		||||
		return svc.fetchBinlogs(ctx, downloadLatestBinlogFile, earliestBackupSequence, latestBinlogSequence)
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if downloaded {
 | 
			
		||||
		return binlogFiles.([]*entity.BinlogFile), nil
 | 
			
		||||
	}
 | 
			
		||||
	if !downloadLatestBinlogFile {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
	binlogFiles, err, _ = singleFlightGroup.Do(key, func() (interface{}, error) {
 | 
			
		||||
		return svc.fetchBinlogs(ctx, true, earliestBackupSequence, latestBinlogSequence)
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return binlogFiles.([]*entity.BinlogFile), err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// fetchBinlogs downloads binlog files from startingFileName on server to `binlogDir`.
 | 
			
		||||
func (svc *DbProgramMysql) fetchBinlogs(ctx context.Context, downloadLatestBinlogFile bool, earliestBackupSequence, latestBinlogSequence int64) ([]*entity.BinlogFile, error) {
 | 
			
		||||
	// Read binlog files list on server.
 | 
			
		||||
	binlogFilesOnServerSorted, err := svc.GetSortedBinlogFilesOnServer(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -352,7 +328,13 @@ func (svc *DbProgramMysql) downloadBinlogFile(ctx context.Context, binlogFileToD
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	lastEventTime, err := svc.parseLocalBinlogLastEventTime(ctx, binlogFilePath)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	binlogFileToDownload.FirstEventTime = firstEventTime
 | 
			
		||||
	binlogFileToDownload.LastEventTime = lastEventTime
 | 
			
		||||
	binlogFileToDownload.Downloaded = true
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user