Bayern Munich suffered a shock 3-2 defeat at Rostov as they failed to produce a Champions League win to ease the pain of their Der Klassiker defeat to Borussia Dortmund.
The German champions have picked up just a single point from their last two Bundesliga fixtures, including the 1-0 loss to Dortmund on Saturday, and their failure to win in Russia means Atletico Madrid will secure top spot in Group D with victory over PSV later on Wednesday.
Douglas Costa was the biggest thorn in Rostov's side during the first half and eventually put Bayern in front after pouncing on a poor clearance.
But he was left apologising to his team-mates for a loose pass that ultimately led to Rostov's leveller from Sardar Azmoun, before Dmitri Poloz turned the game on its head from the penalty spot following a clumsy Jerome Boateng challenge early in the second half.
Juan Bernat delivered Bayern's quick reply but Christian Noboa curled home a wonderful free-kick to seal a famous first Champions League win for Rostov, who lost the reverse fixture 5-0 on matchday one, in stunning fashion.
Goalkeeper Sven Ulreich and defender Holger Badstuber were offered a rare first-team chance by Bayern head coach Carlo Ancelotti, but they showed an alarming lack of familiarity when dealing with a ball over the top after 10 minutes.
Aleksandr Erokhin capitalised on a mix-up between the pair to head goalwards beyond the on-rushing Ulreich, with Bernat reacting quickly to intercept and clear the danger.
Despite dominating possession at Olimp-2, Bayern's attacking threat was limited early on aside from a tame Costa effort that curled into the grateful clutches of Soslan Dzhanaev.
Dzhanaev again denied Costa when the Brazilian saw a header turned around the post, before Renato Sanches drew a diving save from the goalkeeper as Bayern turned the screw.
Badstuber was perhaps lucky to come away with a free-kick when he went to ground as the last defender under pressure from Azmoun, but Costa continued to look most likely to open the scoring, fizzing an effort narrowly over the crossbar just after the half-hour mark.
And it was the former Shakhtar Donetsk winger - perhaps more suited to the conditions playing 200 kilometres from the Donbass Arena on the other side of the Russia-Ukraine border - who did eventually break the deadlock.
Sanches' effort from a tight angle was blocked by Dzhanaev but poorly cleared by Cesar Navas, allowing Costa to run onto the ball and guide it into the back of the net via a deflection.
But Costa was largely to blame when Rostov pulled level a minute before the break - his backpass caught Boateng off guard, allowing Poloz to steal in and tee up Azmoun to round the Bayern centre-back for a tidy finish past Ulreich.
The second half started with Philipp Lahm heading just wide of the target, but more clumsy defending by the visitors opened the door for Rostov to take the lead, as Boateng brought down Noboa after a stumble in the box.
The cold air exposed Poloz's heavy breathing ahead of a huge penalty, but the attacker kept his cool to find the bottom-right corner.
Bayern's response was immediate, with Bernat latching onto a Franck Ribery throughball to smash home from close range.
Noboa then curled home a free-kick from 20 yards to put Rostov on the brink of a famous win, but referee Artur Soares Dias had hearts in mouths when he pointed to the spot late on following a coming together in the box.
The Portuguese swiftly changed his mind to give offside against Bayern, and Dzhanaev kept out Thiago Alcantara in the closing stages to ensure a first Champions League win for any Russian club over the Bavarian giants.
Thank you for reading 5 articles this month* Join now for unlimited access
Enjoy your first month for just £1 / $1 / €1
*Read 5 free articles per month without a subscription
Join now for unlimited access
Try first month for just £1 / $1 / €1
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.