Padres reliever Matt Strahm started the bullpen game and retired nine batters on 36 pitches, including four strikeouts. It was the team's third bullpen start this season while left-hander Joey Lucchesi recovers from a right hip strain.
Adam Cimber (3-2) retired the next six with two strikeouts before Harrison Bader broke up the perfect game with an infield single in the sixth. Bader was promptly erased in a double play.
Brad pitched the ninth for his 20th save.
Hosmer drove the first pitch of the fourth inning to center field to give the Padres a 1-0 lead. It was his second home run in three games.
A.J. Ellis tacked on two more with a two-out hit in the fourth. The Cardinals challenged the safe call on the second run, but replay showed the Freddy Galvis beat catcher Yadier Molina's tag at hoem plate.
Cardinals starter Miles Mikolas (7-2) struck out five in six innings and walked none. He has walked one or less in all seven of his home starts this season, but St. Louis still lost for the second time in three games.
Marcell Ozuna's RBI single snapped the Padres' shutout bid in the seventh. Ozuna has driven in five runs in his last four games.
Padres: OF Franchy Cordero (right forearm strain) took batting practice and hopes to begin a rehab in a couple of days.
Cardinals: RHP Matt Bowman (right hand blisters) gave up a run in two innings Monday at Triple-A Memphis and could be activated by the end of the week.
Cardinals RHP Luke Weaver (3-5, 4.35 ERA) will get the start in the series finale against the Padres and LHP Eric Lauer (2-4, 6.64 ERA) on Wednesday at 7:15 CDT. Weaver has not allowed a run in 12 innings (two career starts) against San Diego. Lauer gave up six runs in 2 1/3 innings against St. Louis on May 11.
More AP baseball: https://apnews.com/tag/MLBbaseball