Skip to content

Commit

Permalink
Merge pull request #9 from feederco/restore
Browse files Browse the repository at this point in the history
Implement restore functionality
  • Loading branch information
erkie committed Feb 3, 2019
2 parents f1a49cc + 3f34441 commit b6ef180
Show file tree
Hide file tree
Showing 9 changed files with 377 additions and 66 deletions.
54 changes: 48 additions & 6 deletions cmd/backup.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,15 @@ func Begin(cliArgs []string) {

uploadFileFlag := flag.String("upload-file", "", "[upload] File to upload to bucket")
existingVolumeIDFlag := flag.String("existing-volume-id", "", "Existing volume ID")
existingBackupDirectoryFlag := flag.String("existing-backup-directory", "", "Existing backup directory")
hostnameFlag := flag.String("hostname", "", "Hostname of backups to list")
timestampFlag := flag.String("timestamp", "", "List backups since timestamp. Should be in format YYYYMMDDHHII")
verboseFlag := flag.Bool("v", false, "Verbose logging")

pkg.VerboseMode = *verboseFlag

configStruct = loadConfig(args[1:])

pkg.VerboseMode = *verboseFlag

if configStruct.DOSpaceName == "" {
pkg.ErrorLog.Fatalln("-do-space-name parameter required")
}
Expand Down Expand Up @@ -78,13 +79,54 @@ func Begin(cliArgs []string) {

switch args[0] {
case "perform":
err = backupMysqlPerform(backupTypeDecide, configStruct.DOSpaceName, configStruct.MysqlDataPath, *existingVolumeIDFlag, configStruct.PersistentStorage, digitalOceanClient, minioClient)
err = backupMysqlPerform(
backupTypeDecide,
configStruct.DOSpaceName,
configStruct.MysqlDataPath,
*existingVolumeIDFlag,
*existingBackupDirectoryFlag,
configStruct.PersistentStorage,
digitalOceanClient,
minioClient,
)
case "perform-full":
err = backupMysqlPerform(backupTypeFull, configStruct.DOSpaceName, configStruct.MysqlDataPath, *existingVolumeIDFlag, configStruct.PersistentStorage, digitalOceanClient, minioClient)
err = backupMysqlPerform(
backupTypeFull,
configStruct.DOSpaceName,
configStruct.MysqlDataPath,
*existingVolumeIDFlag,
*existingBackupDirectoryFlag,
configStruct.PersistentStorage,
digitalOceanClient,
minioClient,
)
case "perform-incremental":
err = backupMysqlPerform(backupTypeIncremental, configStruct.DOSpaceName, configStruct.MysqlDataPath, *existingVolumeIDFlag, configStruct.PersistentStorage, digitalOceanClient, minioClient)
err = backupMysqlPerform(
backupTypeIncremental,
configStruct.DOSpaceName,
configStruct.MysqlDataPath,
*existingVolumeIDFlag,
*existingBackupDirectoryFlag,
configStruct.PersistentStorage,
digitalOceanClient,
minioClient,
)
case "restore":
err = backupMysqlPerformRestore()
fromHostname := hostname
if *hostnameFlag != "" {
fromHostname = *hostnameFlag
}

err = backupMysqlPerformRestore(
fromHostname,
*timestampFlag,
configStruct.DOSpaceName,
configStruct.MysqlDataPath,
*existingVolumeIDFlag,
*existingBackupDirectoryFlag,
digitalOceanClient,
minioClient,
)
case "upload":
if *uploadFileFlag == "" {
pkg.ErrorLog.Fatalln("-upload-file parameter required for `upload` command.")
Expand Down
33 changes: 10 additions & 23 deletions cmd/backup_perform.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,11 @@ import (
minio "github.com/minio/minio-go"

"os"
"os/exec"

"github.com/digitalocean/godo"
)

func backupMysqlPerform(backupType string, backupsBucket string, mysqlDataPath string, existingVolumeID string, persistentStorageDirectory string, digitalOceanClient *pkg.DigitalOceanClient, minioClient *minio.Client) error {
func backupMysqlPerform(backupType string, backupsBucket string, mysqlDataPath string, existingVolumeID string, existingBackupDirectory string, persistentStorageDirectory string, digitalOceanClient *pkg.DigitalOceanClient, minioClient *minio.Client) error {
var err error

pkg.Log.Println("Backup started", time.Now().Format(time.RFC3339))
Expand Down Expand Up @@ -61,7 +60,7 @@ func backupMysqlPerform(backupType string, backupsBucket string, mysqlDataPath s
return err
}

sizeInGigaBytes := sizeInBytes / (1 << (10 * 3))
sizeInGigaBytes := bytesToGigaBytes(sizeInBytes)
// aDecentSizeInGigaBytes := sizeInGigaBytes + (sizeInGigaBytes / 6)
aDecentSizeInGigaBytes := sizeInGigaBytes

Expand All @@ -73,6 +72,7 @@ func backupMysqlPerform(backupType string, backupsBucket string, mysqlDataPath s
aDecentSizeInGigaBytes,
digitalOceanClient,
existingVolumeID,
existingBackupDirectory,
)

if err != nil {
Expand All @@ -91,20 +91,12 @@ func backupMysqlPerform(backupType string, backupsBucket string, mysqlDataPath s

// - Start Percona XtraBackup
err = (func() error {
err = os.MkdirAll(backupDirectory, 0755)
err = os.MkdirAll(backupDirectory, 0700)
if err != nil {
pkg.AlertError(configStruct.Alerting, "Could not create backup directory.", err)
return err
}

var outputFile *os.File
outputFile, err = os.Create(backupFileTemporary)
if err != nil {
pkg.AlertError(configStruct.Alerting, "Could not create backup file.", err)
return err
}
defer outputFile.Close()

backupArgs := []string{
"--backup",
"--extra-lsndir",
Expand All @@ -131,18 +123,9 @@ func backupMysqlPerform(backupType string, backupsBucket string, mysqlDataPath s
}
}

backupCmd := exec.Command("xtrabackup", backupArgs...)
backupCmd.Stdout = outputFile

err = backupCmd.Start()
err = pkg.PerformCommandWithFileOutput(backupFileTemporary, "xtrabackup", backupArgs...)
if err != nil {
pkg.AlertError(configStruct.Alerting, "Could not start xtrabackup command.", err)
return err
}

err = backupCmd.Wait()
if err != nil {
pkg.AlertError(configStruct.Alerting, "Could not create backup.", err)
pkg.AlertError(configStruct.Alerting, "xtrabackup cmd failed", err)
return err
}

Expand Down Expand Up @@ -184,3 +167,7 @@ func backupMysqlPerform(backupType string, backupsBucket string, mysqlDataPath s

return backupCleanup(volume, mountDirectory, digitalOceanClient)
}

func bytesToGigaBytes(bytes int64) int64 {
return bytes / (1 << (10 * 3))
}
Loading

0 comments on commit b6ef180

Please sign in to comment.