Postgres FM

Nikolay and Michael discuss Postgres minor releases — how the schedule works, options for upgrading to them, and the importance of reading the release notes.
 
Here are some links to things they mentioned:

~~~

What did you like or not like? What should we discuss next time? Let us know via a YouTube comment, on social media, or by commenting on our Google doc!

~~~

Postgres FM is brought to you by:
With special thanks to:

Creators & Guests

Host
Michael Christofides
Founder of pgMustard
Host
Nikolay Samokhvalov
Founder of Postgres AI

What is Postgres FM?

A weekly podcast about all things PostgreSQL

Michael: Hello and welcome to Postgres
FM, a weekly show about

all things PostgreSQL.

I am Michael, founder of pgMustard,
and this is my co-host Nikolay,

founder of Postgres.AI.

Hey Nikolay, what are we talking
about today?

Nikolay: Hi Michael, about upgrades
again, but it will be some

small talk.

Just minor upgrades, easy, right?

Michael: Yeah, minor episode about
minor upgrades.

Nikolay: Yeah, replace binaries,
restart, bye-bye.

That's it.

Episode done.

This is what the documentation
says, right?

Replace binaries, restart.

Easy peasy.

Michael: Yeah, so, well, this was
my choice, and I wanted to

pick it for a few reasons.

1 is that we just had new minor
releases announced a few days

ago as of recording, about a week
ago as of the time this will

go out.

Nikolay: Planned one, right?

Every 2 months.

Yes, yes, yes.

Not like urgent.

Michael: Yes, exactly.

So I thought it was a good time
to bring it up.

I thought there were a couple of
interesting things in it.

But also it was a good reminder
to me that we hadn't talked about

in a while.

I did look back and the last time
we spoke about upgrades, it

was also my idea.

And it was the time where I was
suggesting boring topic after

boring topic.

So thank you for not, Thank you
for stopping having a go at me

when I bring up boring topics.

Partly because I see a lot of people,
especially when they use

managed service providers, on really
quite old versions.

I don't mind so much if it's an
old major version.

I can see there's reasons.

I encourage them to upgrade, but
I do understand that there's

reasons.

But when they're on a supported
major version and lagging really

far behind on minor versions, it's
difficult to justify.

Nikolay: The guys on version 14.3,
for example, which was a bad

one.

Do you remember?

Michael: Yeah, yeah.

Nikolay: It was corruption.

Reindex concurrently corruption.

Michael: Last time we mentioned
a couple of things about the

schedule, but I didn't have the
details and I've looked it up

this time.

And I think that's a good reminder
that there's normally a schedule

for these minor releases.

I keep calling them minor versions,
but the docs don't call them

that.

They're called minor releases in
the documentation, which I found

interesting.

Major versions and minor releases.

Nikolay: And I think it's just
some inconsistency, small one.

Michael: Maybe.

It felt deliberate.

Like it felt very like, anyway,
as you said, this recent one last

week was a planned release and
they, in general, it says, unless

otherwise stated on the second
Thursday of February May August

and November

Nikolay: yeah I was wrong every
3 months not 2 there is a wiki

page where it's the table with
schedule when when my journey

this has become end of life.

And also this policy for planned
releases, but sometimes unplanned

releases happen as well.

I also saw somewhere statistics.

Ah, it was on the WhyUpgrade, WhyUpgradeDepth.com,
we should mention

it a few times in this episode
because it's a super convenient

tool to see differences in better
form.

You can find everything in the
release notes or just selecting

some things in the system catalogs,
but it's much easier just

to go to whyupgrade.depth.com and
then just see the differences

choosing between a couple of minor
versions or also major versions,

it's also supported.

So yeah, long list and security
related stuff is highlighted.

So there I saw that how many changes
happened in each major version

and how many minor releases happened.

And can you imagine, in 7.4, more
than 30 minor releases happened.

It was 7.4.30.

Oh wow.

Yeah, it was popular, popular major
version, I guess.

