It was not until Lewis Holtby, who is joining Tottenham Hotspur at the end of the season, restored a two-goal cushion two minutes from time that Schalke wrapped up the three points.
"It was a real spectacle for the fans, they had fun but for me as a coach it was not that comfortable," said Schalke coach Jens Keller, relieved to have made a winning Bundesliga debut on the Schalke bench after taking over in mid-December, just before the break.
"I thought we had wrapped it up after our 2-0 lead. This game was difficult on the nerves," Keller told reporters.
The Champions League side started strongly with Marco Hoger and Julian Draxler missing good chances in the opening minutes.
Schalke, without suspended Klaas-Jan Huntelaar and Jermaine Jones and a string of injuries, looked to be running out of ideas before Jefferson Farfan scored after a Christian Fuchs long throw was headed into the Peruvian's path in the 44th minute.
Teenager Draxler drilled in a second goal for the hosts five minutes after the restart.
Hannover launched a comeback when Sergio Pinto's 18-metre shot took a wicked deflection off Schalke's Roman Neustadter in the 55th and Hungarian Szabolcs Huszti silenced the home crowd with a low left-foot drive four minutes later.
The revival did not last long, however, with Hoger firing Schalke back in front after 64 minutes and Ciprian Marica curling a shot past keeper Ron-Robert Zieler in the 67th.
Hannover struck back instantly with Huszti volleying in his second goal before midfielder Holtby tapped home to settle Schalke's nerves in the 88th.
Hannover striker Mame Diouf's spectacular bicycle kick on the final whistle was the goal of the game but came too late.
Schalke, who now have 28 points, were desperate for a winning start, having picked up just two points from their last six games.
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.