Having lost 1-0 at home to Dortmund last Saturday, Jupp Heynckes' men were beaten again, their defence struggling to cope with a Mainz side who were not intimidated by the German record champions.
"We made it easy for them, there is no doubt they're fighting to stay away from the relegation zone," fumed Bayern captain Philipp Lahm.
"Generally speaking, we are normally the better team, but if you don't put in the necessary effort, that is what happens."
The win was no more than the hosts deserved after Bayern repeatedly surrendered possession in midfield, where they are missing the calming influence of injured star Bastian Schweinsteiger, who is nursing a broken collarbone.
Mainz were rewarded when Austrian midfielder Andreas Ivanschitz struck after just 11 minutes.
Bayern defender Daniel van Buyten equalised on 56 minutes, but Mainz were not to be denied a win which lifts them to 13th as midfielder Marco Caligiuri and defender Niko Bungert scored to put the hosts 3-1 up.
Van Buyten scored his second header to make it 3-2 with 11 minutes left to set up a tense finale, but Mainz held on.
"You can make a plan and tell the team, but the players have to believe in it and make it work," said Mainz coach Thomas Tuchel.
"We didn't allow Bayern many opportunites and we deserved this win."
Bayern director of sport Christian Nerlinger admitted his side had lost their way, despite qualifying for the knock-out phase of the Champions League.
"We have lost two of our last three games, which obviously has consequences on the league table," he said with Bayern to face Bremen, Stuttgart and Cologne before the German league's winter break.
"Things aren't running as smoothly as they were, but I'm confident we'll win our remaining league games before Christmas."
Bayern's defeat sees them slip to third, with Dortmund seizing top spot in the wake of their 2-0 win over Schalke in the Ruhr derby on Saturday.
Borussia Moenchengladbach are second on goal difference after their 3-0 win at Cologne on Friday, with Bayern a point back in third and Werder Bremen, who enjoyed a 2-0 win at home to VfB Stuttgart, fourth on 26 points.
Dortmund now travel to 'Gladbach next Saturday, while Bayern host Bremen, in what is shaping up to be another massive weekend in an increasingly fascinating title race.
Dortmund's win over Schalke was their seventh victory in eight league games.
Poland striker Robert Lewandowski and Brazilian defender Felipe Santana scored the goals in front of 80,720 spectators.
There is no love lost between the rival fans and 35 arrests were made at Dortmund's sold out Signal Iduna Park stadium as fights between supporters were broken up by police using batons and pepper spray.
Having booked their place in the knock-out phase of the Champions League with a late win at home to Chelsea on Wednesday, Leverkusen were held to a 3-3 draw in a thrilling game at Hertha Berlin, with Eren Derdiyok scoring a hat-trick.
Hamburg's new coach Thorsten Fink has now gone five games unbeaten after a draw 1-1 at Hanover, which left his side 15th, while Hanover are now eighth.
Bottom side Augsburg picked up only their second victory of the season, and their first home win, when they inflicted a 2-0 defeat on 2009 champions Wolfsburg.
Augsburg's win tightens things at the foot of the table with four points now separating the bottom six sides.
What the stars mean:
★ Poor ★ ★ Promising ★★★ Good ★★★★ Very good ★★★★★ Exceptional