diff --git a/cmd/backup.go b/cmd/backup.go index a6b2f13..afe12eb 100644 --- a/cmd/backup.go +++ b/cmd/backup.go @@ -50,5 +50,6 @@ func init() { 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().BoolP("disable-compression", "", false, "Disable backup compression") + BackupCmd.PersistentFlags().BoolP("all", "a", false, "Backup all databases") } diff --git a/pkg/azure.go b/pkg/azure.go index 7a0c602..6278bed 100644 --- a/pkg/azure.go +++ b/pkg/azure.go @@ -39,7 +39,7 @@ func azureBackup(db *dbConfig, config *BackupConfig) { utils.Info("Backup database to Azure Blob Storage") // Backup database - err := BackupDatabase(db, config.backupFileName, disableCompression) + err := BackupDatabase(db, config.backupFileName, disableCompression, config.all) if err != nil { recoverMode(err, "Error backing up database") return diff --git a/pkg/backup.go b/pkg/backup.go index 905966a..f2b0822 100644 --- a/pkg/backup.go +++ b/pkg/backup.go @@ -197,79 +197,131 @@ func startMultiBackup(bkConfig *BackupConfig, configFile string) { } // 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") utils.Info("Starting database backup...") - err := os.Setenv("MYSQL_PWD", db.dbPassword) - if err != nil { - return fmt.Errorf("failed to set MYSQL_PWD environment variable: %v", err) - } - err = testDatabaseConnection(db) + //err := os.Setenv("MYSQL_PWD", db.dbPassword) + //if err != nil { + // return fmt.Errorf("failed to set MYSQL_PWD environment variable: %v", err) + //} + err := testDatabaseConnection(db) if err != nil { return errors.New(err.Error()) } // Backup Database database utils.Info("Backing up database...") - // Verify is compression is disabled if disableCompression { - // 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, 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 all { + // Backup all databases + // Execute mysqldump + cmd := exec.Command("mysqldump", + fmt.Sprintf("--defaults-file=%s", mysqlClientConfig), "--all-databases", "--single-transaction", "--routines", "--triggers", + ) + output, err := cmd.Output() if err != nil { - return + return fmt.Errorf("failed to backup database: %v output: %v", err, string(output)) } - }(file) - _, err = file.Write(output) - if err != nil { - return err + // 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 { + // 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") } - utils.Info("Database has been backed up") } else { - // Execute mysqldump - cmd := exec.Command("mysqldump", fmt.Sprintf("--defaults-file=%s", mysqlClientConfig), db.dbName) - 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) - } + 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 { + // Execute mysqldump + cmd := exec.Command("mysqldump", fmt.Sprintf("--defaults-file=%s", mysqlClientConfig), db.dbName) + 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) + } + + } } utils.Info("Database has been backed up") return nil } func localBackup(db *dbConfig, config *BackupConfig) { utils.Info("Backup database to local storage") - err := BackupDatabase(db, config.backupFileName, disableCompression) + err := BackupDatabase(db, config.backupFileName, disableCompression, config.all) if err != nil { recoverMode(err, "Error backing up database") return diff --git a/pkg/config.go b/pkg/config.go index 7573c60..ce401f9 100644 --- a/pkg/config.go +++ b/pkg/config.go @@ -77,6 +77,7 @@ type BackupConfig struct { publicKey string storage string cronExpression string + all bool } type FTPConfig struct { host string @@ -256,6 +257,7 @@ func initBackupConfig(cmd *cobra.Command) *BackupConfig { prune = true } disableCompression, _ = cmd.Flags().GetBool("disable-compression") + all, _ := cmd.Flags().GetBool("all") _, _ = cmd.Flags().GetString("mode") passphrase := os.Getenv("GPG_PASSPHRASE") _ = utils.GetEnv(cmd, "path", "AWS_S3_PATH") @@ -281,6 +283,7 @@ func initBackupConfig(cmd *cobra.Command) *BackupConfig { config.publicKey = publicKeyFile config.usingKey = usingKey config.cronExpression = cronExpression + config.all = all return &config } diff --git a/pkg/migrate.go b/pkg/migrate.go index 1edfd3e..41c9229 100644 --- a/pkg/migrate.go +++ b/pkg/migrate.go @@ -51,7 +51,7 @@ func StartMigration(cmd *cobra.Command) { conf := &RestoreConfig{} conf.file = backupFileName // Backup source Database - err := BackupDatabase(dbConf, backupFileName, true) + err := BackupDatabase(dbConf, backupFileName, true, false) if err != nil { utils.Fatal("Error backing up database: %s", err) } diff --git a/pkg/remote.go b/pkg/remote.go index d01069d..5545882 100644 --- a/pkg/remote.go +++ b/pkg/remote.go @@ -39,7 +39,7 @@ import ( func sshBackup(db *dbConfig, config *BackupConfig) { utils.Info("Backup database to Remote server") // Backup database - err := BackupDatabase(db, config.backupFileName, disableCompression) + err := BackupDatabase(db, config.backupFileName, disableCompression, config.all) if err != nil { recoverMode(err, "Error backing up database") return @@ -160,7 +160,7 @@ func ftpBackup(db *dbConfig, config *BackupConfig) { utils.Info("Backup database to the remote FTP server") // Backup database - err := BackupDatabase(db, config.backupFileName, disableCompression) + err := BackupDatabase(db, config.backupFileName, disableCompression, config.all) if err != nil { recoverMode(err, "Error backing up database") return diff --git a/pkg/s3.go b/pkg/s3.go index 90822b9..6327fa5 100644 --- a/pkg/s3.go +++ b/pkg/s3.go @@ -39,7 +39,7 @@ func s3Backup(db *dbConfig, config *BackupConfig) { utils.Info("Backup database to s3 storage") // Backup database - err := BackupDatabase(db, config.backupFileName, disableCompression) + err := BackupDatabase(db, config.backupFileName, disableCompression, config.all) if err != nil { recoverMode(err, "Error backing up database") return