ST. LOUIS — One big swing from Jeff Keppinger, hardly a long-ball threat, eased the Houston Astros' frustrations after getting worked over by St. Louis Cardinals pitchers.
Keppinger hit a tiebreaking homer with two out in the ninth inning and Houston rallied to beat the Cardinals 4-3 on Thursday, avoiding a three-game sweep.
Keppinger's shot to left on a 2-2 pitch from Kyle McClellan (4-3) was his fourth of the season and first since June 19. He has only 17 homers in 1,116 career at-bats, so he was running when the drive barely cleared the wall.
"It was kind of nice to see the outcome," Keppinger said. "You ever look up at the scoreboard and see my totals?"
Jose Valverde (2-2) pitched two scoreless innings for the Astros, who scored all four runs with two outs and won for only the fifth time in their last 19 road games. They avoided a second three-game sweep in St. Louis this season by taking the final game of a series that featured only 13 runs in three one-run contests.
The Astros rallied a day after Roy Oswalt complained of a "dead" team atmosphere. The Cardinals won the first two games 1-0 and 3-2.
"This was real big," Keppinger said. "You don't give up just because you're 10 games or 11 games back. You know, you play it all the way out to the end."
Matt Holliday homered for the NL Central-leading Cardinals, who lost for only the fourth time in 19 games. St. Louis, which had won four straight overall, went 1 for 10 with runners in scoring position and missed chances to score in each of the last three innings.
"We all want to come in here and high five and play music and have fun," Brendan Ryan said. "But we can't do that."
The Astros tied it on Darin Erstad's RBI double off McClellan in the eighth, spoiling Chris Carpenter's bid for his 15th win. Keppinger's first homer in 116 at-bats barely cleared the left-field wall. Holliday made a try for it but the ball appeared to sneak under his outstretched glove.
"It was close," Holliday said. "I felt I had a chance at it and timed it pretty well. Those are hit or miss plays."
Ryan Ludwick's two-run single off Brian Moehler in the sixth, only his third hit in 17 at-bats against the right-hander, put the Cardinals ahead 3-2. Holliday's 18th homer came in the second and was his seventh in 31 games with St. Louis.
Rescued by Erstad's hit, Moehler remained 5-0 against the Cardinals over 10 starts. He's one of only five pitchers and the only active one with 60 or more innings and no losses against St. Louis.
"We didn't roll over," Moehler said. "We battled."
Kaz Matsui and Michael Bourn each drove in a run in the second for the Astros. Matsui doubled in Carlos Lee before Carpenter set up Bourn's RBI single with consecutive walks to eighth-place hitter Chris Coste and Moehler.
Carpenter finished the third with strikeouts of Miguel Tejada and Carlos Lee, the third- and fourth-toughest batters to fan in the NL, and the Astros had two hits in his final four innings. He allowed five hits total before leaving after the sixth.
Carpenter missed a chance to join teammate Adam Wainwright and the Yankees' CC Sabathia as the majors' only 15-game winners, although he still leads the majors with a 2.20 ERA. Carpenter, 9-0 in his last 10 starts, said he probably was too pumped up for this start.
"I was definitely excited, for some reason," he said. "I was going hard. I definitely could have slowed down a little bit."
Moehler allowed three runs and six hits in six innings for Houston.
NOTES: Astros INF Geoff Blum, scratched from Wednesday's lineup due to a shoulder spasm, returned to Houston to be examined. ... Khalil Greene hasn't had an at-bat since Aug. 20. He was announced as a pinch hitter in the seventh then replaced by Rick Ankiel after the Astros changed relievers. ... The Cardinals were 4 for 27 with runners in scoring position in the series. ... Bourn has reached base in 20 consecutive games. ... Albert Pujols drew his major league-leading 37th intentional walk in the sixth two at-bats before Ludwick's two-run single.