Match ends, Birmingham City 2, Middlesbrough 2.
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.
Relive Middlesbrough's 2-2 draw at Birmingham as it happened
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.
Remarkable Rhodes
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."
Line-ups
Birmingham
Formation 4-2-3-1
- 1Legzdins
- 31CaddisSubstituted forSpectorat 90'minutes
- 28Morrison
- 32Shotton
- 3Grounds
- 8Gleeson
- 6Kieftenbeld
- 11Cotterill
- 7FabbriniSubstituted forRobinsonat 79'minutes
- 26DavisSubstituted forSolomon-Otaborat 86'minutes
- 9Donaldson
Substitutes
- 4Robinson
- 15Vaughan
- 17Solomon-Otabor
- 23Spector
- 25Lafferty
- 27Trueman
- 30Buckley
Middlesbrough
Formation 4-2-3-1
- 1Konstantopoulos
- 24Nsue
- 4Ayala
- 6Gibson
- 5de Laet
- 8Clayton
- 7Leadbitter
- 27Adomah
- 21Ramírez
- 19DowningSubstituted forStuaniat 85'minutes
- 9RhodesSubstituted forNugentat 87'minutes
Substitutes
- 16de Sart
- 17Husband
- 18Stuani
- 25Agazzi
- 26Kalas
- 34Forshaw
- 35Nugent
- Referee:
- Simon Hooper
- Attendance:
- 21,380
Match Stats
- Possession
- Home39%
- Away61%
- Shots
- Home16
- Away16
- Shots on Target
- Home7
- Away7
- Corners
- Home4
- Away2
- Fouls
- Home13
- Away14
Live Text
Post update
Full Time
Second Half ends, Birmingham City 2, Middlesbrough 2.
Post update
Attempt blocked. Maikel Kieftenbeld (Birmingham City) left footed shot from the centre of the box is blocked.
Post update
Foul by David Nugent (Middlesbrough).
Post update
Jonathan Spector (Birmingham City) wins a free kick in the defensive half.
Post update
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.
Post update
Nsue (Middlesbrough) wins a free kick on the right wing.
Post update
Foul by Viv Solomon-Otabor (Birmingham City).
Substitution
Substitution, Birmingham City. Jonathan Spector replaces Paul Caddis.
Post update
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
Substitution, Middlesbrough. David Nugent replaces Jordan Rhodes.
Post update
Corner, Middlesbrough. Conceded by Adam Legzdins.
Post update
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
Substitution, Birmingham City. Viv Solomon-Otabor replaces David Davis.
Substitution
Substitution, Middlesbrough. Cristhian Stuani replaces Stewart Downing.
Post update
Corner, Birmingham City. Conceded by Daniel Ayala.
Post update
Attempt missed. David Cotterill (Birmingham City) right footed shot from outside the box is close, but misses to the left. Assisted by Clayton Donaldson.
Post update
Attempt saved. Paul Robinson (Birmingham City) header from the centre of the box is saved in the bottom right corner. Assisted by Jonathan Grounds.
Post update
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.
Post update
Foul by Ritchie de Laet (Middlesbrough).