Michael: So what would expected
be about 20, 5 years with 4 updates

per year, maybe 19 or 20?

Nikolay: 94, 96, I think they were
like 25, maybe 24 releases,

but now it's shorter, like 20 maybe.

I don't remember details, like
right now.

Yeah, yeah.

So there are many minor versions.

And sometimes we saw it happened,
like minor version planned

released and then in a week or
2, new version released because

some problem just identified.

So minor version can bring not
only fixes but problems, because

it's a regular thing in software
development.

Despite all the measures to control
the quality and regression

tests and performance testing,
everything, It still happens.

So downgrades or fix it forward,
like, let's wait until the next

minor release.

It happens still.

Michael: I was going to say, though,
I think it's been happening

a lot less recently so I think
yeah only the only 1 I remember

this is why I brought up the schedule
is because you mentioned

14.3 and it was 14.4 was the last
unscheduled I actually don't

know if they've got a name for
it.

I guess it is just a minor release.

But it was not on the schedule
we mentioned.

It came out in June.

So a month after, about a month
after the...

Nikolay: I think there are more.

I don't remember, actually.

Michael: More recent ones?

Nikolay: Maybe.

I don't remember.
I don't remember.

But let's discuss the process.

And from there, probably we will
return to difficulties, right?

So, as I said, the documentation
says the process is super simple.

Replace binaries and restart.

But in cloud, probably you just
should provision new replica

and perform switchover, right?

Michael: Well, what do you mean
in cloud?

Do you mean using a managed provider
or do

Nikolay: you mean...

I mean when it's easy to take another
VM.

Like in general, right?

It can be your own cloud or something.

If it's easier for you to just
to bring a new VM than to deal

with dependencies and conflicts
of binaries, I don't know, like

some packages, you know you can
provision a new node, and when

you install from apt or rpm, apt
install, apt-get install, or

yum install, yum install, how to
pronounce, then you get always

the latest minor version.

You cannot specify a minor version,
we will discuss it later.

Interesting.
Right, right.

It's a big problem actually, but
we will touch it later.

So in this case, in a new node,
you will have already updated

Postgres.

It's a replica, a lag is close
to 0, a synchronous replica for

example, then you just perform
controlled switchover.

Controlled failover also known
as switchover, right?

In this case, all good, right?

Michael: Well, I do think that
process would work most releases,

but I do think there are other
parts that you shouldn't forget,

which are like, read the release
notes.

There might be other additional
steps you need to take in order

to...
No, No,

Nikolay: no, no, no, no, no.

I'm not forgetting anything here.

I'm just talking about the technical
process of upgrade.

Of course, not only you need to
read all the notes, you need

to properly test and almost nobody
does it properly because it's

a lot of work.

I mean, I'm sure clouds do this.

That's why they lag many months
usually.

They do a lot of testing.

That's why usually they're behind
official minor versions, sometimes

skipping some of them actually.

But I'm just talking about 2 big
approaches to upgrade.

Replace binary and restart as documentation
says.

By the way, does the documentation
already mention how to restart

faster?

Michael: It doesn't mention checkpoints.

Nikolay: Exactly.

It should.

It should mention it.

Michael: You did a great whole
episode on how to do it faster.

So I'll link that up in the show
notes for anybody who wasn't

a listener back then.

Nikolay: Yeah.

Super easy.

If you want to restart faster,
you need to remember about shutdown

checkpoint.

Shutdown checkpoint will take long
if you have max WAL size

and checkpoint amount tuned.

You should have it tuned.

We had another episode about it.

And the problem is that during
shutdown checkpoint, Postgres

doesn't accept new queries to execute
at all.

And that's a big problem.

Actually, it could be improved
in Postgres itself because it

could do 2 checkpoints.

Why not?

Like pre-shutdown checkpoint and
actual shutdown checkpoint,

which is super fast.

So our current recipe for all Postgres
versions to restart faster,

you perform an explicit shutdown checkpoint,
which is not blocking

