"What a baseball game," Astros manager Cecil Cooper said. "I don't know how to explain it, but these guys keep coming up with big hits and making big plays."
Houston, which improved to 3-40 when trailing after eight innings, pulled to within one game of the Cardinals for the lead in the National League Central. The Astros are 30-17 since May 30 and 11-4 since suffering consecutive shutouts in San Francisco on July 3-4.
"We've got a long way to go," said Lance Berkman, who delivered a key pinch-hit single in the seventh. "No matter what happens, it's not like we won the Central. We're still down a game. It was a great series and a great win. We showed a lot of character to come back against [Chris] Carpenter. When he's on the mound with a two-run lead in the last couple of innings, it's not looking pretty good."
The largest crowd at Minute Maid Park since Opening Day (37,619) came to see a battle of pitching aces: Carpenter for the Cardinals, and red-hot Roy Oswalt for the Astros. And neither disappointed.
Carpenter gave up eight hits and two runs in eight innings, and Oswalt allowed seven hits and three runs in seven innings. The Cardinals took a 3-2 lead into the ninth and turned the ball over to closer Ryan Franklin, who had saved 22 of 23 games previously.
The Astros' rally began with a single by Ivan Rodriguez, who scored from first base on Chris Coste's double to left-center field. Coste, who was claimed off waivers last week and started in place of the injured Berkman, was going to bunt, but swung away after falling behind 0-2.
"That's the biggest thing, when you join a team in the middle of the year and then you get a chance to play, you definitely want to help your team win and personally succeed," Coste said. "There's nothing that will welcome you to a team like helping your team win."
With Coste at second and no outs, Keppinger pinch-hit and was going to bunt before he saw Cardinals defenders creeping in on the corners. He swung away on the second pitch and ripped a single to left to send Coste to third.
After Michael Bourn flied out and Kaz Matsui hit into a fielder's choice to erase Coste at home plate, Tejada drilled a 2-2 pitch into left field to score Keppinger easily from second. The Astros were 7-for-19 hitting with runners in scoring position.
"He's come through all year," Cooper said of Tejada. "He's gotten big, big hits for us all year. I was a little disappointed we didn't do it early, because we had two chances there [in the first and seventh] and didn't get it done, but Tejada's been huge all year. Today was outstanding."
Tejada, who left the bases loaded to end the seventh, called the hit his biggest as a member of the Astros.
"We never quit," he said. "Like I always say, right now we believe in what we have. I think anybody that steps up to the plate, we expect them to do something good. It's everybody. It's not one guy. Everybody believes."
The Cardinals scored twice against Oswalt in the seventh to take a 3-1 lead, but Houston rallied in the bottom of the inning. Rodriguez doubled with one out, went to third on Berkman's single and scored on Matsui's two-out, bases-loaded single.
"These guys over there can play," Carpenter said. "They've always been able to, and they always give us a tough battle. We have a long way to go. We have a lot of games with them, and we have a lot of games left in the season. It's going to be a tough battle all year."
The key to the Astros' resurgence has been starting pitching. Houston starters have posted a 3.26 ERA in the team's past 23 games, including 18 quality starts. Oswalt has a 2.00 ERA in six starts since June 24.
Houston pitchers held Cardinals slugger Albert Pujols to two hits in 11 at-bats in the series.
"Any time you go up against somebody like Carpenter, you're going to have to throw pretty close to shutout ball," Oswalt said. "He's competitive and going to keep the score down. We were able to scratch a few runs off him, and I was able to keep the game close to give us a chance."