CINCINNATI -- Albert Pujols was the star, but you didn't have to be clairvoyant to see that coming. Rookie Jarrett Hoffpauir was the hero, though, and that one was a little harder to predict.

Hoffpauir's two-out, two-run single in the top of the ninth gave the Cardinals the deciding runs in a hard-fought 7-4 win on Friday, a victory only made possible when Pujols broke yet another pair of records an inning before. Pujols hit his fourth grand slam of the season and the 10th of his career, each number setting a new Cardinals franchise mark, as St. Louis rallied from a 3-0 deficit to win its third straight game.

"That's why the game is the greatest," said exhausted manager Tony La Russa.

Shut out for seven innings, looking like they were on their way to another futile night and another hard-luck loss for Joel Pineiro, the Cardinals rallied in the eighth.

Reds starter Homer Bailey had been brilliant, retiring 13 consecutive batters at one point and going from the first until the seventh without allowing a base hit. He got into trouble in the eighth, though, with Colby Rasmus' pinch-single starting the uprising. After Brendan Ryan flied out, Skip Schumaker drew a walk, chasing Bailey.

The Reds turned to reliever Arthur Rhodes to face the left-handed Chris Duncan, but La Russa summoned Hoffpauir to make his Major League debut. The youngster drew a walk to load the bases, and the Reds called on righty David Weathers to face Pujols despite Pujols' 9-for-18 career mark against Weathers. Unsurprisingly, the slugger did what he always seems to do: He delivered the big hit.

On a 2-2 pitch, Pujols jumped on a fastball and drilled it 391 feet into the left-field seats for the 10th grand slam of his Major League career. It was also his 350th home run in the big leagues, making him the third-youngest player to get there. Only Alex Rodriguez and Ken Griffey Jr. reached 350 at an earlier age.

"I was looking for a pitch to hit if it's in the strike zone, and just try to stay away from the double play," Pujols said. "Obviously, I put good wood on it and it went out of the park."

"What hurt was the walk before Pujols," Reds manager Dusty Baker said. "He's a one-man wrecking crew. ... He kind of beat us by himself."

Yet the Cardinals still hadn't secured the win. Hoping not to use closer Ryan Franklin, they turned to Josh Kinney rather than one of their usual eighth-inning pitchers, Kyle McClellan or Jason Motte, and Kinney got in trouble. He surrendered two hits to open the inning, and it took Dennys Reyes and Motte to escape the jam without giving up more than one run.

In the ninth, though, the Cards rallied again, and Rasmus again started it with a single -- this time after the Reds retired the first two St. Louis batters. Ryan followed with a single, and Schumaker reached on an error by shortstop Paul Janish. Hoffpauir got his first big league hit and RBI on an 0-1 pitch, placing it perfectly in shallow left field. Pujols followed with an RBI double for insurance.

"Kind of surreal," Hoffpauir said. "I don't know if it's set in or not. But that's what I want to do. I wanted to come in and help the team win however I could. Luckily, I got a hit tonight that helped us out. ... You're just trying not to do too much. You try to punch it somewhere and get it to fall. Luckily, this time it did."

Motte picked up the win in relief after Kinney was charged with the tying run. Franklin pitched after all, and found himself in still more hot water before delivering the save. A double and two walks loaded the bases, forcing him to face the dangerous Brandon Phillips as the go-ahead run. But Franklin struck Phillips out, securing his 20th save in 21 chances.

"The battle we put up, to battle back like that, for me to let that get away, I wouldn't be able to live with myself for at least a day," Franklin said.

The Cardinals moved one game ahead of Milwaukee in the National League Central.