anyone.

Queries are executed.

And then immediately after it's
done, you restart or you shut

down.

Restart consists of shutdown and
start, right?

In this case, shutdown checkpoint
has almost nothing to do, and

it's fast.

This saves a lot of time.

Michael: Yeah.

Last time you mentioned there was
some discussion in your team

as to whether even explicitly doing
2 checkpoints might make

sense because if the first 1, if
you've done, I don't know if

that discussion went anywhere if
you did some further testing

there.

Nikolay: So in total it becomes
already 3 checkpoints.

Michael: 3, yeah.

Nikolay: 2 explicit and 1 sort
of.

Yeah, anyway, you can speed this
restart a lot in a heavily loaded

system if you know this simple
trick.

And this simple trick, we code
it everywhere when we automate

some things, major upgrades, minor
upgrades, various things.

But the good thing, back to my
point that we have 2 approaches,

2 recipes.

1 recipe is this, replace binary
and restart.

And another recipe is what maybe
in other database worlds, not

Postgres, but maybe Oracle, for
example, or SQL Server, what

they call a rolling upgrade, right?

When you upgrade 1 replica, another
replica, and so on, and then

you perform switch over maybe multiple
times, I don't know.

The good thing is that current
Postgres versions and current

Patroni, I think since 2012, right?

Restart is not needed when you
promote.

Because before that, to reconfigure...

Remember recovery.conf was in a
separate file and not in PostgreSQL.conf.

And to reconfigure primary coninfo
or restore command, you needed

to perform restart of your replicas.

So if primary changes, it means
all replicas needed to be restarted.

But right now, no more.

Everything is good.

Promotion can be done.

And promotion and reconfiguration
of your primary on all replicas

can be done without restart and
Patroni does it.

So it means that it's faster and
since restart is not needed,

even no tricks with checkpoints,
right?

Michael: Yeah, I think this is
how some of the cloud providers

are doing it behind the scenes.

Yeah, yeah.

The managed services, yeah.

Nikolay: But good point.

Yeah, let's discuss some topics
here.

So you mentioned you need to check,
for sure you need to check

release notes, because it might
say, release notes might say,

you must re-index some types of
indexes, for example.

I don't know.

Michael: Well, even the let's look
at the latest 16.3, I looked

at the release notes and shout
out to Lucas Vittel, who did an

episode of his 5 minutes of Postgres
on this as well.

So, we'll link that up from last
week.

But he reported a security issue
in the appropriate way, very

well done.

And it got fixed in 16.3.

And you can only fix it, like,
so, there's detailed instructions

in the release notes on how to
go about fixing it.

Just applying the minor release
in the usual way, in either way

that you described actually, I
think, would not fix the...

Actually would the replica...

It depends how you did the replication
thing, I think.

If you spun up a new replica, I
think that might actually be

okay.

But if it was a replica you already
had on a minor version, did

the minor release upgrade there,
and then failed over to it,

you wouldn't get the fix for that
security issue.

Nikolay: Right.

So people in many cases don't do
it and it's bad.

Michael: Well, I think so, especially
on managed service.

Like imagine your managed services
doing it.

You've got, maybe you've scheduled
for some days.

Nikolay: Somebody already did it.

Michael: But maybe they are running
the SQL script.

Like the fix in this case is there's
SQL scripts.

Nikolay: After a situation with
major upgrades, with 1 of our

customers who was on some managed
service which was running on

Zalando operator, where major upgrade
is fully automated, and

they used it, After we saw corruption
related to JLibc version,

and we know Zalando, it was implemented
there, automation, but

it's not enabled by default.

It means that you need to just
specify a special parameter to

enable automation to mitigate GLIBC
version change when you perform

upgrade of your Spillo.

Spillo, this is part of Zalando
operator.

It's like an image ready to run
Postgres and Patroni in clouds,

in AWS, first of all.

So if you don't specify a parameter,
you get corruption of indexes.

And the fact that it was not enabled
by this managed Postgres

