Veteran Carles Puyol powered home the winner against Germany to send Spain into their first World Cup final.
The 32-year-old headed past Manuel Neuer in the second half to ensure a repeat score-line from two years ago when the two teams met in the final of the European Championships.
It was a victory for Spain’s passing game, while Germany could not strike on the counter-attack like they did against England and Argentina in previous rounds.
Vicente Del Bosque made a huge decision before kick-off to drop Fernando Torres, who scored the winner in Vienna for the Euro 2008 finale, but has looked short of fitness during this tournament as he returns from a knee injury.
Pedro was drafted in and created the first chance, in the sixth minute, with a pass behind the Germany defence that David Villa collected, only for Neuer to bravely block.
Spain patiently passed their way around Germany looking to create chances. Centre-back Puyol was the next to go close, heading over from Andres Iniesta’s driven cross following a short corner.
Sergio Ramos and Xabi Alonso had long-range efforts go wide before Germany eased themselves into the game, looking to pounce and catch the Spaniards off guard.
Piotr Trochowski, replacing the suspended Thomas Muller, had his first effort with a low drive that required Iker Casillas to turn around his near post.
Joachim Loew’s side also had a big penalty shout turned down by referee Viktor Kassai when Mesut Oezil was challenged and looked to have been tripped by Ramos, who demanded a yellow card for diving.
Spain got closer after the break, with Alonso going wide twice. The first came after Pedro carried the ball from his own half with a mazy run before pulling back, while the second was from Xavi’s lay-off. Villa also went wide of the post from the edge of the area, then Pedro had a drive saved before Iniesta flashed across the face of the goal.
Germany looked more threatening when Toni Kroos came off the bench for Trochowski, and had a shot saved after meeting Lukas Podolski’s cross – but then came Puyol’s moment.
The goal came 18 minutes from the end, with Xavi sending over a corner and Puyol launching himself at the ball and sending his powerful header past Neuer.
The narrow win sees Spain through their first ever World Cup final against the Netherlands on July 11, with both teams looking to become the eighth nations to lift the hallowed trophy.
Germany (4-5-1): Neuer; Lahm, Mertesacker, Friedrich, Boateng (Jansen 52); Trochowski (Kroos 62), Schweinsteiger, Ozil, Khedira (Gomez 82), Podolski; Klose.
Subs (not used): Wiese, Aogo, Tasci, Kiessling, Badstuber, Cacau, Marin, Butt.
Spain (4-5-1): Casillas; Ramos, Puyol, Pique, Capdevila; Pedro (Silva 85), Xavi, Alonso (Marchena 93), Busquets, Iniesta; Villa (Torres 81)
Subs (not used): Valdes, Albiol, Fabregas, Mata, Arbeloa, Llorente, Javi Martinez, Jesus Navas, Reina.