Match ends, Birmingham City 2, Middlesbrough 2.
Birmingham City 2-2 Middlesbrough
Middlesbrough returned to the top of the Championship table after coming from a goal down to claim a point in a classic at St Andrew's.
Boro move ahead of Burnley and Brighton, who can climb above them again with wins in Monday's games.
Stephen Gleeson and Jordan Rhodes shared a goal apiece in the first half, before Gaston Ramirez put Boro ahead.
David Davis levelled, but Daniel Ayala had a goal disallowed to deny the Teessiders all three points.
Both sides had numerous chances to score more goals on a cold and wet night full of breathless end-to-end action and fabulous entertainment in Small Heath.
But Ayala wrongly had what would have been a winning goal chalked off for offside before visiting skipper Grant Leadbitter wobbled the Railway Stand End crossbar with a blistering volley which proved too hot for Adam Legzdins to handle.
The game that came to life
A first half hour of tactical stalemate suddenly came to life with a string of chances at both ends, before two goals in quick succession.
Both Blues keeper Legzdins and his counterpart Dimi Konstantopoulos made key saves, but both were culpable at crucial moments.
Such was the ferocity of the Blues midfielder Gleeson's well-struck shot that Konstantopoulos could only help it into the net.
At the other end, Ramirez's free-kick should not have troubled the keeper but Legzdins fumbled the ball as if it was a bar of soap - and the predatory Rhodes raced in to prod it over the line.
Rhodes had a great chance of a second when he latched onto deflected Leadbitter's free kick but the ball came back off the post and, in his desperation to latch onto the rebound, he got in the way of the better placed Albert Adomah.
It mattered little when, in Blues' next attack, Rhodes cutely headed down Adomah's cross for Ramirez to net from almost on the line, but Davis latched onto a loose clearance to equalise again.
Ayala was then denied by the referee's assistant's flag, while there were further chances for ex-Boro loanee Diego Fabbrini who headed over, David Cotterill, who saw his powerful shot saved then somehow scrambled out for a corner and Leadbitter - who saw his thunderous effort swerve out of Legzdins' grasp to hit the bar.
Rhodes may be a prolific scorer but he reacts in a phlegmatic way to disappointment.
Twice, when he perhaps ought to have scored, he was denied by saves from Legzdins, but was still on the spot to accept when the Blues keeper offered him a gift.
Similarly, after a bad miss early in the second half, it was Rhodes who then bounced straight back to head down for Ramirez to put Boro ahead.
After scoring for Boro in only his second appearance after signing from Blackburn for £9m in the January transfer window, Rhodes then went through an uncustomary eight-game barren spell.
But his first-half equaliser at St Andrew's was his fifth goal in seven matches, his 17th of the season and, at 26, the Oldham-born Scotland international is now just 12 short of 200 career goals.
Birmingham City boss Gary Rowett told BBC Sport:
"A great game, a great advert for the Championship and we may have played our small part in who gets promoted this season.
"The Ayala goal was onside, but then I thought there was a slight suspicion about their first goal. Adam Legzdins will learn from his error and he had just made two good saves before that.
"And nothing can take away from the quality of our performance on a night which could easily have been a nervy occasion. The idea that my lads might be on the beach with their flip flops on was an insult to my players."
Middlesbrough boss Aitor Karanka: "We are in a good position. We have a chance to play at home with our crowd behind us next week.
"We have to be pleased with a point. Birmingham are a good team."
Karanka on Ayala's disallowed goal: "I like to think it was a mistake but there have been a lot of mistakes against us this season and it is not the day to discuss that."
- 31CaddisSubstituted forSpectorat 90'minutes
- 7FabbriniSubstituted forRobinsonat 79'minutes
- 26DavisSubstituted forSolomon-Otaborat 86'minutes
- 5de Laet
- 19DowningSubstituted forStuaniat 85'minutes
- 9RhodesSubstituted forNugentat 87'minutes
- 16de Sart
- Simon Hooper
- Shots on Target
Second Half ends, Birmingham City 2, Middlesbrough 2.
Attempt blocked. Maikel Kieftenbeld (Birmingham City) left footed shot from the centre of the box is blocked.
Foul by David Nugent (Middlesbrough).
Jonathan Spector (Birmingham City) wins a free kick in the defensive half.
Attempt missed. David Nugent (Middlesbrough) right footed shot from the centre of the box is too high. Assisted by Gastón Ramírez following a set piece situation.
Nsue (Middlesbrough) wins a free kick on the right wing.
Foul by Viv Solomon-Otabor (Birmingham City).
Substitution, Birmingham City. Jonathan Spector replaces Paul Caddis.
Attempt saved. Grant Leadbitter (Middlesbrough) right footed shot from outside the box is saved in the top centre of the goal. Assisted by David Nugent.
Substitution, Middlesbrough. David Nugent replaces Jordan Rhodes.
Corner, Middlesbrough. Conceded by Adam Legzdins.
Attempt missed. Nsue (Middlesbrough) right footed shot from the centre of the box is close, but misses to the right. Assisted by Cristhian Stuani.
Substitution, Birmingham City. Viv Solomon-Otabor replaces David Davis.
Substitution, Middlesbrough. Cristhian Stuani replaces Stewart Downing.
Corner, Birmingham City. Conceded by Daniel Ayala.
Attempt missed. David Cotterill (Birmingham City) right footed shot from outside the box is close, but misses to the left. Assisted by Clayton Donaldson.
Attempt saved. Paul Robinson (Birmingham City) header from the centre of the box is saved in the bottom right corner. Assisted by Jonathan Grounds.
Attempt saved. David Cotterill (Birmingham City) right footed shot from a difficult angle and long range on the right is saved in the top centre of the goal.
Foul by Ritchie de Laet (Middlesbrough).
Paul Caddis (Birmingham City) wins a free kick on the right wing.
Foul by Gastón Ramírez (Middlesbrough).
Maikel Kieftenbeld (Birmingham City) wins a free kick in the defensive half.
Substitution, Birmingham City. Paul Robinson replaces Diego Fabbrini.
Jordan Rhodes (Middlesbrough) wins a free kick in the defensive half.
Foul by Maikel Kieftenbeld (Birmingham City).
Attempt blocked. Albert Adomah (Middlesbrough) left footed shot from outside the box is blocked.
Albert Adomah (Middlesbrough) wins a free kick on the right wing.
Foul by Jonathan Grounds (Birmingham City).
Ritchie de Laet (Middlesbrough) wins a free kick in the defensive half.
Foul by Clayton Donaldson (Birmingham City).
Attempt missed. Diego Fabbrini (Birmingham City) header from very close range is too high. Assisted by David Cotterill with a cross.
Offside, Middlesbrough. Jordan Rhodes tries a through ball, but Daniel Ayala is caught offside.
Albert Adomah (Middlesbrough) wins a free kick on the right wing.
Foul by David Davis (Birmingham City).
Goal! Birmingham City 2, Middlesbrough 2. David Davis (Birmingham City) right footed shot from the centre of the box to the bottom right corner.
Attempt missed. Jonathan Grounds (Birmingham City) header from the centre of the box is too high. Assisted by David Cotterill with a cross following a corner.
Corner, Birmingham City. Conceded by Adam Clayton.
Attempt blocked. David Cotterill (Birmingham City) right footed shot from outside the box is blocked.
Attempt blocked. Diego Fabbrini (Birmingham City) right footed shot from outside the box is blocked. Assisted by David Cotterill.