provider means that even they didn't
read release notes because

that was specified.

I knew about that automation.

I was curious why it didn't work
in this case.

And I immediately saw in the release
notes that there is such

parameter, and it's not enabled
by default.

So even managed Postgres providers
sometimes skip reading release

notes.

It's a big problem, but it's a
regular problem.

We buy things and we don't read
manuals, right?

We just try to use them right away.

Same things here.

It's like psychology.

So I don't know, of course, let's
be like these kind of guys,

like, always read manual, right?

Always read release notes.

Why upgrade?

Depeche.com is a very convenient
tool to read differences.

Michael: Well, and we have this
gift that the release notes are

good.

They include full details of, but
like when I say full details,

it's kind of an abridged version
of every issue that was fixed.

It's like 1 or 2 paragraphs.

It's very, very simple, very easy
to understand.

Even if you don't use the feature,
it's not that long.

It doesn't.

Yeah, I did.

I read the 16.3 ones quite quickly.

Maybe it took me 5, 10 minutes
just to scan, like to look through

them before the episode, just because
I wanted to see what had

changed.

In fact, there's a couple in there
that I think you'll like,

which is nice.

And yeah, it doesn't take ages.

They're easy to find.

And I think we've just been a little
bit, well, I get frustrated

when I use iOS, I use an Apple
phone, and every single app update

I get, if I look at the release
notes, it just says bug fixes

and performance improvements.

That's all I ever get.

And it's so annoying.

And we get so much more than that
in Postgres.

Anyway, it feels like such a gift
that they're giving us.

Nikolay: You know what I lack in
release notes?

Links to commits.

I always have many minutes spent
trying to link proper release

notes.

It's mostly related to major releases,
though, but minor ones

as well sometimes.

I try to find the exact commit,
commit fast entry and git commit,

just to understand what has changed.

And it would be great to have links
right in the release notes.

Some software has it in the release
notes.

They link commits and pull requests
and so on.

So the bottom line about release
notes is you should read them

even if you're on managed service,
managed Postgres.

You should read them because who
knows what your provider has

missed.

Maybe they were good a couple of
years ago, but then some good

guys were fired.

It happens today.

And this year, probably they are
not so good already.

So it happens.

And unfortunately, here I also
like, if managed service providers

could provide more transparency,
what they tested, how they tested,

blah, blah, blah.

Like, sometimes, like, maybe I
would read that instead, instead

of official release notes, like
results of testing, for example,

published or something.

It would be great.

But I know it takes sometimes a
few months for them to incorporate

release.

ALEX ENDOVSKY

Michael: I would love that.

Imagine getting an email from your
provider saying your scheduled

maintenance is, like, your database
is due to be upgraded at

your scheduled time of this.

Here's what we're doing.

We've already done the release.

Nikolay: Here are the results of
tests.

Details.

Michael: Yeah, that would be amazing.

And then all you have to do is
read the email, and you trust

them to get on with it.

Nikolay: I would read a few times,
but then I know the detail.

Like, I would be impressed, for
example, with the level of detail.

And next time, probably, I already
would rely on that.

But this process would be great.

But not only do you need to read
and perform actions, some versions

require you to do some actions,
like rebuild indexes, to mitigate

possible corruption you have.

Or something like security-wise.

Not only this, it happens in minor
versions as well.

But also you must test it.

2 more things, you must test it
and you should not forget about

extensions.

Michael: Great, so how do you recommend
testing?

Nikolay: Well, regular testing.

Testing means you should do the
same types of actions.

If you do this official recipe
with restart, replacing binaries,

restart, you should do it on some
lower environment, a few weeks

before production upgrade, maybe
a week, at least 1 week.

Michael: In a lot of the non-production
systems I've seen, they're

not under heavy load.

So, and they wouldn't be like long
running queries and things

that could

Nikolay: actually screw you up.

Honestly, I don't think we do need
load testing for minor releases.

It's super expensive to conduct,
usually.

