The Proteas had come up well short against hosts England in Thursday's opener and a failure to ever really get to grips with the Bangladesh batsmen, playing their first match, cost them here.
Bangladesh's ODI record and the biggest total of the tournament so far - 330-6 - saw Shakib Al Hasan (75) and Mushfiqur Rahim (78) combine for a 142-run third-wicket stand that gave South Africa a mountain to climb.
An opening partnership of 60 was belatedly broken by Andile Phehlukwayo with his second ball to Tamim Iqbal (16), yet there was no slowing the Tigers.
Soumya Sarkar went for 42, but then came the big partnership as Bangladesh scored freely without taking too many risks until Imran Tahir (2-57) finally got Shakib attempting to sweep.
Although Mohammad Mithun (21) and Mushfiqur followed in quick succession, the Proteas failed to find any sort of momentum and Mahmudullah ended unbeaten on 46 from just 33 balls.
BANGLADESH WIN BY 21 RUNS!
— Cricket World Cup (@cricketworldcup) June 2, 2019
South Africa's reply started steadily but a mix-up left Quinton de Kock (23) stranded for a run out and then Shakib stepped up to halt Aiden Markram on 45.
Faf du Plessis was on a dangerous 62 when Mehidy Hasan spun past him and Bangladesh continued to intervene each time the Proteas, chasing a tough required run rate, built up a head of steam, failing to suitably prey on occasionally sloppy fielding.
The departure of David Miller (38), who edged to Mehidy, was timely and Rassie van der Dussen (41) soon went, too. JP Duminy fired 45, but Bangladesh cruised to the finish as the Proteas ended on 309-8.
What does it mean? Proteas in deep trouble
There was no shame in South Africa losing a gripping opener to tournament hosts and favourites England, but a response was still required here and it did not arrive.
The world's third-ranked side should expect to beat Bangladesh, yet their bowling attack faltered at key moments and the urgency in a reply that saw each batsman chip in without converting those starts to a match-winning innings came too late to save this match - and, perhaps, for this World Cup.
Shakib sparkles on milestone day
It was not just in Bangladesh's innings that Shakib had an impact.
With Markram and Du Plessis nicely paired on 53, the second-wicket stand was ended as Shakib (1-50) zipped through the former into the middle stump. This was his 250th ODI wicket and ensured the Tigers remained in control. Batting partner Mushfiqur had earlier weighed in with a direct hit for the breakthrough wicket.
Not good from Ngidi
Lungi Ngidi bowled four of the first seven overs of the match and, unfortunately, that spell set the tone for a tough innings for South Africa's attack as he was hit for seven boundaries.
After giving away 34 runs, a hamstring injury then meant Ngidi did not bowl again. His patience had paid off with some big wickets in the opener against England, but it was not to be this time.
Photo Getty Images. Caption: Shakib Al Hasan and Mushfiqur Rahim celebrate