Bayern Munich won their 11th consecutive Bundesliga title in dramatic fashion before Lionel Messi surpassed Cristiano Ronaldo to become the top scorer in the history of Europe’s big five divisions, helping Paris St Germain secure back-to-back Ligue 1 crowns.
Jamal Musiala’s 89th-minute goal saw Bayern beat Cologne 2-1 and capitalise on Borussia Dortmund’s failure to beat Mainz in a 2-2 draw, while PSG’s 1-1 draw away to Strasbourg – which included Messi’s 496th league strike – was enough to confirm the capital club as champions with one game to spare.
Dortmund would have claimed their first title since the 2011-12 season if they had beaten Mainz at home but drew 2-2, only levelling in the sixth minute of stoppage time, while Musiala’s late strike gave Bayern a 2-1 win at Cologne to take the honours on goal difference.
Dortmund, for whom England midfielder Jude Bellingham was an unused substitute after injury, quickly got the sense this would not be their day.
They fell behind to Andreas Hanche-Olsen’s 15th-minute header, then saw Sebastian Haller’s penalty saved moments later before Karim Onisiwo doubled Mainz’s lead in the 24th minute.
Raphael Guerreiro offered the hosts hope when he hammered in a cross from Gio Reyna in the 69th minute.
And soon after Dortmund were back at the top of the standings as Dejan Ljubicic’s 81st-minute penalty cancelled out Kingsley Coman’s early curling strike to make it 1-1 in Cologne, Dortmund ahead by a point at that stage.
But there was one final twist as Serge Gnabry, guilty of conceding that late penalty, teed up Musiala to fire in the winner.
Niklas Sule scored deep into time added on for Dortmund but it would make no difference as Thomas Tuchel’s Bayern took the title.
The party did not last long for either Bayern chief executive Oliver Kahn or board member Hasan Salihamidzic, however, with Bayern announcing within an hour of the final whistle that both were to be replaced.
Third-placed Leipzig scored twice in the last 10 minutes to finish with a 4-2 win over relegated Schalke.
That kept them four points above Union Berlin, who confirmed fourth place by edging Werder Bremen 1-0 while Freiburg conceded twice in the last 10 minutes to lose 2-1 at Eintracht Frankfurt.
Ten-man Bayer Leverkusen lost 3-0 at Bochum but clung on to sixth by just two goals in the goal difference column above Frankfurt.
Augsburg avoided the threat of relegation despite a 2-0 loss to Borussia Monchengladbach as Stuttgart were held to a 1-1 draw by Hoffenheim, sending them into a play-off.
Relegated Hertha Berlin signed off with a 2-1 win away to Wolfsburg.
Messi, set up by Kylian Mbappe, fired PSG in front in Strasbourg in the 59th minute, and although Kevin Gameiro levelled there was no denying them the title as they sit four points above Lens, who beat AC Ajaccio 3-0 to secure second place.
Lille clung on to fourth place as Jonathan David’s 89th-minute penalty saw them come from behind to beat Nantes 2-1, keeping them one point ahead of Rennes, who beat Monaco 2-0.
With Nantes losing, Auxerre edged two points clear of the drop zone with a 1-1 draw at Toulouse.
Third-placed Marseille lost 2-1 at home to Brest. Lyon are within three points of fifth place after beating Reims 3-0. Nice came from 2-0 down to win 3-2 away to Montpellier, while Clermont beat Lorient 2-0 and Angers beat Troyes 2-1.
Champions League finalists Inter Milan struck early on their way to a 3-2 win over Atalanta that moved them up to second in Serie A, with Romelu Lukaku and Nicolo Barella both on target inside the first three minutes.
However, Europa League finalists Roma saw their top-four hopes ended as Luka Jovic and Jonathan Ikone scored twice in the last five minutes to give Fiorentina a 2-1 win.
Torino won 4-0 away to Spezia as Salernitana beat Udinese 3-2.
A Rodrygo brace saw Real Madrid come from behind to win 2-1 at Sevilla, who led through a third-minute goal from Rafa Mir but finished with 10 men as Marcos Acuna saw red.