Oswalt, who had a hearing date next week, had asked for a raise from $3,425,000 to $7.8 million and was offered $6 million by the Astros. He won a career-high 20 games last season.
"Roy established himself as one of the best pitchers in the game in 2004," Astros general manager Tim Purpura. "He has been a vital part of our success on the mound for the last four years, and we look forward to his continued success in an Astros uniform."
Oswalt went 20-10 with a 3.49 ERA last season. He was the eighth Astros pitcher to win 20 in a season and had two shutouts. He also struck out 206 batters.
In four seasons with Houston, Oswalt is 63-27 with a 3.11 ERA in 120 games.