Chasing 291 for victory, Sri Lanka were bowled out for 278 in 48.1 overs despite a fighting 37-ball 64 by Thisara Perera. Opener Kusal Perera top-scored with 80.
Zimbabwe batsmen Hamilton Masakadza and Sikandar Raza set up the win with half-centuries that took the team's total to 290-6 after being put into bat first.
Chatara, who returned impressive figures of 4-33 in 8.1 overs, ran through the Sri Lankan tail including the prized wicket of Thisara Perera.
Sri Lanka captain Angelo Mathews made 42 and Dinesh Chandimal added 34 runs to show some fight but Zimbabwe bowlers made regular breakthroughs to keep them in the contest.
Earlier, opener Masakadza gave Zimbabwe a solid start with his 73-run knock before middle-order batsman Raza added an unbeaten 81 off 67 balls –- his second successive ODI fifty.
Raza, who hit eight fours and a six during his innings, also took one wicket after opening the attack with his off-spin bowling for Zimbabwe. He was named man of the match.
Skipper and leg-spin bowler Graeme Cremer and paceman Kyle Jarvis took two wickets each to contribute to Zimbabwe's comeback win after losing the opener to Bangladesh.
It was Zimbabwe's fourth win over Sri Lanka in their last six matches. Sri Lanka now face hosts Bangladesh in the third ODI in Dhaka on Friday.