func()

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
}