ST. LOUIS -- A makeup game in late July carried a late-October feel.
In the last regular-season meeting of the teams with the best record in their leagues, the St. Louis Cardinals held off a ninth-inning rally by the Kansas City Royals to claim a 4-3 win Thursday night at sold-out Busch Stadium.
"There was quite an atmosphere in the ballpark tonight," St. Louis manager Mike Matheny said. "It felt like October."
In upping their home record to 34-12, the Cardinals (61-34) overcame an early 2-0 deficit with two-run homers from center fielder Randal Grichuk and third baseman Matt Carpenter, then nursed the lead over the final six innings.
Working his third consecutive night, closer Trevor Rosenthal tightroped his way through a wild ninth inning, giving up an infield hit to right fielder Alex Rios and a run-scoring triple to second baseman Omar Infante to move Kansas City within a run.
Left fielder Jarrod Dyson drew a four-pitch walk and took second on defensive indifference, but Rosenthal shut it down at that point. After fanning pinch hitter Dusty Coleman, Rosenthal induced a fielder's choice grounder from shortstop Alcides Escobar, cutting down Infante at the plate.
With third baseman Mike Moustakas hitting, Escobar took second on defensive indifference, but Rosenthal induced a game-ending grounder to second to earn his 30th save.
"It's a lot of fun being in that position," said Rosenthal, who reached the 30-save plateau for the second year in a row.
Matheny said of the ninth, "Probably wasn't quite as much fun when we were going through that inning, but Trevor's our best option there. Even when he's in trouble, you know he can get you a strikeout at any time."
Rosenthal's escape act made a winner of John Lackey (9-5), who after ceding two first-inning runs shut down the Royals (57-37). Lackey went seven innings in his eighth straight quality start, allowing six hits and two runs with two walks and five strikeouts.
Catcher Salvador Perez and Rios touched Lackey for two-out RBI singles in the first, but the 36-year-old veteran permitted just three hits and a walk after that, retiring 10 of the last 11 hitters he faced.
"He made an adjustment and kept the ball down," Escobar said of Lackey. "Plus he was going in and out on us."
Meanwhile, St. Louis used the long ball against Chris Young (8-6), who labored through three innings and 68 pitches, allowing five hits and four runs with a walk and a strikeout.
Grichuk cracked his 10th homer in the second with right fielder Jason Heyward aboard. Carpenter, embroiled in a slump that has lasted close to two months, walloped his 10th in the third after a leadoff single by second baseman Kolten Wong.
Carpenter's homer, his first on an 0-2 count this year, was just his third hit in 28 at-bats. After hitting well over .300 for the first two months, Carpenter is now batting .256, 37 points below his career average.
"I feel like this has been a good learning experience for me," he said. "I'm learning that you can't dwell on the past. What's happened is happened. Tomorrow is a new day."
The game was originally scheduled for June 14 but was rained out after a 2 1/2-hour delay. The Royals arrived in town early Thursday morning after beating the Pittsburgh Pirates 5-1 Wednesday, and he flew back home right after the game for a weekend series against the Houston Astros.
NOTES: St. Louis OF Stephen Piscotty (stiff neck) was scratched from the lineup after being scheduled to make his first big league start at first base, a position he just started playing earlier this month. Dan Johnson replaced him in the lineup, batting eighth, and he went 0-for-2 with a walk. ... From the start of 2014 through Wednesday, Kansas City owned the majors' best interleague record at 26-10. ... Cardinals LHP Jaime Garcia (groin) threw five no-hit, no-walk innings Thursday in a rehab start for Class A Peoria. He struck out six. Two Peoria relievers completed the no-hitter against Clinton. Garcia might return to the majors for a start either Tuesday or Wednesday when Cincinnati is in town.