Luke Scott added a two-run triple and Mike Lamb had a two-run double as Houston snapped a four-game losing streak to the Cubs ace, who hadn't given up more than one earned run against Houston in almost two years.
"He's not invincible," Berkman said. "He's probably one of the two or three best pitchers in the league and certainly a daunting foe. But we got him tonight. Tonight was our night."
Zambrano went 5-1 in July with a 1.38 ERA. He knew early on that he didn't have his best stuff on Wednesday night.
"I was just fighting myself," he said. "I know when you stay calm and in control of yourself, you can do a better job. But I didn't do that."
Oswalt (12-6), meanwhile, won his fourth straight start while snapping a four-game losing streak to Chicago.
The Cubs have lost four in a row and six of their last seven, averaging 2.7 runs in the losses. They remained one game behind NL Central leader Milwaukee, who lost 19-4 to Colorado on Wednesday.
The Astros have now moved within 8½ games of the division lead with the sagging Brewers coming to town for a three-game series. Houston is still 51-63 and the players are keeping their chances of a playoff charge in perspective.
"We've got a lot of undigging to do," said catcher Brad Ausmus, who homered in the seventh off Michael Wuertz.
Biggio lined a homer into the left-field porch with one out in the third, the first earned run Houston had scored off Zambrano in 24 2/3 innings. Zambrano (14-8) had a combined 0.29 ERA in his previous four starts against the Astros.
Berkman walked and Carlos Lee singled before Scott drove a triple to the gap in right center to make it 3-0. The three runs were the most the Astros had scored off Zambrano since Sept. 24, 2005, when he gave up six runs in an 8-3 loss at Wrigley Field.
"That was the swing of the game," Berkman said of Scott's drive to the bullpen fence.
Oswalt faced trouble in the top of the fourth, giving up consecutive singles to Mark DeRosa and Mike Fontenot. Koyie Hill drew a one-out walk to load the bases for Zambrano, who has three home runs at Minute Maid Park.
This time, Oswalt struck him out and Zambrano snapped his bat over his knee as he trudged back to the dugout.
"What makes me mad is I got good pitches and I was thinking too much," Zambrano said. "If he'd have thrown me a curve ball, I would've understood. But he threw me a fastball and that's the pitch I was supposed to hit. That's why I was upset."
The Cubs stranded seven baserunners in the first four innings and 13 in the game.
"That's quite a few," said Cubs manager Lou Piniella.
Berkman hammered Zambrano's first pitch of the fifth into the balcony in center field for a 4-0 lead. Berkman has hit 17 of his 20 home runs this season batting left-handed.
That was more than enough run support for Oswalt, who gave up six hits with four strikeouts and four walks.
Zambrano walked Eric Bruntlett leading off the Astros sixth and Ausmus got him to second with a sacrifice bunt. Orlando Palmeiro pinch hit for Oswalt and walked before Lamb doubled into the left-field corner to make it 6-0.
Scott Eyre then relieved the excitable Zambrano, who yelled back at taunting fans as he walked back to the dugout. Scott drew a bases-loaded walk off Eyre later in the inning to stretch the lead to 7-0.
Houston reliever Matt Albers gave up an RBI single to Theriot in the eighth.
- Biggio got his 3,024th career hit, breaking a tie with Lou Brock for 22nd on the all-time list.
- The Astros have homered in 11 consecutive games, a season high.
- Zambrano notched his 1,000th career strikeout in the second inning, fanning Scott.
- Oswalt earned his 110th career win, tying Mike Scott for third place on the Astros' all-time list.
- Cubs 3B Aramis Ramirez was a last-minute lineup scratch because of a sore right wrist. DeRosa moved over from 2B to replace Ramirez and Fontenot started at 2B. Piniella said Ramirez flew back to Chicago and will see a hand specialist on Thursday. But Piniella added that he didn't think the injury was serious.