The Brit’s tyres completely gave way on the final lap at Silverstone, and he just about nursed the car home in a heart-stopping finale.
Bottas got off the line better than Hamilton and threatened to take the lead, but the Brit held off his attempt into turn one.
And that seemed to be as close as anyone came all day to denying Hamilton a remarkable seventh win at Silverstone – two more than Jim Clark and Alain Prost.
But then tyre drama struck both Mercedes drivers in the final few laps.
Bottas looked to be cruising to second place before a puncture just three laps from home ruined his afternoon.
Max Verstappen pounced to take second place while Charles Leclerc was third in his Ferrari.
Bottas dropped all the way to 12th place after his puncture just two laps from home in a nightmare finish.
And Hamilton’s tyres gave way, too, on the final lap, but he just had enough of an advantage to hold off Verstappen and win his third race in a row.
Daniel Ricciardo came home fourth in his Renault ahead of McLaren’s Lando Norris and Esteban Ocon in 6th.
There was heartbreak before the race for late replacement Nico Hulkenburg when his car failed to start.
The German was drafted in at the last minute by Racing Point after Sergio Perez tested positive for Covid-19.
But he failed to start the race and ended up becoming one of few spectators watching the action when there would normally be more than 100,000 fans in attendance.