Atletico Madrid scored twice in stoppage time to come back and beat Valencia 3-2 in LaLiga.
Yunus Musah put Los Che ahead in the 25th minute with a 20-yard strike and Hugo Duro doubled the lead just before half-time.
Atletico substitute Matheus Cunha reduced the deficit from a corner midway through the second half, but it seemed Diego Simeone would be left frustrated as the clock ticked down.
However, there was late drama as Angel Correa equalised in stoppage time before centre-back Mario Hermoso fired in a winner from close range to spark wild celebrations from the home support.
Sevilla had also fought back from two goals down to draw 2-2 with Celta Vigo.
But Julen Lopetegui’s side scored twice in the space of three second-half minutes through Papu Gomez and Oliver Torres to leave Sevilla three points behind Los Blancos, who host Elche on Sunday.
Earlier, Villarreal moved above Barcelona into sixth by beating Mallorca 3-0 at El Madrigal, where the visitors had defender Franco Russo sent off late on.
Alvaro Negredo and Salvi were on target as Cadiz won 2-0 at bottom club Levante to boost their own survival hopes.
Erling Haaland gave Dortmund an early lead with a close-range finish, but Croatian Andrej Kramaric equalised with a volley on the stroke of half-time.
Marco Reus struck just before the hour and an own goal from Hoffenheim defender David Raum in the 66th minute put Dortmund in control, although there was concern when Haaland went off with what looked like a groin problem.
Hoffenheim substitute Georginio Rutter struck with 13 minutes left to set up a tense finale, but Marco Rose’s men closed out victory to move three points behind Bayern, who travel to Hertha Berlin on Sunday.
Moussa Diaby scored his first Bundesliga hat-trick as third-placed Bayer Leverkusen thrashed Augsburg 5-1 at the BayArena.
Karim Bellarabi put the hosts ahead in the ninth minute, with Diaby doubling the lead before the break.
After Arne Maier reduced the deficit, Frenchman Diaby struck twice in the space of four minutes with substitute Lucas Alario adding a late fifth.
Max Kruse scored in each half as Union Berlin kept themselves in the Champions League places with a 2-1 win at Borussia Monchengladbach,
Bottom club Greuther Furth beat Mainz 2-1, but fellow strugglers Stuttgart lost 2-0 at Freiburg to extend a winless run to five league games while Bochum and Cologne drew 2-2.
Inter Milan moved five points clear at the top of Serie A after coming from behind to beat Venezia 2-1 with a last-minute goal from Edin Dzeko.
Thomas Henry’s header gave the struggling visitors a shock 19th-minute lead, but Nicolo Barella equalised shortly before half-time and Dzeko had the last say.
Lazio missed the chance to make up more ground on the top five after being held to a frustrating 0-0 draw at home against Atalanta, while relegation-battlers Genoa picked up point from a goalless stalemate at home against Udinese.
In France, Marseille climbed to second in Ligue 1 with a 2-0 win at Lens thanks to goals from Dimitri Payet and Cedric Bakambu, while champions Lille suffered a first defeat in 10 league games after losing by the same scoreline at Brest.