Chris Brown gave Doncaster a half-time lead and the visitors seldom posed a threat until Rovers took their foot off the pedal midway through the second half, paving the way for Pompey's fight back, which was sealed by Jed Wallace in the 75th minute.
Doncaster gradually got on top in a drab first half in which both sides struggled to play football on a bumpy pitch.
But when the chances came their way the promotion-chasers were found wanting and Billy Paynter fired straight to the goalkeeper after being put clean through in the 28th minute after earlier missing another good chance.
Rovers finally grabbed the lead in the 37th minute when a brilliant run by Brown saw him latch on to a pass from David Cotterill to flick the ball home.
Visiting keeper Simon Eastwood made a great save to prevent Cotterill increasing Rover's lead in the 61st minute before the home side lost their grip on the game.
Portsmouth battled back bravely and Wallace snatched a surprise equalizer in the 75th minute after being set up by Patrick Agyemang.
Doncaster tried to rally, but were foiled again by Eastwood, who made a super save to deny on-loan Dean Furman a goal on his debut two minutes from time.