You need separate environments,
separate machines, and a lot

of actions.

Ideally, I would skip it, maybe.

Unless you're a provider.

In this case, you have a lot of
databases, it's better to do

it.

But if I'm an organization with
just a single cluster or a few

clusters, dozens of clusters, then
I just would think about testing

it only if I see potential changes
can affect performance.

Maybe if you have good workflow
of testing, very good automation,

it's good to have.

But what to test?

Simple synthetic benchmarks, it's
already tested in these load

farms, performance farms, right?

It's already happening on various
types of operational systems

and so on.

So maybe it's not interesting.

You need to do it like a lot of
testing is a complex topic, but

at least to try to check that packaging
works as expected.

For example, preparing to this
episode, I just quickly asked

our bot to extract experience from
discussed in mailing lists

issues with minor upgrades.

And they both found some case for
Postgres 9.6.1 upgrading to 9.6.2

when Postgres could not start.

It was related to some problems
with some like corrupted pg_hba.conf.

Packaging put some placeholders
there.

Michael: Wait, which versions?

Nikolay: 9.6.1 to 9.6.2.

That's 6 years ago.

So not 6 even.

Michael: Probably 7 or 8, but it's
still not that long ago.

Nikolay: Yeah, it does matter,
but packaging is another layer

that can introduce some problems.

And you upgrade and something wrong
happens.

Postgres itself was well tested,
but apt-package, for example,

was not well tested.

And if you don't test it on your
environment and don't encounter

with problems of upgrading, it's
bad.

So you should do it.

And then you should run Postgres
for some time just to see that

it's working and all your code
is working and so on.

Michael: Well, and I think I probably
should have asked you about

extensions first because it feels
like testing is also about

testing your extensions and the
way extensions work, the core

aren't testing them, right?

And your combination of extensions
might be, even if you're mostly

using common extensions, you might
not even have any private

ones, or you might be using relatively
few, your combination

might not have been tested by anybody
yet.

The fact that you've got these
4 or 5 extensions.

So I do think...

Nikolay: Everyone is talking about
these problems with combination,

but I personally didn't see problems
with combination.

I know this is a quite popular
topic, but maybe I'm using too

few extensions usually, or seeing
them being used less than 10

or less than 20, for example.

I don't know.

What I know is, first of all, a
minor version of extension is

not changing unless you do it explicitly
with alter extension,

right?

Other session update to version
or something like that, right?

Or just update it to the latest
available version.

And I usually, what I do usually,
I check in our checkup tool,

checks PgStat available extensions.

It has currently installed version
and available version.

And if we see mismatch, it means
that update didn't happen.

And it happens all the time.

People don't upgrade them.

They skip it all the time.

And packages don't upgrade them.

But maybe it's good.

I don't know, actually.

The problem

Michael: is- Would you then schedule
them at the same time as

minor updates for Postgres?

Nikolay: Good question.

Maybe I would...

Yeah, we know this dilemma, right?

Like

Michael: If we

Nikolay: change 1 thing at a time,
overhead is huge.

It's like doing things in separate
transactions, transaction

overhead.

So you need to plan it, coordinate
it.

If you have some bureaucracy, and
you should have some bureaucracy,

like approvals, And then actual
planning and approvals, description

of what to do, how to roll back,
and so on.

And how to downgrade.

We will touch this very soon, I
promise.

But If you combine everything in
1 shot, something goes wrong

and you don't know what it is.

I don't know, maybe I would plan...

Usually, we plan it separately.

But maybe it's not perfect, Honestly.

Extensions usually lack love, I
would say.

DBAs don't go there usually.

Not usually, but DBAs like, oh,
we upgraded this, upgraded that,

good, done.

Extensions, oh, it's like back-end
engineers need them, right?

So unless it's like DBA kind of
extension like Page Inspector,

pg_buffercache or something,
which usually like, do we

need to upgrade them?

Even pg_stat_statements is lagging
sometimes.

