The world champion's first victory of the year was founded on a stupendous performance in wet qualifying, in which he took pole by more than 1.2 seconds.
Hamilton led from pole position, headed only at the pit-stops, as team-mate Valtteri Bottas overtook Red Bull's Max Verstappen late on for second.
The Ferraris retired early after colliding with each other on lap one.
It was another dark day for the Italian team, after an uncompetitive showing in qualifying, as Charles Leclerc apologised for a rash move on the first lap that took out both cars.
Another anti-racism protest
Hamilton led the majority of drivers in taking the knee ahead of the race - and then raised his fist in a black-power salute twice after the race, as he stood on the front of his car with his helmet still on, and again on the podium.
The drivers' pre-race anti-racism protest was not as well co-ordinated as it had been at the same track for the season-opening Austrian Grand Prix last weekend, but the message was clear.
A handful of drivers were not present for the moment ahead of the playing of the Styrian regional anthem, but all who were wore "end racism" T-shirts other than Hamilton's, whose said "Black Lives Matter".
Of those who were there, only Charles Leclerc, Verstappen, Kimi Raikkonen and Daniil Kvyat chose not to kneel.
No problems for Hamilton on track
Hamilton, who has pledged to continue the fight against racism this year in parallel with his quest for a record-equalling seventh world title, was in total control of the race from the start.
He converted his pole position into a lead at the first corner, survived an early safety car period following a collision between the two Ferrari drivers, and never looked back.
The fight was all behind him, as Mercedes sought to get Bottas ahead of Verstappen.
The Finn had qualified fourth in the rain, 1.4secs slower than Hamilton, passed McLaren's Carlos Sainz by lap six, but was not able to make much progress towards the Red Bull.
When Red Bull made Verstappen's pit stop for fresh tyres on lap 24, Hamilton was brought in three laps later, while Bottas was left out 10 laps longer than the Dutchman.
The aim was to give him a tyre off-set and greater pace at the end of the race.
And it worked. Bottas crept up on Verstappen and was with him with five laps to go.
Bottas looked to have the move down on the straight towards Turn Four on lap 66, but Verstappen fought back around the outside of the corner and held on to the place.
But his valiant defence lasted only another lap before Bottas was able to storm past to complete a Mercedes one-two.
He retains the championship lead over Hamilton, but it is now down to eight points.
Calamity for Ferrari
Ferrari had worked flat out to bring upgrades to their car ahead of this race, after showing a dismal pace the week before.
But they did not have the effect they had hoped and the cars could qualify only 10th and 11th. Leclerc started a further three places back after a three-place grid penalty for blocking in qualifying.
But things got much worse in the race. Leclerc made an over-ambitious move up the inside of Turn Three on the first lap as Vettel was hemmed in on the outside and the two cars collided.
Vettel's rear wing was torn off and Leclerc suffered floor damage and both had to retire.
Flying Racing Points
Sergio Perez in particular and Racing Point in general did not have a good day in the wet in qualifying, with the Mexican down in 17th on the grid, but the so-called 'Pink Mercedes' was soon making up ground.
The likes of McLaren and Renault said before the race that they were concerned about the Racing Point's pace, and their worries were well founded, with Renault launching a protest at the end of the race.
Perez picked off driver after driver in a car that has drawn criticisms because of its likeness to last year's Mercedes - which Racing Point admit they have copied - until he was up into the top six after the pit stops.
He passed Daniel Ricciardo's Renault on lap 48, with just over 20 to go, and set off after Alexander Albon.
Perez was soon with Albon, but while the Anglo-Thai had been having an unremarkable race in the second Red Bull, he picked up his pace and was able to hold Perez back.
The Mexican finally made a bid for the position with two laps to go but came to grief as he tried to pass at Turn Four in a mirror of the collision between Hamilton and Albon at the same point last week.
Perez was alongside Albon, on the inside, but the Red Bull driver tried to hang on around the outside of the turn and tagged Perez's front wing on the exit.
Perez limped around the remaining two laps, but was passed by McLaren's Lando Norris for fifth at the final two corners of the last lap.
Their scrap was part of a hectic midfield battle in the closing laps, as Norris took advantage of Perez's team-mate Lance Stroll racing with Renault's Daniel Ricciardo for seventh and McLaren's Carlos Sainz, who qualified a brilliant third, faded in the race to finish ninth.
Driver of the day
What happens next?
The races are coming thick and fast in this coronavirus-interrupted season, and another follows this coming weekend, the Hungarian Grand Prix.
What they said
Lewis Hamilton: "Firstly big thank you to my team. What a weird year but great to be back driving with this kind of performance. The team did a fantastic job, it was just for me to bring it home. I tried to get fastest lap but not going to get it with 40-lap-old mediums compared to someone with fresh tyres."
Valtteri Bottas: "It was a good battle with him [Max Verstappen]. I had a bit more pace at the end than him. Racing so close is always good fun. It could've been more satisfying and I could've been more satisfied but I'm looking forward to next week."
Max Verstappen: "I tried to push for victory but we are just a bit too slow. I pushed as hard as I could. I tried to make it difficult for Valtteri to pass me, even though I knew he was going to get me the next lap. It was fun because the rest of the race was a bit boring."