feat: add backup all databases

This commit is contained in:
2025-03-12 15:50:30 +01:00
parent 0bc7497512
commit d5061453b0
7 changed files with 110 additions and 54 deletions

View File

@@ -50,5 +50,6 @@ func init() {
BackupCmd.PersistentFlags().StringP("cron-expression", "e", "", "Backup cron expression (e.g., `0 0 * * *` or `@daily`)") BackupCmd.PersistentFlags().StringP("cron-expression", "e", "", "Backup cron expression (e.g., `0 0 * * *` or `@daily`)")
BackupCmd.PersistentFlags().StringP("config", "c", "", "Configuration file for multi database backup. (e.g: `/backup/config.yaml`)") BackupCmd.PersistentFlags().StringP("config", "c", "", "Configuration file for multi database backup. (e.g: `/backup/config.yaml`)")
BackupCmd.PersistentFlags().BoolP("disable-compression", "", false, "Disable backup compression") BackupCmd.PersistentFlags().BoolP("disable-compression", "", false, "Disable backup compression")
BackupCmd.PersistentFlags().BoolP("all", "a", false, "Backup all databases")
} }

View File

@@ -39,7 +39,7 @@ func azureBackup(db *dbConfig, config *BackupConfig) {
utils.Info("Backup database to Azure Blob Storage") utils.Info("Backup database to Azure Blob Storage")
// Backup database // Backup database
err := BackupDatabase(db, config.backupFileName, disableCompression) err := BackupDatabase(db, config.backupFileName, disableCompression, config.all)
if err != nil { if err != nil {
recoverMode(err, "Error backing up database") recoverMode(err, "Error backing up database")
return return

View File

@@ -197,31 +197,32 @@ func startMultiBackup(bkConfig *BackupConfig, configFile string) {
} }
// BackupDatabase backup database // BackupDatabase backup database
func BackupDatabase(db *dbConfig, backupFileName string, disableCompression bool) error { func BackupDatabase(db *dbConfig, backupFileName string, disableCompression, all bool) error {
storagePath = os.Getenv("STORAGE_PATH") storagePath = os.Getenv("STORAGE_PATH")
utils.Info("Starting database backup...") utils.Info("Starting database backup...")
err := os.Setenv("MYSQL_PWD", db.dbPassword) //err := os.Setenv("MYSQL_PWD", db.dbPassword)
if err != nil { //if err != nil {
return fmt.Errorf("failed to set MYSQL_PWD environment variable: %v", err) // return fmt.Errorf("failed to set MYSQL_PWD environment variable: %v", err)
} //}
err = testDatabaseConnection(db) err := testDatabaseConnection(db)
if err != nil { if err != nil {
return errors.New(err.Error()) return errors.New(err.Error())
} }
// Backup Database database // Backup Database database
utils.Info("Backing up database...") utils.Info("Backing up database...")
// Verify is compression is disabled // Verify is compression is disabled
if disableCompression { if disableCompression {
if all {
// Backup all databases
// Execute mysqldump // Execute mysqldump
cmd := exec.Command("mysqldump", cmd := exec.Command("mysqldump",
fmt.Sprintf("--defaults-file=%s", mysqlClientConfig), db.dbName, fmt.Sprintf("--defaults-file=%s", mysqlClientConfig), "--all-databases", "--single-transaction", "--routines", "--triggers",
) )
output, err := cmd.Output() output, err := cmd.Output()
if err != nil { if err != nil {
return fmt.Errorf("failed to backup database: %v output: %v", err, output) return fmt.Errorf("failed to backup database: %v output: %v", err, string(output))
} }
// save output // save output
@@ -241,6 +242,56 @@ func BackupDatabase(db *dbConfig, backupFileName string, disableCompression bool
return err return err
} }
utils.Info("Database has been backed up") utils.Info("Database has been backed up")
} else {
// Execute mysqldump
cmd := exec.Command("mysqldump",
fmt.Sprintf("--defaults-file=%s", mysqlClientConfig), db.dbName,
)
output, err := cmd.Output()
if err != nil {
return fmt.Errorf("failed to backup database: %v output: %v", err, string(output))
}
// save output
file, err := os.Create(filepath.Join(tmpPath, backupFileName))
if err != nil {
return fmt.Errorf("failed to create backup file: %v", err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
return
}
}(file)
_, err = file.Write(output)
if err != nil {
return err
}
utils.Info("Database has been backed up")
}
} else {
if all {
// Execute mysqldump
cmd := exec.Command("mysqldump", fmt.Sprintf("--defaults-file=%s", mysqlClientConfig), "--all-databases", "--single-transaction", "--routines", "--triggers")
stdout, err := cmd.StdoutPipe()
if err != nil {
return fmt.Errorf("failed to backup database: %v output: %v", err, stdout)
}
gzipCmd := exec.Command("gzip")
gzipCmd.Stdin = stdout
gzipCmd.Stdout, err = os.Create(filepath.Join(tmpPath, backupFileName))
err = gzipCmd.Start()
if err != nil {
return fmt.Errorf("failed to backup database: %v", err)
}
if err := cmd.Run(); err != nil {
log.Fatal(err)
}
if err := gzipCmd.Wait(); err != nil {
log.Fatal(err)
}
} else { } else {
// Execute mysqldump // Execute mysqldump
@@ -264,12 +315,13 @@ func BackupDatabase(db *dbConfig, backupFileName string, disableCompression bool
} }
} }
}
utils.Info("Database has been backed up") utils.Info("Database has been backed up")
return nil return nil
} }
func localBackup(db *dbConfig, config *BackupConfig) { func localBackup(db *dbConfig, config *BackupConfig) {
utils.Info("Backup database to local storage") utils.Info("Backup database to local storage")
err := BackupDatabase(db, config.backupFileName, disableCompression) err := BackupDatabase(db, config.backupFileName, disableCompression, config.all)
if err != nil { if err != nil {
recoverMode(err, "Error backing up database") recoverMode(err, "Error backing up database")
return return

View File

@@ -77,6 +77,7 @@ type BackupConfig struct {
publicKey string publicKey string
storage string storage string
cronExpression string cronExpression string
all bool
} }
type FTPConfig struct { type FTPConfig struct {
host string host string
@@ -256,6 +257,7 @@ func initBackupConfig(cmd *cobra.Command) *BackupConfig {
prune = true prune = true
} }
disableCompression, _ = cmd.Flags().GetBool("disable-compression") disableCompression, _ = cmd.Flags().GetBool("disable-compression")
all, _ := cmd.Flags().GetBool("all")
_, _ = cmd.Flags().GetString("mode") _, _ = cmd.Flags().GetString("mode")
passphrase := os.Getenv("GPG_PASSPHRASE") passphrase := os.Getenv("GPG_PASSPHRASE")
_ = utils.GetEnv(cmd, "path", "AWS_S3_PATH") _ = utils.GetEnv(cmd, "path", "AWS_S3_PATH")
@@ -281,6 +283,7 @@ func initBackupConfig(cmd *cobra.Command) *BackupConfig {
config.publicKey = publicKeyFile config.publicKey = publicKeyFile
config.usingKey = usingKey config.usingKey = usingKey
config.cronExpression = cronExpression config.cronExpression = cronExpression
config.all = all
return &config return &config
} }

View File

@@ -51,7 +51,7 @@ func StartMigration(cmd *cobra.Command) {
conf := &RestoreConfig{} conf := &RestoreConfig{}
conf.file = backupFileName conf.file = backupFileName
// Backup source Database // Backup source Database
err := BackupDatabase(dbConf, backupFileName, true) err := BackupDatabase(dbConf, backupFileName, true, false)
if err != nil { if err != nil {
utils.Fatal("Error backing up database: %s", err) utils.Fatal("Error backing up database: %s", err)
} }

View File

@@ -39,7 +39,7 @@ import (
func sshBackup(db *dbConfig, config *BackupConfig) { func sshBackup(db *dbConfig, config *BackupConfig) {
utils.Info("Backup database to Remote server") utils.Info("Backup database to Remote server")
// Backup database // Backup database
err := BackupDatabase(db, config.backupFileName, disableCompression) err := BackupDatabase(db, config.backupFileName, disableCompression, config.all)
if err != nil { if err != nil {
recoverMode(err, "Error backing up database") recoverMode(err, "Error backing up database")
return return
@@ -160,7 +160,7 @@ func ftpBackup(db *dbConfig, config *BackupConfig) {
utils.Info("Backup database to the remote FTP server") utils.Info("Backup database to the remote FTP server")
// Backup database // Backup database
err := BackupDatabase(db, config.backupFileName, disableCompression) err := BackupDatabase(db, config.backupFileName, disableCompression, config.all)
if err != nil { if err != nil {
recoverMode(err, "Error backing up database") recoverMode(err, "Error backing up database")
return return

View File

@@ -39,7 +39,7 @@ func s3Backup(db *dbConfig, config *BackupConfig) {
utils.Info("Backup database to s3 storage") utils.Info("Backup database to s3 storage")
// Backup database // Backup database
err := BackupDatabase(db, config.backupFileName, disableCompression) err := BackupDatabase(db, config.backupFileName, disableCompression, config.all)
if err != nil { if err != nil {
recoverMode(err, "Error backing up database") recoverMode(err, "Error backing up database")
return return