Seydou Keita and Xavi struck in the last 11 minutes to earn 10-man Barcelona a nervy 3-1 home win over lowly Sporting Gijon that kept their La Liga title hopes alive on Saturday.
With leading scorer Lionel Messi suspended for the first time in his career, the champions lacked a cutting edge until Andres Iniesta fired them in front just before halftime at the Nou Camp.
The game was turned on its head a minute into the second half when home defender Gerard Pique was shown a harsh red card as he got in a tangle with Miguel de las Cuevas on the edge of the Barca area.
Almost immediately substitute David Barral stole in front of keeper Victor Valdes to nudge in the equaliser for second from bottom Sporting.
The magnificent Iniesta drove Barca forward in search of the winner and it was Keita who struck the decisive goal with a stunning shot into the top corner from an Alexis layoff.
Iniesta then conjured a third goal for Xavi who finished with a neat lob at the end as Barca closed the gap on leaders Real Madrid to seven points until Jose Mourinho's side host Espanyol at the Bernabeu on Sunday.
"With Messi it would have been easier because he is the best player in the world," Mali international Keita told Spanish television.
"I don't know if I have saved the team. It was just important to win three points."
Keita refused to speak about referee Carlos Velasco Carballo but Pique was highly critical when he spoke to reporters.
"I have seen it on television and I didn't even commit a foul," he said. "It felt like it was a premeditated decision.
"I told the referee at halftime he should have signalled a penalty in favour of Keita and he remembered this."
Real, on course for a first league title in four years, have 64 points and second-placed Barca 57.
Big-spending Malaga moved up to fourth on 37 points with their first away win since November.
Manuel Pellegrini's side climbed into the Champions League qualification places with a 3-1 comeback win at Getafe courtesy of three spectacular long-range strikes.
Portugal's Eliseu fired Malaga level after 57 minutes, France midfielder Jeremy Toulalan crashed a second in off the post and Spain's Santi Cazorla caught out the home keeper from just over the halfway line with a wonderful lob in stoppage time.
Atletico Madrid stayed ninth with 33 points after being held to a 1-1 draw at tenth-placed Sevilla, a point doing little for either side's European aspirations.
Salvio headed Atletico in front after only nine minutes but Baba grabbed an equaliser for the hosts after a counter-attack in the 53rd.
Rayo Vallecano came back from 2-0 down to beat 10-man Racing Santander 4-2 while Real Mallorca drew 1-1 at home to Osasuna.