Lewis Hamilton’s championship rival Max Verstappen was a disappointing third for Red Bull, fourth tenths off the pace.
Hamilton was bidding to become the first Formula One driver to reach three figures, but his wait will go on for at least another week after Bottas spoilt the world champion’s centurion party.
Hamilton finished his first run behind his team-mate and ahead of his final attempt he ditched the softest rubber for the medium tyre.
But the Briton was unable to improve on his time and was forced to settle for second.
“It is a good feeling to be on pole,” said Bottas. “It feels like it has been a while.
“It has been a weak point for me in the first two races but being on pole puts me in a good position for tomorrow.”
Hamilton said: “It was a great job by Valtteri and for us as a team. We have to be happy with that.
“It was not the perfect lap but I gave it everything.”
Verstappen’s first effort at pole was deleted after he made a mistake at the left-handed fourth corner and exceeded track limits.
The Dutchman, who is a single point behind Hamilton in the standings, returned for one final attempt but never looked like challenging the black machines. He complained about traffic during his final run.
“I struggled a lot with the grip,” said Verstappen. “That first lap was decent but I had a big moment through turn four and went off the track.
“It is not ideal to be third but we will try and fight them tomorrow in the race.”
Elsewhere, George Russell qualified 11th, his best result for Williams. The young British driver continues to come of age and he finished just 0.057 sec shy of making it through to Q3. Just imagine what he might be able to do in a Mercedes.
Daniel Ricciardo has been outclassed by Norris since joining McLaren. At Imola, he was instructed by the team to move out of Norris’ way during the race and in Portugal he was knocked out in Q1.
The Australian was leapfrogged in the final moments and finished a poor 16th, more than one second slower than Norris in the sister car.
The radio airwaves turned blue when Ricciardo was informed his qualifying was over at the first hurdle.
Sebastian Vettel has not enjoyed the best start to life at Aston Martin, but the four-time world champion will take some comfort from making it into Q3 for the first time since last year’s British Grand Prix.
He will start 10th. Double world champion Fernando Alonso was only 13th for Alpine, seven places behind team-mate Esteban Ocon.