func restore()

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
}