Rich Harden needed to be nearly perfect to give his Cubs a chance to beat Randy Johnson. He was, and it still wasn't good enough.

Harden allowed only a solo homer in seven innings, but Johnson gave up just two singles over the same span and improved to 13-0 in 14 career starts against Chicago with a 2-0 win for the host Arizona Diamondbacks on Monday night.

"That's as good a stuff as I've seen in a while," Arizona manager Bob Melvin said of Johnson. "I think there was a little extra amp today. ... To do what he did to that club that's No. 1 in the National League in offense is pretty special."

The 44-year-old left-hander, who entered the game with a 1.98 career ERA against Chicago, is the second pitcher to go at least 10-0 against the Cubs. The other was Sal Maglie, who was 10-0 in 19 starts against Chicago from 1954 to 1958.

Johnson (7-7), winning his third straight after six consecutive losses, struck out four and walked one for his 291st victory in a swift 2-hour, 18-minute game.

"There's no rhyme or reason to it," Johnson said of his domination of Chicago.

Harden (0-1) struck out 10 and walked two in the NL Central leader's fourth loss in five games.

"He was lights out," teammate Derrek Lee said. "It's a shame we can't win that game for him. You can't get much better than that."

In other NL games Monday, it was: Milwaukee 6, St. Louis 3, 10 innings; Atlanta 4, Florida 0; San Diego 6, Cincinnati 4; Pittsburgh 9, Houston 3, and L.A. Dodgers 16, Colorado 10.

Arizona made it 2-0 against reliever Bob Howry in the eighth when Stephen Drew tripled over the head of Mark DeRosa in right field, scoring Chris Snyder from first.

After watching his team score one run in two games and get shut out in another of its four since the All-Star break, Cubs manager Lou Piniella said there would be no batting practice Tuesday or Wednesday.

"We're going to come out here and stretch and play, that's it," he said. "I'm tired of seeing balls flying all over in batting practice and when the game starts seeing nothing. So we'll just go play and hopefully that will get it done."

Micah Owings pitched a scoreless eighth and Chad Qualls worked the ninth for his second save in eight tries.

It wasn't easy. Qualls walked Ryan Theriot, then first baseman Chad Tracy bobbled pinch-hitter Kosuke Fukudome's grounder. But Reed Johnson grounded into a double play, and Aramis Ramirez bounced out to second to end it.

The shaky finish came one day after Arizona closer Brandon Lyon gave up five ninth-inning runs in a 6-5 loss to the Los Angeles Dodgers.

"It was nice to win a game like that," Johnson said, "to kind of set the tone, to come to the ballpark tomorrow having won a game almost equivalently to the game we lost yesterday."

Brewers 6, Cardinals 3, 10 innings

At St. Louis, Bill Hall homered leading off the top of the 10th against Ryan Franklin, helping Milwaukee beat St. Louis after squandering a ninth-inning lead.

Milwaukee is 4-0 on its seven-game trip and a National League-best 35-19 since May 20. The win moved the Brewers percentage points ahead of St. Louis for second place in the NL Central and two games behind Chicago.

The Brewers scored two more runs in the 10th off Franklin (3-3) on a throwing error by second baseman Aaron Miles and an RBI single by J.J. Hardy.

Braves 4, Marlins 0

At Miami, rookie Jorge Campillo pitched seven innings and two relievers completed a two-hitter for Atlanta.

Campillo (5-4) allowed both hits, walked one and lowered his ERA to 2.83.

Will Ohman and Mike Gonzalez each pitched one perfect inning. Mark Teixeira and Mark Kotsay both had two hits, drove in a run and scored once.

Chris Volstad (2-1) allowed three runs in six innings in his third major league appearance.

Padres 6, Reds 4

At Cincinnati, Kevin Kouzmanoff's two-run double completed San Diego's ninth-inning comeback off closer Francisco Cordero, and the Padres snapped their six-game losing streak.

Ken Griffey Jr. hit his 606th homer, a two-run shot that helped Cincinnati take a 4-3 lead into the ninth. Cordero (4-3) then gave up a lead for the second time in his last three appearances.

Pirates 9, Astros 3

At Houston, Freddy Sanchez hit a three-run, inside-the-park homer to cap a seven-run ninth inning, and Pittsburgh snapped a five-game losing streak.

Jason Bay and Adam LaRoche also homered in the inning off closer Jose Valverde (4-3), who came in with the Astros leading 3-2.

Dodgers 16, Rockies 10

At Denver, James Loney drove in five runs, including a bases-clearing triple, and Matt Kemp had two doubles as part of Los Angeles' eight-run first inning.

The Dodgers set season highs in runs, hits (18) and hits in an inning (seven) as they won for the fourth time in five games to remain tied with Arizona for first place in the NL West.

Kip Wells (1-2), reinstated from the 60-day disabled list before the game, got just one out before being relieved in the first.

Matt Holliday had three hits, including his 17th homer, and Troy Tulowitzki had a career-high five hits in his first game back since coming off the 15-day disabled list.