# PostgreSQL 15 update

**URL:** https://meta.discourse.org/t/postgresql-15-update/349515
**Category:** Announcements
**Created:** [January 29, 2025, 7:20am UTC](https://meta.discourse.org/t/postgresql-15-update/349515 "2025-01-29T07:20:00Z")
**Posts on this page:** 1
**Showing post:** 134

<div class="post-metadata">

### Author: ![piffy](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/piffy/32/254198_2.png) [@piffy](https://meta.discourse.org/u/piffy)
#### Post date: [February 23, 2025, 12:02pm UTC](https://meta.discourse.org/t/postgresql-15-update/349515/134 "2025-02-23T12:02:40Z")

</div>

I’m having significant problems doing this upgrade too. Similar @Vaping_Community, I have postgres on a different mounted volume (`/mnt/volume_tor1_01/shared/standalone`).

I am getting this error

```plaintext
mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old': Device or resource busy
mv: inter-device move failed: '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new'; unable to remove target: Directory not empty

 [...]

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE

Old 13 database is stored at /shared/postgres_data_old

To complete the upgrade, rebuild again using:

./launcher rebuild app
-------------------------------------------------------------------------------------

```

My understanding is that the solution is to basically manually rename  
`postgres_data` → `postgres_data_old`  
`postgres_new` → `postgres_data`

then run `./launcher rebuild app`. Seems simple enough, but when I rebuild, I still am stuck in the loop and end up with the following directories:

- `postgres_data_older`
- ~~`postgres_data_old`~~ (I think it becomes `postgres_data_older`)
- `postgres_data`
- `postgres_data_new`

It seems like for some reason it’s not recognizing that `postgres_data` has updated, tries to do it again, fails when trying to move the directory.

```plaintext
$ cat postgres_data/PG_VERSION 
15

```

I tried the manual approach laid out in the OP but no luck either. Please help!

> **full log**
>
> ```plaintext
> x86_64 arch detected.
> Ensuring launcher is up to date
> Fetching origin
> Launcher is up-to-date
> Stopping old container
> + /usr/bin/docker stop -t 600 app
> app
> 2.0.20250129-0720: Pulling from discourse/base
> Digest: sha256:01b8516e5504c0e9bc3707773015ff4407be03a89154194ff3b5b8699291bc26
> Status: Image is up to date for discourse/base:2.0.20250129-0720
> docker.io/discourse/base:2.0.20250129-0720
> /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
> /usr/local/bin/pups --stdin
> I, [2025-02-23T11:41:32.477354 #1] INFO -- : Reading from stdin
> I, [2025-02-23T11:41:32.504068 #1] INFO -- : File > /etc/service/postgres/run chmod: +x chown: 
> I, [2025-02-23T11:41:32.508552 #1] INFO -- : File > /etc/service/postgres/log/run chmod: +x chown: 
> I, [2025-02-23T11:41:32.513290 #1] INFO -- : File > /etc/runit/3.d/99-postgres chmod: +x chown: 
> I, [2025-02-23T11:41:32.517671 #1] INFO -- : File > /root/install_postgres chmod: +x chown: 
> I, [2025-02-23T11:41:32.522244 #1] INFO -- : File > /root/upgrade_postgres chmod: +x chown: 
> I, [2025-02-23T11:41:32.523354 #1] INFO -- : Replacing data_directory = '/var/lib/postgresql/15/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/15/main/postgresql.conf
> I, [2025-02-23T11:41:32.523912 #1] INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
> I, [2025-02-23T11:41:32.524756 #1] INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
> I, [2025-02-23T11:41:32.525365 #1] INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
> I, [2025-02-23T11:41:32.526239 #1] INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
> I, [2025-02-23T11:41:32.526873 #1] INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/15/main/postgresql.conf
> I, [2025-02-23T11:41:32.527613 #1] INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
> I, [2025-02-23T11:41:32.531734 #1] INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
> I, [2025-02-23T11:41:32.532882 #1] INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/15/main/postgresql.conf
> I, [2025-02-23T11:41:32.534021 #1] INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres peer in /etc/postgresql/15/main/pg_hba.conf
> I, [2025-02-23T11:41:32.534342 #1] INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/15/main/pg_hba.conf
> I, [2025-02-23T11:41:32.534935 #1] INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /etc/postgresql/15/main/pg_hba.conf
> I, [2025-02-23T11:41:32.535476 #1] INFO -- : > if [-f /root/install_postgres]; then
> /root/install_postgres && rm -f /root/install_postgres
> elif [-e /shared/postgres_run/.s.PGSQL.5432]; then
> socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
> fi
> 
> initdb: warning: enabling "trust" authentication for local connections
> 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.
> W: https://dl.yarnpkg.com/debian/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
> debconf: delaying package configuration, since apt-utils is not installed
> mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old': Device or resource busy
> mv: inter-device move failed: '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new'; unable to remove target: Directory not empty
> I, [2025-02-23T11:42:52.303584 #1] INFO -- : Generating locales (this might take a while)...
> en_US.UTF-8... done
> Generation complete.
> Upgrading PostgreSQL from version 13 to 15
> The files belonging to this database system will be owned by user "postgres".
> This user must also own the server process.
> 
> The database cluster will be initialized with locale "en_US.UTF-8".
> The default database encoding has accordingly been set to "UTF8".
> The default text search configuration will be set to "english".
> 
> Data page checksums are disabled.
> 
> fixing permissions on existing directory /shared/postgres_data_new ... ok
> creating subdirectories ... ok
> selecting dynamic shared memory implementation ... posix
> selecting default max_connections ... 100
> selecting default shared_buffers ... 128MB
> selecting default time zone ... Etc/UTC
> creating configuration files ... ok
> running bootstrap script ... ok
> performing post-bootstrap initialization ... ok
> syncing data to disk ... ok
> 
> Success. You can now start the database server using:
> 
> /usr/lib/postgresql/15/bin/pg_ctl -D /shared/postgres_data_new -l logfile start
> 
> Get:1 http://deb.debian.org/debian bookworm-backports InRelease [59.0 kB]
> Get:2 http://deb.debian.org/debian bookworm InRelease [151 kB]
> Get:3 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
> Get:4 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
> Get:5 https://dl.yarnpkg.com/debian stable InRelease [17.1 kB]
> Get:6 https://deb.nodesource.com/node_22.x nodistro InRelease [12.1 kB]
> Get:7 http://deb.debian.org/debian bookworm-backports/main amd64 Packages [283 kB]
> Get:8 http://deb.debian.org/debian bookworm/main amd64 Packages [8,792 kB]
> Get:9 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [13.5 kB]
> Get:10 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [246 kB]
> Get:11 https://dl.yarnpkg.com/debian stable/main amd64 Packages [10.9 kB]
> Get:12 https://dl.yarnpkg.com/debian stable/main all Packages [10.9 kB]
> Get:13 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg InRelease [129 kB]
> Get:14 https://deb.nodesource.com/node_22.x nodistro/main amd64 Packages [5,636 B]
> Get:15 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 Packages [360 kB]
> Fetched 10.2 MB in 2s (6,490 kB/s)
> Reading package lists...
> Reading package lists...
> Building dependency tree...
> Reading state information...
> The following additional packages will be installed:
> libllvm19 postgresql-client-13
> Suggested packages:
> postgresql-doc-13
> The following NEW packages will be installed:
> libllvm19 postgresql-13 postgresql-13-pgvector postgresql-client-13
> 0 upgraded, 4 newly installed, 0 to remove and 12 not upgraded.
> Need to get 41.6 MB of archives.
> After this operation, 184 MB of additional disk space will be used.
> Get:1 http://deb.debian.org/debian bookworm/main amd64 libllvm19 amd64 1:19.1.4-1~deb12u1 [25.9 MB]
> Get:2 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-client-13 amd64 13.20-1.pgdg120+1 [1,538 kB]
> Get:3 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13 amd64 13.20-1.pgdg120+1 [13.9 MB]
> Get:4 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13-pgvector amd64 0.8.0-1.pgdg120+1 [297 kB]
> Fetched 41.6 MB in 2s (18.8 MB/s)
> Selecting previously unselected package libllvm19:amd64.
> (Reading database ... 33363 files and directories currently installed.)
> Preparing to unpack .../libllvm19_1%3a19.1.4-1~deb12u1_amd64.deb ...
> Unpacking libllvm19:amd64 (1:19.1.4-1~deb12u1) ...
> Selecting previously unselected package postgresql-client-13.
> Preparing to unpack .../postgresql-client-13_13.20-1.pgdg120+1_amd64.deb ...
> Unpacking postgresql-client-13 (13.20-1.pgdg120+1) ...
> Selecting previously unselected package postgresql-13.
> Preparing to unpack .../postgresql-13_13.20-1.pgdg120+1_amd64.deb ...
> Unpacking postgresql-13 (13.20-1.pgdg120+1) ...
> Selecting previously unselected package postgresql-13-pgvector.
> Preparing to unpack .../postgresql-13-pgvector_0.8.0-1.pgdg120+1_amd64.deb ...
> Unpacking postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
> Setting up libllvm19:amd64 (1:19.1.4-1~deb12u1) ...
> Setting up postgresql-client-13 (13.20-1.pgdg120+1) ...
> Setting up postgresql-13 (13.20-1.pgdg120+1) ...
> Creating new PostgreSQL cluster 13/main ...
> /usr/lib/postgresql/13/bin/initdb -D /var/lib/postgresql/13/main --auth-local peer --auth-host md5
> The files belonging to this database system will be owned by user "postgres".
> This user must also own the server process.
> 
> The database cluster will be initialized with locale "C.UTF-8".
> The default database encoding has accordingly been set to "UTF8".
> The default text search configuration will be set to "english".
> 
> Data page checksums are disabled.
> 
> fixing permissions on existing directory /var/lib/postgresql/13/main ... ok
> creating subdirectories ... ok
> selecting dynamic shared memory implementation ... posix
> selecting default max_connections ... 100
> selecting default shared_buffers ... 128MB
> selecting default time zone ... Etc/UTC
> creating configuration files ... ok
> running bootstrap script ... ok
> performing post-bootstrap initialization ... ok
> syncing data to disk ... ok
> 
> Success. You can now start the database server using:
> 
> pg_ctlcluster 13 main start
> 
> invoke-rc.d: could not determine current runlevel
> invoke-rc.d: policy-rc.d denied execution of start.
> Setting up postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
> Processing triggers for libc-bin (2.36-9+deb12u9) ...
> Processing triggers for postgresql-common (267.pgdg120+1) ...
> Building PostgreSQL dictionaries from installed myspell/hunspell packages...
> Removing obsolete dictionary files:
> Stopping PostgreSQL 13 database server: main.
> Stopping PostgreSQL 15 database server: main.
> Performing Consistency Checks
> -----------------------------
> Checking cluster versions ok
> Checking database user is the install user ok
> Checking database connection settings ok
> Checking for prepared transactions ok
> Checking for system-defined composite types in user tables ok
> Checking for reg* data types in user tables ok
> Checking for contrib/isn with bigint-passing mismatch ok
> Checking for user-defined encoding conversions ok
> Checking for user-defined postfix operators ok
> Checking for incompatible polymorphic functions ok
> Creating dump of global objects ok
> Creating dump of database schemas ok
> Checking for presence of required libraries ok
> Checking database user is the install user ok
> Checking for prepared transactions ok
> Checking for new cluster tablespace directories ok
> 
> If pg_upgrade fails after this point, you must re-initdb the
> new cluster before continuing.
> 
> Performing Upgrade
> ------------------
> Analyzing all rows in the new cluster ok
> Freezing all rows in the new cluster ok
> Deleting files from new pg_xact ok
> Copying old pg_xact to new server ok
> Setting oldest XID for new cluster ok
> Setting next transaction ID and epoch for new cluster ok
> Deleting files from new pg_multixact/offsets ok
> Copying old pg_multixact/offsets to new server ok
> Deleting files from new pg_multixact/members ok
> Copying old pg_multixact/members to new server ok
> Setting next multixact ID and offset for new cluster ok
> Resetting WAL archives ok
> Setting frozenxid and minmxid counters in new cluster ok
> Restoring global objects in the new cluster ok
> Restoring database schemas in the new cluster ok
> Copying user relation files ok
> Setting next OID for new cluster ok
> Sync data directory to disk ok
> Creating script to delete old cluster ok
> Checking for extension updates notice
> 
> Your installation contains extensions that should be updated
> with the ALTER EXTENSION command. The file
> update_extensions.sql
> when executed by psql by the database superuser will update
> these extensions.
> 
> Upgrade Complete
> ----------------
> Optimizer statistics are not transferred by pg_upgrade.
> Once you start the new server, consider running:
> /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages
> 
> Running this script will delete the old cluster's data files:
> ./delete_old_cluster.sh
> -------------------------------------------------------------------------------------
> UPGRADE OF POSTGRES COMPLETE
> 
> Old 13 database is stored at /shared/postgres_data_old
> 
> To complete the upgrade, rebuild again using:
> 
> ./launcher rebuild app
> -------------------------------------------------------------------------------------
> 
> ```

---

_[View the full topic](https://meta.discourse.org/t/postgresql-15-update/349515)._
