Hamilton led away from pole and remained unchallenged throughout the 70-lap race to cross the line 19.7 seconds clear of Mercedes teammate Valtteri Bottas.

Red Bull's Daniel Ricciardo completed the podium, with Vettel recovering to fourth place having dropped to last following contact at the start.

Max Verstappen made a lightening getaway from fifth, going around the outside of Vettel at the start to take second behind Hamilton.

But with Bottas simultaneously attacking Vettel on the inside, the latter found himself squeezed and damaged his front wing when he clipped Verstappen's left-rear.

The German continued but was later forced to pit when part of the wing broke off, dropping him to 18th and last.

The race had been neutralised on the opening lap, when the safety car was called into action following a collision between Carlos Sainz and Romain Grosjean.

Sainz appeared to move across on Grosjean, causing contact that pitched the former into a spin on the approach to Turn 3.

The out-of-control Toro Rosso collected an innocent Felipe Massa, with both being forced into retirement while Grosjean recovered to the pits for a new front wing.

Hamilton held off an attack from Verstappen at the safety car restart but that challenge ended when the Red Bull driver pulled off track at Turn 2.

Bottas inherited second, but did not have the pace to challenge his teammate in the first stint.

Both Mercedes chose a one-stop strategy, with the duo swapping the ultrasofts for the supersofts for the second stint.

Hamilton was able to control the pace at the front, gradually building a gap to his teammate to clinch his third win of the season and sixth in Canada.

He moved to within 13 points of championship leader Vettel with Mercedes achieving its first one-two of the season.

Ferrari decided to switch to a two-stop strategy, setting up a dramatic finish with Kimi Raikkonen and Vettel on fresh tyres.

Vettel passed Raikkonen when the latter went off at the chicane citing brake problems and then gave chase of the Force Indias.

Force India had asked Perez to move over for Ocon, who was running on a different strategy, but the Mexican asked the team to let them race.

It proved costly as Vettel dived down the inside of Ocon - who was baulked by Perez into the final chicane - into Turn 1, with the latter taking to the run-off.

Vettel pushed on after Perez, running off track briefly at Turns 8 and 9, and then making a pass stick at the final chicane for fourth.

Perez and Ocon finished fifth and sixth respectively, with Raikkonen nursing his Ferrari home in seventh.

Renault's Nico Hulkenberg finished eighth while Lance Stroll scored the first points of his F1 career with ninth in front of his home crowd.

Fernando Alonso was set to complete the top 10 and gift McLaren-Honda its first point of 2017 but he retired on the penultimate lap.

That moved Romain Grosjean into the final point-paying position.