And I tell you the story, I remember,
pg_stat_kcache was installed

on a very heavily loaded system
and it got upgraded silently.

It was RPM, it was CentOS I think,
and RPM was upgraded automatically

with various stuff, even non-DBA,
but some SREs, upgraded operational

system packages.

And we had exclusions for all Postgres
packages, but not PgStack.k

cache.
It was not in the block list.

And it got upgraded.

And then every server started crashing
with segfault and so on.

It was a bug introduced in PgStatK
cache.

Not well tested.

Not noticed in lower environments
because nobody tested properly

upgrades of operational system
components there.

It's like testing should be done
properly, but it requires a

lot of effort, coordination, and
so on.

Right?

So minor extensions might introduce
problems, even if you don't

explicitly use them, but they are
loaded in SharePilot libraries,

it still can be dangerous.

It can crash your server if there
is some bug.

I don't know, maybe it should be
in 1 shot, minor version plus

all related extensions, but contrib
modules, they have same cycle,

but third-party extensions like
PgStack and KCache, they have

their own cycle.

And
Michael: you need

Nikolay: to follow all of them
and check release notes of all

of them.

Honestly, I like the extensibility.

But I also like when everything
is monolithic and comes well-tested.

Michael: We can't have it both
ways, though, can we?

Especially if we see the progress
pgvector's been making so

rapidly because they can just release
multiple new features per

year.

It's hard to argue against that.

Nikolay: But cloud providers lag
a lot with upgrading.

It's a super hot topic, but look
at AWS.

They just upgraded the pgvector
to 0.7.0 only a few days ago.

But it was released...

I don't remember.

I saw some huge lags, months again.

Everyone needs it right now.

Things are moving so fast.

But I guess it's a lot of testing
and maybe adjustments and so

on.

And if you check Cloud SQL, They
lag even more, I think.

Michael: I think you might be thinking
of the wrong provider,

because I've always thought AWS
has been really hot on pgvector

updates, especially.

And also, I was going to give them
a shout out, because as a

big company, I'm a bit surprised
they're so able to ship minor

version.

I think they ship the these latest
minor version releases within

a day of the announcement.

Nikolay: 0.7.0 with small like?

Michael: Not pgVector, sorry, I
meant the Postgres QR.

Nikolay: Oh, this manner.

Michael: Like 16.3.

Yeah.

And well, there were only 2 providers
I saw that shipped it,

and I haven't seen any since so
quickly, and that was AWS and

Crunch Data.

Nikolay: That's cool.

Michael: Yeah, got the minor releases
out really quickly, which

sadly, as you say, isn't that common.

And I've been growing

Nikolay: more and more aware of

Michael: how much people lag.

Yeah, Cloud SQL are lagging, unfortunately.

Nikolay: It's last time I checked
and I checked a few times.

They don't lag a lot.

But what you see in documentation,
it's just a problem of documentation.

Michael: Got it.

Nikolay: So if you provision machine,
you see it's quite up to

date.

Michael: Yeah, I didn't provision
new ones on Cloud SQL, I did

just check their docs.

Nikolay: Yeah, there are some SLAs
in terms of version lag, and

they usually define and try to
follow.

Michael: I don't think Cloud SQL
even support version 16, though,

in PostgreSQL, do they?

Nikolay: Yeah, good point.

Probably not yet.

But major version is a different
story.

It can lag like half a year.

Michael: I know, I know.

Nikolay: Easily.

But it's already more than half
a year, right?

Michael: Quick question.

How do you feel about...

I had never thought about it this
way, but I think if I was picking

a new provider today, this is 1
of the things I would look at,

how much do they lag on minor version
updates.

Nikolay: Because it feels dangerous
If I need some bug to be

fixed soon and they tell me it
will take even not months, weeks,

it's frustrating.

Michael: So did you want to talk
about downgrades?

Nikolay: Downgrades is the topic
which you must have if you're

a serious organization, but in
Postgres it's not enterprise-ready

