in pitr/cli/internal/cmd/restore.go [86:141]
func restore() error {
// init local storage
ls, err := pkg.NewLocalStorage(pkg.DefaultRootDir())
if err != nil {
return xerr.NewCliErr(fmt.Sprintf("new local storage failed, err:%s", err.Error()))
}
proxy, err := pkg.NewShardingSphereProxy(Username, Password, pkg.DefaultDBName, Host, Port)
if err != nil {
return xerr.NewCliErr(fmt.Sprintf("new ss-proxy failed, err:%s", err.Error()))
}
// get backup record
var bak *model.LsBackup
if CSN != "" {
bak, err = ls.ReadByCSN(CSN)
if err != nil {
return xerr.NewCliErr("read backup record by csn failed")
}
}
if RecordID != "" {
bak, err = ls.ReadByID(RecordID)
if err != nil {
return xerr.NewCliErr("read backup record by id failed")
}
}
if bak == nil {
return xerr.NewCliErr("backup record not found")
}
// check if the backup logic database exits,
// if exits, we need to warning user that we will drop the database.
if err := checkDatabaseExist(proxy, bak); err != nil {
return xerr.NewCliErr(fmt.Sprintf("check database exist failed:%s", err.Error()))
}
// check agent server status
logging.Info("Checking agent server status...")
if available := checkAgentServerStatus(bak); !available {
return xerr.NewCliErr("one or more agent server are not available.")
}
// exec restore
logging.Info("Start restore backup data to openGauss...")
if err := execRestore(bak); err != nil {
return xerr.NewCliErr(fmt.Sprintf("exec restore failed:%s", err.Error()))
}
logging.Info("Restore backup data to openGauss success!")
// restore metadata to ss-proxy
if err := restoreDataToSSProxy(proxy, bak); err != nil {
return xerr.NewCliErr(fmt.Sprintf("restore metadata to ss-proxy failed:%s", err.Error()))
}
logging.Info("Restore success!")
return nil
}