in pitr/cli/internal/cmd/backup.go [105:201]
func backup() error {
var err error
var lsBackup *model.LsBackup
proxy, err := pkg.NewShardingSphereProxy(Username, Password, pkg.DefaultDBName, Host, Port)
if err != nil {
return xerr.NewCliErr("Create ss-proxy connect failed")
}
ls, err := pkg.NewLocalStorage(pkg.DefaultRootDir())
if err != nil {
return xerr.NewCliErr("Create local storage failed")
}
defer func() {
if err != nil {
logging.Warn("Try to unlock cluster ...")
if err := proxy.Unlock(); err != nil {
logging.Error(fmt.Sprintf("Coz backup failed, try to unlock cluster, but still failed, err:%s", err.Error()))
}
if lsBackup != nil {
logging.Warn("Try to delete backup data ...")
deleteBackupFiles(ls, lsBackup)
}
}
}()
// Step1. lock cluster
logging.Info("Starting lock cluster ...")
err = proxy.LockForBackup()
if err != nil {
return xerr.NewCliErr("Lock for backup failed")
}
// Step2. Get cluster info and save local backup info
logging.Info("Starting export metadata ...")
lsBackup, err = exportData(proxy, ls)
if err != nil {
return xerr.NewCliErr(fmt.Sprintf("export backup data failed, err:%s", err.Error()))
}
logging.Info(fmt.Sprintf("Export backup data success, backup filename: %s", filename))
// Step3. Check agent server status
logging.Info("Checking agent server status...")
if available := checkAgentServerStatus(lsBackup); !available {
logging.Error("Cancel! One or more agent server are not available.")
err = xerr.NewCliErr("One or more agent server are not available.")
return err
}
// Step4. Show disk space
logging.Info("Checking disk space...")
err = checkDiskSpace(lsBackup)
if err != nil {
return xerr.NewCliErr(err.Error())
}
// Step5. send backup command to agent-server.
logging.Info("Starting backup ...")
err = execBackup(lsBackup)
if err != nil {
return xerr.NewCliErr(fmt.Sprintf("exec backup failed, err:%s", err.Error()))
}
// Step6. unlock cluster
logging.Info("Starting unlock cluster ...")
err = proxy.Unlock()
if err != nil {
return xerr.NewCliErr(fmt.Sprintf("unlock cluster failed, err:%s", err.Error()))
}
// Step7. update backup file
logging.Info("Starting update backup file ...")
err = ls.WriteByJSON(filename, lsBackup)
if err != nil {
return xerr.NewCliErr(fmt.Sprintf("update backup file failed, err:%s", err.Error()))
}
// Step8. check agent server backup
logging.Info("Starting check backup status ...")
status := checkBackupStatus(lsBackup)
logging.Info(fmt.Sprintf("Backup result: %s", status))
if status != model.SsBackupStatusCompleted && status != model.SsBackupStatusCanceled {
err = xerr.NewCliErr("Backup failed")
return err
}
// Step9. finished backup and update backup file
logging.Info("Starting update backup file ...")
err = ls.WriteByJSON(filename, lsBackup)
if err != nil {
return xerr.NewCliErr(fmt.Sprintf("update backup file failed, err: %s", err.Error()))
}
logging.Info("Backup finished!")
return nil
}