The score had been knotted at 2-2 since the sixth inning until the D-backs finally broke through in the 16th against Kris Johnson (0-1), who went six innings in his major league debut.
That brought up Eaton (4-for-7), who lofted a pitch into short center field, where Pittsburgh's Andrew McCucthen made a diving try but came up just short as the ball bounced away for a two-run double.
Brad Ziegler (7-1) pitched two innings to earn the victory and J.J. Putz overcame two walks in the bottom of the 16th for his sixth save as the D-backs won 2-of-3 from the Bucs in their longest game of the year.
Aaron Hill also collected four hits for Arizona.
Jordy Mercer went 3-for-5 with an RBI for the National League Central-leading Pirates, whose advantage over second-place St. Louis shrank to one game.