Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Not the dump format. The actual data on disk of the database itself.

If you try upgrading even one major postgres version and you're not aware of this you lose all your data (you don't really as you can roll back to the previous version, but it doesn't even tell you that!)



That is what I'm talking about, yes.

Page format for tables hasn't changed since 8.4, tuple format hasn't changed in a backwards-incompatible manner since 8.4 (probably earlier).

BTree indexes have changed a bit, but ones created in 9.0.x can still be loaded and used in 14.x.

GIN/GiST/SP-GiST/BRIN all don't seem to have had backwards-incompatible changes, looking at https://why-upgrade.depesz.com/show?from=8.4&to=14.2

The only thing that changed is the catalogs, upgradable through pg_upgrade.


Pretty much every major PG release clearly states the on-disk format isn't fixed between major versions, and is subject to change:

https://www.postgresql.org/docs/14/upgrading.html

https://www.postgresql.org/docs/13/upgrading.html

https://www.postgresql.org/docs/12/upgrading.html

https://www.postgresql.org/docs/11/upgrading.html

https://www.postgresql.org/docs/10/upgrading.html

  For major releases of PostgreSQL, the internal data storage format is subject
  to change, thus complicating upgrades.


Yes, that's more 'keeping the option open' than 'we do this regularly', and I can't seem to find any documentation that MySQL gives any better guarantee.

Note that for all of 10, 11, 12, 13 and 14 no changes have been made in the storage format of tables that made it mandatory to rewrite any user-defined schema.

I will admit that some changes have been made that make the data not forward-compatible in those versions; but MySQL seems to do that at the minor release level instead of the major release level. MySQL 8 doen't even support minor release downgrades; under PostgreSQL this works just fine.


pg_upgrade will take care of that. And you can still run upgrade from 8.4 to 14 using the --link mode which means no data will be copied - only the system catalogs need to be re-created.


You're totally missing the point. It's like you're saying "other than that, how did you like the play mrs Lincoln?"

pg_upgrade should not be needed at all! It isn't for mysql. Or if it is needed it should be automatic.

Just the command line description and the manual of pg_upgrade makes you want to run away screaming. It's not ok.


>> Just the command line description and the manual of pg_upgrade makes you want to run away screaming. It's not ok.

Why is it not ok? This is pg_upgrade:

> Major PostgreSQL releases regularly add new features that often change the layout of the system tables, but the internal data storage format rarely changes. pg_upgrade uses this fact to perform rapid upgrades by creating new system tables and simply reusing the old user data files. If a future major release ever changes the data storage format in a way that makes the old data format unreadable, pg_upgrade will not be usable for such upgrades. (The community will attempt to avoid such situations.)

This is mysql_upgrade:

> Each time you upgrade MySQL, you should execute mysql_upgrade, which looks for incompatibilities with the upgraded MySQL server:

> * It upgrades the system tables in the mysql schema so that you can take advantage of new privileges or capabilities that might have been added.

> * It upgrades the Performance Schema, INFORMATION_SCHEMA, and sys schema.

> * It examines user schemas.

> If mysql_upgrade finds that a table has a possible incompatibility, it performs a table check and, if problems are found, attempts a table repair.

The description seems comparable, and if anything pg_upgrade looks saner by not attempting silly things like "table repair".

>> pg_upgrade should not be needed at all! It isn't for mysql. Or if it is needed it should be automatic.

It isn't for mysql since 8.0.16, where this becomes an automatic process. Personally, I prefer having an explicit step to perform the upgrade, instead of running a new binary to start the database process and also optionally perform the upgrade at the same time.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: