CLEVELAND -- Yovani Gallardo wanted to throw perfect strikes and suddenly could not throw any.
"I tried to be too fine against a patient ballclub," Gallardo said. "Before I knew it, I was throwing, 6, 7, 8 pitches to almost every hitter. But I was able to minimize the damage and our offense came through for a win."
The defense helped, too. Center fielder Mike Cameron made a fine running catch in right-center to take away Mark DeRosa's bid for extra bases with a runner on second in the eighth. Prince Fielder's diving stop at first base with a runner on took a hit away from Ryan Garko -- just before Travis Hafner hit a two-run homer in the ninth.
"Flip a coin as to which play was best," Milwaukee manager Ken Macha said. "The ball Cam caught had a bunch of runs written all over it. Fielder saved us a run, too."
Gallardo gave up two runs and five hits while striking out eight. He twice worked out of bases-loaded jams.
The Indians went hitless in 14 tries with runners in scoring position and left 12 runners stranded overall until Hafner delivered to make it 7-5.
That came after Cleveland's bullpen allowed eight runs Monday in a wild 14-12 loss.
"If you look at the last two nights, there are a lot of things you don't like to see," Indians manager Eric Wedge said.
Milwaukee, leading the NL Central, won for only the third time in nine games. The Indians fell further into last place in the AL Central with their third loss in four games.
Gallardo has a 1.44 ERA in five starts since May 25 -- but has made 221 pitches in only 10 innings over his past two outings.
J.J. Hardy had two hits and two RBI for Milwaukee. The shortstop entered the game in a 1-for-35 slump. He was hitless in 30 at-bats before singling in the sixth inning Monday.
"It was good to see J.J. get a couple of hits, but overall we did a lot of mundane stuff," Macha said. "I don't mean to complain about a win, but Yovani was not exactly pitching to contact. We had to get four innings out of the bullpen. The off day on Thursday will be welcome to our relievers."
Hafner drove in three runs, Shin-Soo Choo had three hits, and Mark DeRosa hit a solo homer, his 13th, and had two RBI for Cleveland.
Hafner has hit .310 (9 for 29) with three homers and seven RBI in eight games since being activated June 5. He missed all of May with a sore shoulder after having surgery on it in October.
"It's doing pretty good," Hafner said. "It feels a little tired, but overall it feels pretty good. I feel like it's progressing better than it was two weeks ago."
The Brewers got within 2-1 in the fourth against Jeremy Sowers (1-4). Ryan Braun singled and scored on Fielder's opposite-field double off the left-field wall.
Milwaukee took a 3-2 lead with a two-run fifth. Casey McGehee drove in one run with a bases-loaded fielder's choice and Bill Hall followed with a sacrifice fly.
Mike Cameron snapped an 0-for-16 slide with a run-scoring triple in the Brewers' three-run eighth. He was the only Brewer without a hit Monday.
"Cam needed that," Macha said. "He got one of the big hits. He's never given in and kept battling so it was good to see."
Sowers gave up three runs on five hits and two walks over five innings. The left-hander struck out two.
McGehee left in the seventh with a sore right knee. Macha said McGehee also has an "ugly" ankle after fouling a ball off it and would not play Wednesday. ... Hafner drew consecutive intentional walks in the fifth and seventh. He didn't have any in his first 92 plate appearances. ... Hall went 0 for 4 to extend his slump to 7 for 75 (.093). ... Indians 3B-SS Jhonny Peralta, in a 5-for-35 slump, didn't play. Manager Eric Wedge said thinks Peralta is trying to pull the ball too much. "He's got to get his head straight. He's not a baby anymore. He's been up here four or five years. He's got to figure it out. It's the big leagues." ... Indians LHP Scott Lewis allowed one run over 3 2/3 innings in an injury rehab outing for Double-A Akron. He's been sidelined since April 11 by a strained elbow.