Ошибка invalid tablespace location при миграции на PostgreSQL 15

Проблема

При миграции на PostgreSQL 15 возникает ошибка неправильного расположения архивной базы данных:

ERROR: invalid tablespace location: /var/lib/postgresql/11/archive_2023 (name=archive_2023, owner=postgres)

Причина

Симлинк на архивные БД создан по устаревшей инструкции и находится в путях старого кластера /var/lib/postgresql/11/.

Выясните расположение БД:

  1. Запустите SQL:

    staffcop sql
    
  2. В psql-консоли выполните запрос в SQL:

    SELECT spcname AS "Name", pg_catalog.pg_get_userbyid(spcowner) AS "Owner", pg_catalog.pg_tablespace_location(oid) AS "Location" FROM pg_catalog.pg_tablespace ORDER BY 1;
    

Пример вывода:

 Name         |  Owner   |              Location
--------------+----------+-------------------------------------
 archive_2023 | postgres | /var/lib/postgresql/11/archive_2023
 pg_default   | postgres |
 pg_global    | postgres |
 (3 строки)

 staffcop=>

База данных archive_2023 находится в старом кластере /var/lib/postgresql/11/.

Решение

Пересоздайте симлинк на смонтированный том.

  1. Остановите PostgreSQL:

    sudo systemctl stop postgresql@11-main
    
  2. Узнайте имя текущего симлинка на архивную БД, в нашем случае — archive_2023:

    sudo ls -l /var/lib/postgresql/11/main/pg_tblspc
    total 0
    lrwxrwxrwx 1 postgres postgres 35 июн  3 22:18 24939407 -> /var/lib/postgresql/11/archive_2023
    
  3. Удалите симлинк:

    sudo rm /var/lib/postgresql/11/main/pg_tblspc/24939407
    
  4. Проверьте, что всё удалилось:

    sudo ls -l /var/lib/postgresql/11/main/pg_tblspc
    
  5. Создайте новый симлинк:

    sudo ln -sf /mnt/archive_2023/ /var/lib/postgresql/11/main/pg_tblspc/24939407
    
  6. Убедитесь, что симлинк создан и ведет к нужному каталогу:

    sudo ls -l /var/lib/postgresql/11/main/pg_tblspc
    total 0
    lrwxrwxrwx 1 root root 18 июл  1 18:41 24939407 -> /mnt/archive_2023/
    
  7. Возобновите работу PostgreSQL:

    sudo systemctl start postgresql@11-main
    
  8. Вновь войдите в консоль psql и проверьте все тейблспейсы:

    staffcop sql
    
    support@staffcop53beta:/usr/share/staffcop/bin$ staffcop sql
    psql (11.20 (Ubuntu 11.20-1.pgdg18.04+1))
    
  9. Получите справку:

    help
    

    Пример вывода:

    staffcop=> SELECT spcname AS "Name", pg_catalog.pg_get_userbyid(spcowner) AS "Owner", pg_catalog.pg_tablespace_location(oid) AS "Location" FROM pg_catalog.pg_tablespace ORDER BY 1;
         Name     |  Owner   |      Location
    --------------+----------+--------------------
     archive_2023 | postgres | /mnt/archive_2023/
     pg_default   | postgres |
     pg_global    | postgres |
    (3 строки)
    
    staffcop=>
    

Теперь БД расположена в правильном каталоге — /mnt/archive_2023/.