Astros 9, Cardinals 8: Jose Altuve went 4-for-5 and scored three runs while Justin Maxwell hit a two-run homer as host Houston held on to take the opener of the three-game series.
Brian Bogusevic also went deep and Chris Snyder drove in two runs for the Astros, who have won two straight following an eight-game losing streak.
Houston erased a 1-0 deficit with four runs in the bottom of the first inning, and Maxwell belted his fifth shot of the season in the second for a 6-1 lead. After Matt Adams launched a three-run blast in the third to get St. Louis within two, Bogusevic led off the fourth with his third homer.
The Astros tacked on two more runs before St. Louis rallied in the ninth. Adron Chambers ripped a one-out, two-run triple off David Carpenter and Rafael Furcal greeted closer Brett Myers with a shot off the foul pole in right to get the Cardinals within 9-8.
But Myers recorded the final two outs to nail down his 14th save in 15 opportunities.
Lucas Harrell (5-4) improved to 4-0 at home after allowing four runs over six innings. He has won three of his last four outings.
Jaime Garcia (3-4) was rusty in his first start since May 26, surrendering six runs and five hits in just two frames. The left-hander, who fell to 0-5 lifetime against Houston, missed his previous turn with discomfort in his elbow.
Adams and Furcal each scored twice for the Cardinals, who fell to 2-6 on their 10-game road trip.
GAME NOTEBOOK: St. Louis' Lance Berkman visited his teammates prior to the game as he continues his rehabilitation from arthroscopic knee surgery. Berkman, who has not played since May 19, was expected to miss eight to 10 weeks after suffering a partially torn medial meniscus in his right knee. ... SS Carlos Correa, who was drafted first overall by the Astros on Monday, is expected to meet with team officials in Houston on Thursday with hopes of signing a contract. The 17-year-old already had signed with the University of Miami but appears on the verge of beginning his professional career.