Norwegian prodigy Haaland missed Dortmund's last four games in all competitions with a thigh complaint, but returned against Mainz to score his third brace in as many appearances and take his season tally to nine league goals. Victory sent Dortmund top of the table, leapfrogging Bayern Munich and Bayer Leverkusen, who meet on Sunday.
Marco Reus smashed a brilliant half-volley into the top corner to give Dortmund the lead on three minutes, before Haaland coolly converted a penalty to double the lead after the break. Jonathan Burkardt struck late on to give Mainz hope, but Haaland swept in a second in injury time to seal the win and continue Dortmund's perfect home record this season.
Fellow top-four hopefuls RB Leipzig lost further ground on the leaders as they were held to a 1-1 draw away to unbeaten Freiburg. Emil Forsberg converted a penalty just after the half-hour mark to give Leipzig the lead and become the first Bundesliga goalscorer in Freiburg's new stadium.
Korean forward Jeong Woo-yeong levelled the scores with a header in the second half, however, as Leipzig dropped points for the fifth time this season to slip seven points behind Dortmund. Leipzig also remain behind Freiburg and Union Berlin, who moved up to fifth with a 2-0 win over Wolfsburg. Nigerian striker Taiwo Awoniyi was the matchwinner in a hard-fought game for Union, firing them into the lead on 49 minutes before winning the ball on the left wing to help set up Sheraldo Becker's 83rd-minute header and seal the win.
Further down the table, Hertha Berlin relieved the pressure on beleaguered boss Pal Dardai with a 2-1 win at Eintracht Frankfurt after five defeats in their opening seven games. Marco Richter bundled a Vladimir Darida cross over the line with the faintest of touches to give Hertha an early lead, which Jurgen Ekkelenkamp doubled with a tap-in just after the hour mark. A late penalty from Goncalo Paciencia was not enough to save Frankfurt from a second defeat of the season.