Villa's indifferent finishing cost them dearly as Birmingham were outplayed for the first hour.
But the Blues showed great character and bounced back to draw after trailing by two goals in the 100th derby.
Villa lost their way after Ronny Johnsen and Gareth Barry were substituted and in the last half-hour they tailed off badly.
Mikael Forssell and substitute Clinton Morrison tormented the Villa defence with fellow substitute Stern John grabbing the late equaliser.
Darius Vassell collected the rebound but his shot was well off target although skipper Olof Mellberg, only yards away from goal, failed to make any contact.
Birmingham found themselves under even more severe first-half pressure.
They were struggling in midfield where the hard-working Robbie Savage and Stephen Clemence were often caught out by the industry of Gareth Barry and Thomas Hitzlsperger.
Villa's domination eventually paid off in the 21st minute when a high cross from Solano deceived the Birmingham defence.
Barry calmly brought the ball under control and slipped a low pass into the path of Vassell to score past the wrong-footed Maik Taylor.
It was the England striker's seventh goal in ten games and he should have added to his tally a minute later following a smart pass from Juan Pablo Angel but shot meekly straight at Taylor.
Only a brilliant 33rd minute save by Taylor from a Vassell header prevented a second Villa goal before the break when Birmingham counted themselves extremely fortunate to be trailing by only one goal.
The relief was only short-lived as two minutes into the second half a thunderbolt shot from Hitzlsperger thundered into the back of Birmingham's net.
But in the gale-force conditions the game was far from over.
Birmingham made a double substitution with Morrison and Dunn replacing Christophe Dugarry and Stephen Clemence and this proved to be a crucial turning point.
Villa had previously been forced to replace Johnsen with Dion Dublin and these changes had a marked effect on the game.
Dublin in particular struggled badly and wilted under the pressure.
A straight pass from Savage to Morrison was pushed off to the ever-alert Forssell to reduce the arrears with his 12th goal of the season in the 60th minute.
Six minutes from time Angel missed a gilt-edged chance when put clear with only Taylor to beat only to guide his shot wide of the post.
It was a miss Villa were to rue as in the last minute a shot from Morrison was parried by Thomas Sorensen and the unmarked John at the far post tapped home an easy equaliser.
Villa: Sorensen, De la Cruz, Mellberg, Johnsen, Samuel, Hendrie, Solano, Hitzlsperger, Barry, Vassell, Angel. Subs: Dublin, Postma, Crouch, Whittingham, Luke Moore.
Blues: Maik Taylor, Tebily, Cunningham, Purse, Kenna, Johnson, Clemence, Savage, Hughes, Dugarry, Forssell. Subs: Bennett, John, Martin Taylor, Dunn, Morrison.
Referee: J Winter (Cleveland)