mirror of
https://github.com/jkaninda/mysql-bkup.git
synced 2025-12-06 13:39:41 +01:00
feat: add backup all databases
This commit is contained in:
@@ -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")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user