Daniel Ricciardo completed the podium for Renault ahead of Racing Point's Sergio Perez after a late safety car spoiled what looked like being a close run battle between the pair over the final laps.
At the start, Hamilton made the better getaway and pulled alongside his teammate approaching the first corner.
The two Black Arrows both went deep into the right-hander, going wide into the runoff on the exit as Bottas hung on around the outside, which gave him the inside line into the Turn 2 left and he was able to muscle back into the lead.
The Finn shot clear of Hamilton around the rest of the opening tour, making sure he was immediately out of DRS range, extending his lead gradually over the next few laps.
But Bottas's lead never exceeded two seconds as he, Hamilton and Verstappen quickly moved clear of Charles Leclerc's Ferrari, which was holding up Ricciardo and Alex Albon in the other Red Bull.
The three leaders were the only drivers able to lap in the 1m32s during the early laps on the softs, with Leclerc nearly 20s off the lead by the time Ricciardo passed him around the outside of Turn 2 on lap nine of 60.
By this stage Hamilton had begun to erode Bottas's advantage, and just after the Briton had gained 0.3s on lap 12, the leader locked up heavily at the start of the next tour and went deep at Turn 1.
Hamilton immediately stole to the outside of Turn 1 and took first place, with Verstappen quickly over the rear of Bottas, who pitted at the end of lap 13 to replace his ruined softs with mediums.
This proved to be even more costly for Bottas a few laps later, when the virtual safety car was called as George Russell pulled off to retire his damaged car, sustained when Kimi Raikkonen tipped to Williams onto its left-hand wheels when he lost the rear of his Alfa Romeo following Sebastian Vettel closely in Turn 1, on the run to the hairpin.
The VSC meant Hamilton, who had pulled further clear of Verstappen with a strong of rapid laps in the 1m31s after taking the lead, and Verstappen were able to pit and gain significantly compared to Bottas.
Things then got worse for Bottas when he dropped behind Lando Norris and Sergio Perez, who were yet to stop having been running behind Ricciardo before the Renault driver pitted under the VSC, reporting a loss of power.
The issue got worse over the next lap despite Mercedes issuing a string of reset instructions and he was forced come in at the end of lap and retire with a suspected MGU-H problem.
Verstappen had gained two seconds over Hamilton as Red Bull gained with a faster pitstop, and he briefly got under two seconds behind the Mercedes as they both lapped in the early 1m30s, but the world champion was quickly able to re-establish a clear lead.
As Hamilton gradually extended his advantage over the middle phase of the race, taking it over 10s for the first time at the end of lap 42, the attention turned to the fight for third.
Ricciardo's VSC stop meant he would have to go long to the finish on a one-stopper, with his rival for the final rostrum spot becoming Perez when Norris became hobbled with a power problem that McLaren seemingly could not rectify with a stream of settings change instructions.
Perez, who ran long in the first stint to lap 30 on his softs, then caught Leclerc, who had pitted after being passed by Ricciardo early-on, and it was the Mexican's turn to lose time behind the Ferrari.
When he did get into the chicane on lap 35 he was 17.5s behind the Renault, and quickly set about eating into its advantage.
Perez closed four seconds over the next five laps, but the race was then interrupted again approaching the race's final quarter when Norris pulled off the track at Turn 6, with his right-rear bodywork smoking, and the safety car was called out.
Mercedes, Red Bull and Renault pulled the top three in as soon as they could, with Racing Point initially leaving Perez out on his mediums before he too came in and switched to the softs, which the leaders had also taken.
The safety car stayed out until lap 50, with Hamilton and Verstappen complaining about its speed as they fought to keep heat in their tyres on another cold day in the Eifel mountains.
When it did come in, Hamilton had dropped Verstappen at the final chicane, with the Dutchman actually attacked by Ricciardo into Turn 1, which he was able to rebuff.
The two leaders alone were able to shoot into the 1m28s – with Hamilton setting a strong of fastest laps to again build up his lead – as Ricciardo, after briefly coming under pressure from Perez following his failed look to take second, gradually eased clear of Perez.
The top positions therefore remained stable over the final few laps as Hamilton ran clear to take his record-equalling victory by 4.4s, as Verstappen set the fastest lap on the final tour.
Ricciardo came home to take his first podium since winning the 2018 Monaco GP with a 1.4s advantage over Perez.
Carlos Sainz finished fifth for McLaren ahead of Pierre Gasly, who passed Leclerc after the safety car as the Ferrari driver had run behind the top five due to not stopping during the final race suspension.
Nico Hulkenberg rose from last to finish eighth in place of the unwell Lance Stroll – his cause aided by the safety car, which also helped Romain Grosjean take his first points of 2020 as he finished ninth on a one-stopper, holding off Antonio Giovinazzi, who had stopped just before the safety car.
Sebastian Vettel 11th after spinning while trying to pass Giovinazzi in the early stages, and then having a clash with Kevin Magnussen in the final laps (with the Haas driver finishing 13th behind Raikkonen, who was given a 10s penalty for causing the Russell crash, but nevertheless claimed the record for most F1 starts from Rubens Barrichello by taking the start).
Albon and Esteban Ocon were the other non-finishers as they stopped with suspected power unit and hydraulics problems respectively in the pits, with the Red Bull driver having picked up a five-second penalty for taking Daniil Kvyat's front wing off as he swept across going into the final corner during the early running.
Kvyat finished 15th behind Nicholas Latifi.
|2||Max Verstappen||Red Bull||Honda||4.470|
|4||Sergio Perez||Racing Point||Mercedes||16.070|
|5||Carlos Sainz Jr.||McLaren||Renault||21.905|
|8||Nico Hulkenberg||Racing Point||Mercedes||32.596|
|10||Antonio Giovinazzi||Alfa Romeo||Ferrari||40.035|
|12||Kimi Raikkonen||Alfa Romeo||Ferrari||41.476|
|Alex Albon||Red Bull||Honda|
|View full results|