BVB have now failed to win their last two league games.
Mats Hummels gave BVB the lead after just eight minutes, but Nuri Sahin missed a chance to give the hosts a two-goal cushion when he failed to convert an 18th minute penalty. And they were made to pay a minute from full time when Petar Sliskovic netted the equalizer for Mainz.
It was a scrappy start to the match, and the first real strike on goal came from Mainz forward Andre Schuerrle who fired in a free kick from 30 yards which Roman Weidenfeller pushed away. A moment later Marcel Schmelzer broke free down the left but struck his shot wide of the post.
Dortmund looked the stronger of the two teams, and it was they who had broke the deadlock after Bo Svensson went right through Nuri Sahin and the referee awarded a free kick to Dortmund. Sahin took it himself from around 35 yards out, and his drive seemed covered until Mats Hummels got the slightest of flicks and it was enough to force Christian Wetklo to spill the ball over the line giving Die Borussian the lead.
The momentum was with BVB and they should have doubled the lead, as Lucas Barrios was clean through on goal, but Wetklo took him out in the area and the referee awarded a penalty. Sahin took the spotkick, but he was denied by an excellent save from Wetklo, who made amends for his earlier spill.
The busy Schmelzer then delivered a good cross just before half time and substitute Robert Lewandowski, on for the injured Barrios, should have done better as he headed off target.
The second half started similar to how the first half ended with Dortmund attacking; Jakub Blaszczykowski was unable to keep his strike down and it was always rising over the bar.
Sami Allgui thought he had equalized for Mainz when he had the ball in the back of the net after he pounced on a rebound off Weidenfeller, but he was adjudged to have been offside.
Schmelzer once again found the freedom down the left to cross in, but Lewandoski could not wrap his foot around the ball and fired well over the bar.
Mainz seemed to be at the wrong carnival as the only team playing in front of a carnival atmosphere was Dortmund, who did not allow their guests any clear cut chances.
The pressure was continuous by Dortmund and came close again to increase the lead but Neven Subotic headed wide as he managed to get on the end of a Sahin corner.
The busy Sahin was dictating his team's attacking play and he cut inside on his left only to fire wide, as he and Schmelzer remained constant thorns in Mainz's side throughout the game.
With minutes remaining however, Mainz stunned their dominant hosts when they snatched an equaliser. Marcel Risse did well down the right and delivered a great cross; Sliskovic controlled expertly and fired under Weidenfellaer to clinch a vital point against the run of play.
Dortmund have now failed to win their last two games, but remain a commanding ten points over second-place Bayer Leverkusen, who only play Schalke on Sunday. Mainz stay in fifth and in contention for a Europa League spot.