pgautoupgrade / docker-pgautoupgrade

A PostgreSQL Docker container that automatically upgrades your database
https://hub.docker.com/r/pgautoupgrade/pgautoupgrade
MIT License
537 stars 19 forks source link

Error during upgrade attempt #18

Closed electrocnic closed 9 months ago

electrocnic commented 9 months ago

Side-Note: I did not run this on a crucial server, just on my test instance of a little side hobby project which had still a postgres 13 docker volume. I could have thrown it away, but I thought I would like to learn the process of updating it properly.

Hopefully my log output helps to figure out some bugs? (I am sorry that I cannot share more details).

database1_1       | PostgreSQL Database directory appears to contain a database; Skipping initialization
database1_1       | 
database1_1       | ************************************
database1_1       | PostgreSQL data directory: /var/lib/postgresql/data
database1_1       | ************************************
database1_1       | *******************************************************************************************
database1_1       | Performing PG upgrade on version 13 database files.  Upgrading to version 16
database1_1       | *******************************************************************************************
database1_1       | ----------------------------------------------------------------------
database1_1       | Checking for left over artifacts from a failed previous autoupgrade...
database1_1       | ----------------------------------------------------------------------
database1_1       | -------------------------------------------------------------------------------
database1_1       | No artifacts found from a failed previous autoupgrade.  Continuing the process.
database1_1       | -------------------------------------------------------------------------------
database1_1       | ---------------------------------------
database1_1       | Creating OLD temporary directory /var/lib/postgresql/data/old
database1_1       | ---------------------------------------
database1_1       | --------------------------------------------
database1_1       | Creating OLD temporary directory is complete
database1_1       | --------------------------------------------
database1_1       | -------------------------------------------------------
database1_1       | Moving existing data files into OLD temporary directory
database1_1       | -------------------------------------------------------
database1_1       | '/var/lib/postgresql/data/PG_VERSION' -> '/var/lib/postgresql/data/old/PG_VERSION'
database1_1       | '/var/lib/postgresql/data/base' -> '/var/lib/postgresql/data/old/base'
database1_1       | '/var/lib/postgresql/data/global' -> '/var/lib/postgresql/data/old/global'
database1_1       | '/var/lib/postgresql/data/old' -> '/var/lib/postgresql/data/old/old'
database1_1       | '/var/lib/postgresql/data/pg_commit_ts' -> '/var/lib/postgresql/data/old/pg_commit_ts'
database1_1       | '/var/lib/postgresql/data/pg_dynshmem' -> '/var/lib/postgresql/data/old/pg_dynshmem'
database1_1       | '/var/lib/postgresql/data/pg_hba.conf' -> '/var/lib/postgresql/data/old/pg_hba.conf'
database1_1       | '/var/lib/postgresql/data/pg_ident.conf' -> '/var/lib/postgresql/data/old/pg_ident.conf'
database1_1       | '/var/lib/postgresql/data/pg_logical' -> '/var/lib/postgresql/data/old/pg_logical'
database1_1       | '/var/lib/postgresql/data/pg_multixact' -> '/var/lib/postgresql/data/old/pg_multixact'
database1_1       | '/var/lib/postgresql/data/pg_notify' -> '/var/lib/postgresql/data/old/pg_notify'
database1_1       | '/var/lib/postgresql/data/pg_replslot' -> '/var/lib/postgresql/data/old/pg_replslot'
database1_1       | '/var/lib/postgresql/data/pg_serial' -> '/var/lib/postgresql/data/old/pg_serial'
database1_1       | '/var/lib/postgresql/data/pg_snapshots' -> '/var/lib/postgresql/data/old/pg_snapshots'
database1_1       | '/var/lib/postgresql/data/pg_stat' -> '/var/lib/postgresql/data/old/pg_stat'
database1_1       | '/var/lib/postgresql/data/pg_stat_tmp' -> '/var/lib/postgresql/data/old/pg_stat_tmp'
database1_1       | '/var/lib/postgresql/data/pg_subtrans' -> '/var/lib/postgresql/data/old/pg_subtrans'
database1_1       | '/var/lib/postgresql/data/pg_tblspc' -> '/var/lib/postgresql/data/old/pg_tblspc'
database1_1       | '/var/lib/postgresql/data/pg_twophase' -> '/var/lib/postgresql/data/old/pg_twophase'
database1_1       | '/var/lib/postgresql/data/pg_wal' -> '/var/lib/postgresql/data/old/pg_wal'
database1_1       | '/var/lib/postgresql/data/pg_xact' -> '/var/lib/postgresql/data/old/pg_xact'
database1_1       | '/var/lib/postgresql/data/postgresql.auto.conf' -> '/var/lib/postgresql/data/old/postgresql.auto.conf'
database1_1       | '/var/lib/postgresql/data/postgresql.conf' -> '/var/lib/postgresql/data/old/postgresql.conf'
database1_1       | '/var/lib/postgresql/data/postmaster.opts' -> '/var/lib/postgresql/data/old/postmaster.opts'
database1_1       | -------------------------------------------------------------------
database1_1       | Moving existing data files into OLD temporary directory is complete
database1_1       | -------------------------------------------------------------------
database1_1       | ---------------------------------------
database1_1       | Creating NEW temporary directory /var/lib/postgresql/data/new
database1_1       | ---------------------------------------
database1_1       | --------------------------------------------
database1_1       | Creating NEW temporary directory is complete
database1_1       | --------------------------------------------
database1_1       | -----------------------------------------------------
database1_1       | Changing permissions of temporary directories to 0700
database1_1       | -----------------------------------------------------
database1_1       | ---------------------------------------------------------
database1_1       | Changing permissions of temporary directories is complete
database1_1       | ---------------------------------------------------------
database1_1       | ------------------------------------
database1_1       | Determining our own initdb arguments
database1_1       | ------------------------------------
database1_1       | mv: can't rename '/var/lib/postgresql/data/old': Invalid argument
database1_1       | ---------------------------------------------------------------
database1_1       | The initdb arguments we determined are: --locale=en_US.utf8 --lc-collate=en_US.utf8 --lc-ctype=en_US.utf8 --encoding=UTF8
database1_1       | ---------------------------------------------------------------
database1_1       | --------------------------------------------------------------------------------------------------------------------
database1_1       | Old database using collation settings: '--locale=en_US.utf8 --lc-collate=en_US.utf8 --lc-ctype=en_US.utf8 --encoding=UTF8'.  Initialising new database with those settings too
database1_1       | --------------------------------------------------------------------------------------------------------------------
database1_1       | Initialising PostgreSQL 15 data directory
database1_1       | The files belonging to this database system will be owned by user "postgres".
database1_1       | This user must also own the server process.
database1_1       | 
database1_1       | The database cluster will be initialized with locale "en_US.utf8".
database1_1       | The default text search configuration will be set to "english".
database1_1       | 
database1_1       | Data page checksums are disabled.
database1_1       | 
database1_1       | fixing permissions on existing directory /var/lib/postgresql/data/new ... ok
database1_1       | creating subdirectories ... ok
database1_1       | selecting dynamic shared memory implementation ... posix
database1_1       | selecting default max_connections ... 100
database1_1       | selecting default shared_buffers ... 128MB
database1_1       | selecting default time zone ... UTC
database1_1       | creating configuration files ... ok
database1_1       | running bootstrap script ... ok
database1_1       | performing post-bootstrap initialization ... ok
database1_1       | syncing data to disk ... ok
database1_1       | 
database1_1       | 
database1_1       | Success. You can now start the database server using:
database1_1       | 
database1_1       |     /usr/local/bin/pg_ctl -D /var/lib/postgresql/data/new/ -l logfile start
database1_1       | 
database1_1       | ------------------------------------
database1_1       | New database initialisation complete
database1_1       | ------------------------------------
database1_1       | ---------------------------------------
database1_1       | Running pg_upgrade command, from /var/lib/postgresql/data
database1_1       | ---------------------------------------
database1_1       | initdb: warning: enabling "trust" authentication for local connections
database1_1       | initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
database1_1       | Performing Consistency Checks
database1_1       | -----------------------------
database1_1       | Checking cluster versions                                     ok
database1_1       | 
database1_1       | connection to server on socket "/var/lib/postgresql/data/.s.PGSQL.50432" failed: FATAL:  role "postgres" does not exist
database1_1       | 
database1_1       | 
database1_1       | could not connect to source postmaster started with the command:
database1_1       | "/usr/local-pg13/bin/pg_ctl" -w -l "/var/lib/postgresql/data/new/pg_upgrade_output.d/20231227T160236.115/log/pg_upgrade_server.log" -D "/var/lib/postgresql/data/old" -o "-p 50432 -b  -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directories='/var/lib/postgresql/data'" start
database1_1       | Failure, exiting
justinclift commented 9 months ago

Interesting. This piece of the output is probably where things are going wrong:

FATAL:  role "postgres" does not exist

With your application, what's the name of the database super user? :smile:

electrocnic commented 9 months ago

Ah yes, the username is probably postgres_django and the database name database1. How can I tell pgautoupgrade to use postgres_django?

justinclift commented 9 months ago

Try passing in a POSTGRES_USER variable with that username (to the docker container), as that should solve that particular problem. Hopefully it's the only one stopping your upgrade from working. :smile:

For reference, the variable get used in places like this:

https://github.com/pgautoupgrade/docker-pgautoupgrade/blob/430eb9290dd9aeed421ffeefdb2502b2bec28477/docker-entrypoint.sh#L516

electrocnic commented 9 months ago

Ah yes, thanks for your response, sadly I currently have no way to test it anymore (without too much effort), but I think this would work nicely!

justinclift commented 9 months ago

No worries at all. :smile: