MEPs meeting in Strasbourg, France, approved the pact with 408 votes in favor, 254 against and 33 abstentions, AFP said.
Approval by the parliament allows the provisional implementation of the CETA as early as next month.
EU states and Canada formally signed the deal in October after seven years of tough talks, overcoming last-minute resistance from a small Belgian region that blocked its national government from approving the accord.
Protests marked the vote, with about 700 people marching outside parliament to voice their opposition to the deal.
Anti-globalization activists dressed in surgical masks dramatically blocked entrance to the parliament building, before being dragged off by riot police.
"Saying yes to CETA is a trampling of the people," said a banner.
Following the approval by parliament, Canadian Prime Minister Justin Trudeau will address MEPs in person on Thursday.
EU leaders see the deal as a victory for an imperiled global trade system that is under threat from US President Donald Trump who opposes international trade deals.
Opponents to the accord, which is known as CETA, slam the deal as a danger to health, democracy and the rule of law.
"CETA is the best trade agreement the EU has ever concluded. It will bring Canada and Europe even closer together," said German MEP Manfred Weber, the head of the conservative EPP group, the parliament's biggest bloc.
As reported, Saeima passed the bill on the ratification of CETA in the first reading on February 9.