The world champion is now 50 points clear of Sebastian Vettel by taking his eighth and most controversial victory of the year here at the Sochi Autodrom.
Bottas, who had controlled the opening half of the race after retaining his lead from pole position, crossed the line in second ahead of Hamilton’s championship rival Vettel.
Hamilton now has the equivalent of two victories in his pocket with just five rounds remaining and 125 points left to play for.
The 33-year-old Briton made a rare mistake in qualifying on Saturday to allow Bottas to take pole, and the Finn made no mistake in holding off his team-mate and Ferrari’s Vettel on the opening-lap drag race to turn two.
Hamilton was slow out of his starting marks but managed to keep Vettel at bay despite the Ferrari driver drawing alongside his rival at 200 miles per hour.
After 12 laps Bottas was the first of the leaders to pit for new tyres with Vettel following him in a lap later, and Hamilton stopping at the end of lap 14. The Briton, however, emerged behind Vettel.
“How did that happen?” he asked over the radio as his team boss, Toto Wolff, punched the table in frustration while watching on from the Mercedes garage.
Within moments, Hamilton was crawling all over the back of Vettel’s gearbox with the Ferrari driver forced to defend aggressively on the main straight.
But just two bends later, Hamilton this time made the move stick by diving underneath Vettel at the right-handed fourth turn.
Bottas continued to lead only for the former Williams driver, who started this race 110 points behind Hamilton, to be denied his opening win of the year after he was ordered aside.
“You need to let Lewis by into turn 13 this lap,” Bottas’s race engineer, Tony Ross, said over the radio.
Bottas moved to the right and Hamilton remained on the racing line to assume the net lead. Mercedes chief strategist, James Vowles, was on Bottas’ radio to explain their decision.
“Valtteri, it is James,” he said. “We had a risk with Lewis against Vettel. He has a small blister (on his tyre). I had to do this to make sure we secured this.”
Max Verstappen, yet to stop for fresh tyres, was in the lead of the race.
The Red Bull driver had excelled in the opening phase, moving up nine places from his position of 19th on the grid in a little more than two laps.