Dortmund's top scorer, Robert Lewandowski, struck twice to take his tally to 12 this season as they crushed Freiburg 4-1. Ilkay Guendogan and Kevin Grosskreutz were also on target after the hosts had briefly levelled through Jan Rosenthal.
Spaniard Raul hit a hat-trick in just over an hour for Schalke to take his tally to 10 as they crushed Bremen 5-0.
Defender Kyrgiakos Papadopoulos headed home after 68 minutes and Dutchman Klaas-Jan Huntelaar chipped in his 15th league goal of the season two minutes later.
Bayern, on 37 points, beat Cologne 3-0 on Friday despite playing with 10 men for an hour following the dismissal of Franck Ribery.
"Second place is not that bad, you can't get much better than that," said Dortmund coach Jurgen Klopp.
His team struggled for much of the first half before Guendogan restored their lead on the stroke of half-time after Freiburg's defenders stopped, thinking Jakub Blaszczykowski was offside.
"We were not much better than our opponents but still won," added Klopp.
Grosskreutz curled a 20-metre shot into the net near the hour-mark before Lewandowski, who had given them a seventh-minute lead, tapped in after 70 minutes to wrap up Dortmund's first win after two consecutive draws.
Champions League last 16 side Bayer Leverkusen slumped to a 3-0 home defeat by Nuremberg to remain sixth on 26 points.
Hamburg SV stretched their unbeaten run to nine games with a 1-1 draw at home to second-bottom Augsburg, who had goalkeeper Mohamed Amsif to thank for half a dozen superb saves.
Roman Hubnik's last-gasp goal earned Hertha Berlin a 1-1 draw at Hoffenheim to keep them in 11th above 2009 Bundesliga champions VfL Wolfsburg, who also have 20 points after ending a disappointing year with a 1-0 win over visiting VfB Stuttgart.
The Bundesliga breaks on Monday and resumes on January 20.
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.