in oracle/pkg/database/dbdaemon/dbdaemon_server.go [364:406]
func (s *Server) physicalRestore(ctx context.Context, req *dbdpb.PhysicalRestoreRequest) (*empty.Empty, error) {
errorPrefix := "dbdaemon/physicalRestore: "
if _, err := s.RunRMAN(ctx, &dbdpb.RunRMANRequest{Scripts: []string{req.GetRestoreStatement()}}); err != nil {
return nil, fmt.Errorf(errorPrefix+"failed to restore a database: %v", err)
}
if req.GetPitrRestoreInput() != nil {
if err := s.stageAndCatalog(ctx, req); err != nil {
return nil, fmt.Errorf(errorPrefix+"failed to stage or catalog redo logs: %v", err)
}
}
var recoverStmt string
if req.GetPitrRestoreInput() == nil {
scn, err := s.latestSCN(ctx, req.GetLatestRecoverableScnQuery())
if err != nil {
return nil, fmt.Errorf(errorPrefix+"failed to get the latest SCN: %v", err)
}
recoverStmt = fmt.Sprintf(req.GetRecoverStatementTemplate(), fmt.Sprintf("scn %d", scn))
} else if req.GetPitrRestoreInput().GetEndTime() != nil {
recoverStmt = fmt.Sprintf(req.GetRecoverStatementTemplate(), fmt.Sprintf(`time "to_date('%s','DD-MON-YYYY HH24:MI:SS')"`, req.GetPitrRestoreInput().GetEndTime().AsTime().Format("02-Jan-2006 15:04:05")))
} else if req.GetPitrRestoreInput().GetEndScn() != 0 {
recoverStmt = fmt.Sprintf(req.GetRecoverStatementTemplate(), fmt.Sprintf("scn %d", req.GetPitrRestoreInput().GetEndScn()))
}
if recoverStmt == "" {
return nil, fmt.Errorf(errorPrefix+"failed to build recover statement from req %+v", req)
}
klog.InfoS(errorPrefix+"final recovery request", "recoverStmt", recoverStmt)
recoverReq := &dbdpb.RunRMANRequest{Scripts: []string{recoverStmt}}
if _, err := s.RunRMAN(ctx, recoverReq); err != nil {
return nil, fmt.Errorf(errorPrefix+"failed to recover a database: %v", err)
}
// always remove rman staging dir for restore from GCS
if err := os.RemoveAll(consts.RMANStagingDir); err != nil {
klog.Warningf("physicalRestore: can't cleanup staging dir from local disk.")
}
return &empty.Empty{}, nil
}