The four-time champion German drove his Ferrari with near flawless aplomb to convert his 54th pole position into a triumphant afternoon ahead of Finn Valtteri Bottas of Mercedes and determined Dutchman Max Verstappen, who was third for Red Bull.
Vettel's third victory this season lifted him to 121 points ahead of Hamilton on 120 after seven races, ending the defending four-time champion's hopes of a record-equalling seventh win at the Circuit Gilles Villeneuve where he won from pole for the last three years.
Australian Daniel Ricciardo, who clocked the fastest lap at the end, managed to resist a late charge from Hamilton in the closing laps and retain fourth place ahead of the Englishman who extended his record points-scoring run to 32 races. Finn Kimi Raikkonen finished sixth in the second Ferrari.
"Perfect is a good way to describe this," said a delighted Vettel.
"I said yesterday that this place means a lot to Ferrari and to have a race like this is unbelievable.
"After a long stretch here without a Ferrari win, I looked around and the people are so very happy. It means a lot. There's a long way to go in the season so I am not bothered about the title now, but it's a good side affect for me." He said the win was special because it came 40 years after Canadian Gilles Villeneuve had won his first race for Ferrari.
- Hartley run off the road - ============================
The race began in near-perfect conditions with an air temperature of 20 degrees Celsius and the track at 45 as the lights went out.
Vettel, from his fourth Canadian pole, made a clean start while behind him Bottas had to scrap to resist a robust attack from Verstappen.
Hamilton stayed fourth ahead of Ricciardo who made quick work of passing Raikkonen before, after only half a lap, a heavy collision between Brendon Hartley's Toro Rosso and local hero Lance Stroll's Williams.
The New Zealander appeared to be squeezed into the barriers as Stroll, with a puncture, moved sideways ahead of him at Turn Five and the Toro Rosso was lifted off the ground before both flew off the track.
Both men were unhurt. "He just ran me out of road," said the luckless Hartley.
Hamilton's early pit-stop on an enforced two-stop strategy, due to an engine heating problem, had done him no favours, but when Raikkonen pitted after 33 laps the Englishman was able to hang on and regain fifth as the Ferrari rejoined.
This left Vettel and Bottas out in front, 24 seconds ahead of Verstappen, but still running on their original ultra-softs. Bottas was first to blink on lap 37, Vettel following one lap later, both going to super-softs.
All this left Vettel in command after 40 laps, 5.7 seconds clear of Bottas with Verstappen third ahead of Ricciardo, Hamilton and Raikkonen.
After 42 laps, sadly, Fernando Alonso's 300th Grand Prix weekend came to an end when, chasing 10th, he was called in to pit and retire. "No power, no gears," said the Spaniard.
With 20 laps remaining, Hamilton began to find a rhythm to move within a second of Ricciardo while Bottas, at the front, trimmed Vettel's lead to 3.8 seconds.
A grandstand finish looked possible until Bottas ran off at Turn One and took to the grass before recovering. He had lost two seconds and Vettel, turning the screw, responded with a fastest lap before cruising to a crushing victory.