at all.

I mean, if you follow this approach
and official packages, the

official approach again is to replace
binary and restart.

But both apt and rpm packages support
only the latest minor version.

So how am I supposed to downgrade?

The answer is, it's not supported.

Michael: Or do you have to like
store them somewhere?

Like do you have to store them
on your side?

Nikolay: You can download packages
probably and deal with all

dependencies.

I always end up screwing myself
up completely and starting from

scratch.

And this is exactly where I like
having ability to provision

new VM.

If I can provision a new VM, we
have a different approach.

I upgrade a replica, I test it,
probably switch over, probably

keep 1 replica on the previous
version.

Michael: Just in case you need
to go back.

Nikolay: Yeah, and probably I can
do cloning and so on.

In managed services, I guess it's
easy to downgrade, right?

You can just choose the version
which you want.

Or no.

I'm not a big user of RDS and Cloud
SQL.

I usually have...

Like, minor upgrades, I never was
involved, honestly.

Because...

Michael: I think it's important
to be biological, but not through...

Nikolay: No, no, no.

It should be possible to downgrade,
no?

If we don't support downgrades,
Maybe it's not a problem, maybe

nobody needs it.

Postgres never requires you to
downgrade.

It's so well tested, right?

I've

Michael: never seen anyone downgrade
in my profession, though.

It's a good point.

Nikolay: Yeah, I don't know.

Let's provision some notes and
check.

I will have an answer in follow-up
comment probably.

So, yeah, but in my vision, downgrades
are needed.

Otherwise, you don't know what
to put in your plan.

In plan, usually, management requires
what if things go south?

And you should have the point.

This is our rollback plan or downgrade
or something.

Reverse plan, right?

And if downgrades are not supported,
but again, if you have multiple

machines, you can play with it
and include into the plan the

idea that you can move back to
the previous version just performing

switchover backwards, right?

Michael: Yeah, there is a nice
kind of quote from the docs that

I pulled out before the episode.

It says, I think in the versioning
policy, the community considers

performing minor upgrades to be
less risky than continuing to

run an old minor version.

We recommend that users always
run the current minor release

associated with their major version.

Nikolay: Right.

Michael: So, you know, it might
even answer the question of whether

they consider downgrading.

It's a very interesting point.

Nikolay: Yeah, well, this is a
good point.

We didn't discuss it.

But in general, you should upgrade
quite fast.

The lag of versions should be very
small, otherwise you skip

a lot of optimizations and bug
fixes.

Sometimes good optimizations happen
in minor versions as

Michael: well.

Really?

Nikolay: Yes.

Michael: I don't remember performance
optimizations.

Nikolay: Yeah, well, if something
was completely wrong, it's

considered a kind of bug, right?

In this case, it can be faster.

Sometimes things work not as expected,
like it was planned to

be fast, but it was not planned
fast because of some problem

in code.

This problem is fixed, it becomes
fast as expected.

This happens.

Michael: Oh, interesting.

Fair enough.

Nikolay: Cool.

This is it.

All right.

What else about minor upgrades?

Michael: I've only got one more thing,
which is kind of a fun one.

I found reading the release notes
like quite fun, like it was

quite it was one in particular that
made me smile, made me think

of you actually, I thought you'd
quite like it.

And that was a fix by David Rowley.

Let me not sure how to pronounce
Rowley Rowley.

Nikolay: You ask me?

Michael: Yeah, yeah.

One of the fixes he did in 16.3,
let me find it quickly, was, I

think I remember it actually, it
was a partitioning bug around

nulls.

So remember how much we talked
about feeling like nulls catch

us out still?

Well, it catches Postgres developers
out, too.

If you partitioned on a boolean
column, so like true, false or

null, and you have three partitions,
one that goes in when it's true,

one when it's false and one when it's
null.

And then you've queried where X
is not false.

It would the partition pruning
would the planner would prune

out the null partition, even though
it should be in there.

It's not false, but it was pruned
out so you'd get incorrect

