Sevilla had been on the verge of victory leading 2-1 deep into added time, before Sergio Ramos equalised in the 93rd minute with the last kick of normal time, leaving the losers to taste a double dose of pain when Carvajal grabbed the late, late winner.
Marco Asensio had given Madrid the lead with a brilliant strike before Franco Vazquez equalised shortly before half-time.
Ramos had loked set to be the villain of the piece when he conceded a penalty that Yevhen Konoplyanka’s slickly converted in the 72nd-minute, which looked set to win it for Europa League champions Sevilla.
The Andalucians could have little to complain about over Carvajal’s winner, as he flew into the box and clipped the ball past two defenders and the ‘keeper with a lovely flick from the outside of his right boot.
“The goal came from trying and trying again. Dani Carvajal’s strike was spectacular, he deserves it more than anyone,” Madrid’s Lucas Vazquez said told UEFA after the game.
“Sergio Ramos is the first to never give up and he is always there in important moments. It is brilliant to have him. We have got a lot of depth and a side to take on all comers.”
Zinedine Zidane’s Madrid were not at full strength, with neither Cristiano Ronaldo nor Gareth Bale, nor Toni Kroos, involved and both Luka Modric and Karim Benzema coming off the bench in the second half at the Lerkendal Stadion.
“We were trailing for all of the second half, but Madrid never give up and a goal in 90 minutes allowed us to become champions,” Carvajal told UEFA after the game.
“Today we had a lot of players missing but we have a great squad of homegrown players.”
Having just sold Jese Rodriguez to Paris Saint-Germain, Madrid started with Alvaro Morata in attack, back at the club from Juventus.
The 20-year-old Spain international Asensio, back from loan at Espanyol, was also included from the off and he put Real ahead midway through the first half with a tremendous left-foot strike that swerved into the top-left corner from 25 yards.
However, Sevilla responded well and Daniel Carrico forced a good save from Casilla — standing in for Keylor Navas — before the equaliser arrived.
Vitolo controlled a Luciano Vietto cross, and while he could not get the shot away, Vazquez did, sticking out his left boot to volley low into the bottom-right corner. Argentine playmaker Vazquez was signed from Palermo during a close season of much change at Sevilla, who lost coach Unai Emery — the mastermind of their three consecutive Europa League triumphs — to PSG.
Grzegorz Krychowiak, Ever Banega and Kevin Gameiro have all moved on to PSG, Inter Milan and Atletico Madrid respectively, while captain Coke has signed for Schalke. Vazquez was one of three new faces to start for Sevilla, the others being Japanese international Hiroshi Kiyotake and Vietto, brought in from Atletico.
After an Isco effort was deflected narrowly wide early in the second half, Vietto made way for Konoplyanka and he scored from 12 yards to put Sevilla in front after Ramos had penalised for bringing down Vitolo in the box. That looked set to be the winner until Ramos appeared unmarked six yards out in the third minute of added time to head home a Lucas Vazquez cross with goalkeeper Sergio Rico, blocked by one of his team-mates, unable to get across to block.