(CNN) -- Bayern Munich's faint hopes of retaining the German league title were almost extinguished on Saturday following a shock 3-2 defeat by lowly Cologne.
The Bavarians dropped to fifth place, 15 points behind runaway leaders Borussia Dortmund, after blowing a 2-0 lead against a team languishing third from bottom.
Dortmund could only draw 0-0 with Schalke on Friday, but remained 12 points clear after second-placed Bayer Leverkusen lost 1-0 at 10-man Nuremberg less than 24 hours later.
Mainz retained third despite being held 1-1 by Werder Bremen, but were joined on 37 points by Hanover 96 -- who beat Wolfsburg 1-0.
Bayern boss Louis van Gaal, who was without ill Dutch winger Arjen Robben and had Franck Ribery on the bench, has now yet to beat Cologne in four competitive matches since taking charge in 2009.
The Dutchman had been in a comfortable position at halftime with his team 2-0 up through Germany striker Mario Gomez and Turkey midfielder Hamit Altintop.
Gomez opened the scoring against his former club in the 22nd minute as a pass from Thomas Muller set up his league-leading 16th goal this season, then Altintop doubled the lead just before halftime with a right-foot strike after being set free down the flank by Philipp Lahm.
Cologne reduced the deficit 10 minutes after the interval as Christian Clemens scored his first goal this season, beating goalkeeper Thomas Kraft at the near post after running on to Christian Eichner's pass.
Slovenia striker Milivoje Novakovic equalized just after the hour with a header after Slawomir Peszko put Youssef Mohamad's low cross back into his path, then delighted the 50,000 sellout crowd with a 73rd-minute winner.
The 31-year-old beat Holger Badstuber to a long kick from his own keeper Michael Rensing and fired past Kraft to give the Billy Goats a vital three points that put the club three clear of the automatic relegation places but still in the playoff zone.
"Today we wasted a big chance to move up the table because all our rivals lost except Hanover," Van Gaal said in quotes reported by AFP.
"If you play the first half time as masterfully as we did, it is unbelievable that we gave the game away. This is the fourth or fifth time we have done this. We tried everything after we went 3-2 down, but it was too late by then."
Nuremberg ended Bayer Leverkusen's run of 10 away matches unbeaten thanks to a fine strike by midfielder Christian Eigler, who was then sent off for two bookings in the final 10 minutes.
Leverkusen gave former Germany captain Michael Ballack only his second start this season after a broken leg, but the 34-year-old made little impact before being substituted in the second half.
Eigler settled a match of few chances in the 60th minute when his shot flew in off the post, leaving goalkeeper Rene Adler with no chance.
The result left the home team in ninth, a point behind Hamburg -- whose home clash with struggling local rivals St. Pauli on Sunday has been postponed due to heavy rain.
Mainz could have gone above Leverkusen and looked like doing that after Andre Schurrle's 19th-minute opener, but Claudio Pizarro snatched a last-gasp equalizer for Werder Bremen.
The 20-year-old Schurrle, already a Germany international, latched onto a pass from Sami Allagui but was unable to double the lead twice in the second half when he was denied by stand-in keeper Sebastian Mielitz.
The 21-year-old, replacing the suspended Tim Wiese, then helped Bremen equalize as Mainz could not deal with his long clearance, allowing veteran Peruvian striker Pizarro to volley home and put Bremen 13th on goal difference behind Wolfsburg.
Hanover's win over Wolfsburg put the club also two points behind Leverkusen, as goalkeeper Diego Benaglio gifted Sergio Pinto a fifth-minute winner -- and Diego missed a late penalty to leave visiting manager Steve McClaren fighting to save his job.
The Englishman revamped his squad last month after selling Edin Dzeko to Manchester City, but is finding it hard to lift the 2009 Bundesliga champions.
Diego was fouled with 11 minutes to play by Austrian defender Emanuel Pogatetz, who used to play for McClaren at Middlesbrough, but the Brazilian blasted his spotkick against the bar.
The result left Wolfsburg a point above Cologne, St. Pauli and Kaiserslautern, who lost 3-2 at Hoffenheim despite having the advantage of an extra player for the last 11 minutes.
Seventh-placed Hoffenheim led 2-0 at halftime through Gylfi Sigurdsson's seventh goal of the season and a cross by Sebastian Rudy that deceived goalkeeper Tobias Sippel.
Lautern leveled with quickfire goals by Erwin Hoffer and Rodnei, the latter a lucky score 69 seconds later on the hour after keeper Tom Starke punched the ball against the Brazilian's head.
Vedad Ibisevic combined with fellow Bosnian Sejad Salihovic on 63 minutes, and the hosts held on despite having substitute Edson Braafheid sent off for kicking out at Christian Tiffert as Ivo Ilicevic hit the Hoffenheim post.
In a battle of the bottom two teams, Stuttgart won 3-2 at Borussia Monchengladbach in the late match to move up to 19 points.
The home team had led 2-0 at halftime with goals from Dante and Igor de Camargo, but Stuttgart leveled through Pavel Pogrebnyak and Martin Harnik.
Dante was sent off for a second yellow card on 87, and Timo Gebhart subsequently scored the winner from the penalty spot.