Ошибка 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/.
Выясните расположение БД:
Запустите SQL:
staffcop sql
В 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/.
Решение¶
Пересоздайте симлинк на смонтированный том.
Остановите PostgreSQL:
sudo systemctl stop postgresql@11-main
Узнайте имя текущего симлинка на архивную БД, в нашем случае — 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
Удалите симлинк:
sudo rm /var/lib/postgresql/11/main/pg_tblspc/24939407
Проверьте, что всё удалилось:
sudo ls -l /var/lib/postgresql/11/main/pg_tblspc
Создайте новый симлинк:
sudo ln -sf /mnt/archive_2023/ /var/lib/postgresql/11/main/pg_tblspc/24939407
Убедитесь, что симлинк создан и ведет к нужному каталогу:
sudo ls -l /var/lib/postgresql/11/main/pg_tblspc total 0 lrwxrwxrwx 1 root root 18 июл 1 18:41 24939407 -> /mnt/archive_2023/
Возобновите работу PostgreSQL:
sudo systemctl start postgresql@11-main
Вновь войдите в консоль psql и проверьте все тейблспейсы:
staffcop sql support@staffcop53beta:/usr/share/staffcop/bin$ staffcop sql psql (11.20 (Ubuntu 11.20-1.pgdg18.04+1))
Получите справку:
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/.