results.
Nikolay: Because it's unknown.

Yeah, it's a three-value logic,
my favorite topic in SQL.

Michael: Yeah.

So I thought it would make you
feel less bad because it catches

even Postgres development itself.

Nikolay: Three-value logic should
be a central topic in all educational

courses when people study SQL.

My daughter, she studied SQL multiple
times at high school, currently

at university, And right now she
has yet another SQL course and

they don't cover 3-layer logic
at UCSD.

This is ridiculous.

Absolutely ridiculous.

Because this is the source of so
many troubles.

Yet another 1, my favorite, right?

We discussed it also, we had an
episode about nulls.

Michael: Yeah, I'll link that up
as well.

Nikolay: If you touch null, you
should expect unknown.

Unknown is not true at all, right?

And not false as well.

Right.

Michael: Last thing, We have episode
100 coming up.

I put a post on Reddit asking for
ideas on what we should do.

Nikolay: Yeah.

Michael: I will link it up in case
anybody wants to send us any

more ideas.

Anything you wanted to ask people,
Nikolai?

Nikolay: Yeah, if someone is running
Postgres 100 plus terabytes

under good load, at least dozens
of transactions per second.

Reach out to us, let's discuss
the complexities.

Maybe we will have you as a guest.

Yeah, by the way, I just checked
the Cloud SQL in RDS.

I didn't find, maybe it's there,
but I didn't find how to choose

minor version in Cloud SQL.

But in RDS, it's easy and they
already have all these minor versions

released last Thursday.

So

Michael: yeah, that's the day.

Nikolay: As you said, yeah, 16.3,
15.7.

And but I can choose 16.1, for
example.

Interesting that I cannot choose
14.3.

Michael: Good.

Oh, there's like a weird quirk.

I think AWS fixed the issue and
called it 14.3.

But that's like an old...

I remember something weird around
that.

But yeah, I'm not sure if that's
relevant.

Nikolay: They also had have revisions,
I guess, because it's

hyphen r1, r2 means like, I think,
revision 1, revision 2 for

the same minor version.

So internal versioning additionally.

Interesting.

Because it's not Postgres, right?

It's modified Postgres.

Michael: Yeah, yeah, true.

Things that they've added or changed.

Nikolay: Yeah.

Right, right.

Well, good.

So in general, it means that downgrades
are possible.

And if managed postgres are like
this, like RDS, you can have...

You already upgraded the whole
cluster, but then you understand

if anything goes wrong, you can
provision the replica on lower

version.
On a

Michael: different version.

Nikolay: Previous version, for
example, and switch over to it.

But if you cannot do it, you need
to keep all the old nodes,

un-upgraded nodes, and then be
ready to go back to them.

Also possible, but maybe requires
more resources to be spent.

You need to run them for some time.

So easy topic, right?

Simple.

Michael: Well, I'm glad we covered
it in a bit more detail.

Nikolay: Maybe this packaging minor
version problem, I know people

tried to solve it.

Someone from Percona, I remember,
tried to solve it.

So yeah, at least for containers,
Images should be possible to

specify.

Is it possible for so-called official
images to specify minor

version?

I'm going to check it.

I'm curious.

Can we specify 16.3 right now?

Docker run Postgres colon 16.3.

Docker run Postgres 16.2.

Let's try 16.2 first.

Let's see.

Unable to find image.

Yeah, it's pulling, so it's possible.

This is good.

We have different minor versions
there, so we can test at least

something on containers.

What about 16.3?

Michael: And downgrade.

Nikolay: Yeah, yeah, yeah.

16.3 also there.

16.4 is not available because it
doesn't exist yet.

So good.

Containers are good.

I already forgot.

I've used it multiple times.

I just forgot.

Michael: Oh, cool.

Nikolay: Good.

Michael: Okay.

Thanks so much, Nikolai.

Nikolay: Thank you, Michael.

See you next time.

Catch you
Michael: next week.

Nikolay: Bye.