wal-g

Форк
0
/
backup_fetch.go 
119 строк · 4.6 Кб
1
package pg
2

3
import (
4
	"fmt"
5

6
	"github.com/spf13/cobra"
7
	"github.com/spf13/viper"
8
	"github.com/wal-g/tracelog"
9
	"github.com/wal-g/wal-g/internal"
10
	conf "github.com/wal-g/wal-g/internal/config"
11
	"github.com/wal-g/wal-g/internal/databases/postgres"
12
	"github.com/wal-g/wal-g/internal/multistorage"
13
	"github.com/wal-g/wal-g/internal/multistorage/policies"
14
)
15

16
const (
17
	backupFetchShortDescription = "Fetches a backup from storage"
18
	maskFlagDescription         = `Fetches only files which path relative to destination_directory
19
matches given shell file pattern.
20
For information about pattern syntax view: https://golang.org/pkg/path/filepath/#Match`
21
	restoreSpecDescription        = "Path to file containing tablespace restore specification"
22
	reverseDeltaUnpackDescription = "Unpack delta backups in reverse order (beta feature)"
23
	skipRedundantTarsDescription  = "Skip tars with no useful data (requires reverse delta unpack)"
24
	targetUserDataDescription     = "Fetch storage backup which has the specified user data"
25
	restoreOnlyDescription        = `[Experimental] Downloads only databases or tables specified by passed names.
26
Separate parameters with comma. Use 'database' or 'database/namespace.table' as a parameter ('public' namespace can be omitted).  
27
Sets reverse delta unpack & skip redundant tars options automatically. Always downloads system databases and tables.`
28
)
29

30
var fileMask string
31
var restoreSpec string
32
var reverseDeltaUnpack bool
33
var skipRedundantTars bool
34
var fetchTargetUserData string
35
var partialRestoreArgs []string
36

37
var backupFetchCmd = &cobra.Command{
38
	Use:   "backup-fetch destination_directory [backup_name | --target-user-data <data>]",
39
	Short: backupFetchShortDescription, // TODO : improve description
40
	Args:  cobra.RangeArgs(1, 2),
41
	Run: func(cmd *cobra.Command, args []string) {
42
		internal.ConfigureLimiters()
43

44
		if fetchTargetUserData == "" {
45
			fetchTargetUserData = viper.GetString(conf.FetchTargetUserDataSetting)
46
		}
47
		targetBackupSelector, err := createTargetFetchBackupSelector(cmd, args, fetchTargetUserData)
48
		tracelog.ErrorLogger.FatalOnError(err)
49

50
		storage, err := postgres.ConfigureMultiStorage(false)
51
		tracelog.ErrorLogger.FatalOnError(err)
52

53
		rootFolder := multistorage.SetPolicies(storage.RootFolder(), policies.UniteAllStorages)
54
		if targetStorage == "" {
55
			rootFolder, err = multistorage.UseAllAliveStorages(rootFolder)
56
		} else {
57
			rootFolder, err = multistorage.UseSpecificStorage(targetStorage, rootFolder)
58
		}
59
		tracelog.ErrorLogger.FatalOnError(err)
60
		tracelog.InfoLogger.Printf("Backup to fetch will be searched in storages: %v", multistorage.UsedStorages(rootFolder))
61

62
		if partialRestoreArgs != nil {
63
			skipRedundantTars = true
64
			reverseDeltaUnpack = true
65
		}
66
		reverseDeltaUnpack = reverseDeltaUnpack || viper.GetBool(conf.UseReverseUnpackSetting)
67
		skipRedundantTars = skipRedundantTars || viper.GetBool(conf.SkipRedundantTarsSetting)
68

69
		var extractProv postgres.ExtractProvider
70

71
		if partialRestoreArgs != nil {
72
			extractProv = postgres.NewExtractProviderDBSpec(partialRestoreArgs)
73
		} else {
74
			extractProv = postgres.ExtractProviderImpl{}
75
		}
76

77
		var pgFetcher internal.Fetcher
78
		if reverseDeltaUnpack {
79
			pgFetcher = postgres.GetFetcherNew(args[0], fileMask, restoreSpec, skipRedundantTars, extractProv)
80
		} else {
81
			pgFetcher = postgres.GetFetcherOld(args[0], fileMask, restoreSpec, extractProv)
82
		}
83

84
		internal.HandleBackupFetch(rootFolder, targetBackupSelector, pgFetcher)
85
	},
86
}
87

88
// create the BackupSelector to select the backup to fetch
89
func createTargetFetchBackupSelector(cmd *cobra.Command,
90
	args []string, targetUserData string) (internal.BackupSelector, error) {
91
	targetName := ""
92
	if len(args) >= 2 {
93
		targetName = args[1]
94
	}
95

96
	backupSelector, err := internal.NewTargetBackupSelector(targetUserData, targetName, postgres.NewGenericMetaFetcher())
97
	if err != nil {
98
		fmt.Println(cmd.UsageString())
99
		return nil, err
100
	}
101
	return backupSelector, nil
102
}
103

104
func init() {
105
	backupFetchCmd.Flags().StringVar(&fileMask, "mask", "", maskFlagDescription)
106
	backupFetchCmd.Flags().StringVar(&restoreSpec, "restore-spec", "", restoreSpecDescription)
107
	backupFetchCmd.Flags().BoolVar(&reverseDeltaUnpack, "reverse-unpack",
108
		false, reverseDeltaUnpackDescription)
109
	backupFetchCmd.Flags().BoolVar(&skipRedundantTars, "skip-redundant-tars",
110
		false, skipRedundantTarsDescription)
111
	backupFetchCmd.Flags().StringVar(&fetchTargetUserData, "target-user-data",
112
		"", targetUserDataDescription)
113
	backupFetchCmd.Flags().StringSliceVar(&partialRestoreArgs, "restore-only",
114
		nil, restoreOnlyDescription)
115
	backupFetchCmd.Flags().StringVar(&targetStorage, "target-storage",
116
		"", targetStorageDescription)
117

118
	Cmd.AddCommand(backupFetchCmd)
119
}
120

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.