Перенос базы на другой жёсткий диск

Внимание

Жёсткий диск / раздел должен существовать в системе и быть подключен физически.

Внимание

Нельзя использовать одну и ту же точку монтирования для файлов и БД.

Если на диске есть необходимые разделы, переходим к п.2.

При отсутствии разделов — размечаем диск любой программой разметки, например так:

sudo cfdisk /dev/sdX

и создаём на нём файловую систему командой:

sudo mkfs.ext4 /dev/sdX

где Х — завершение имени диска.

  1. Останавливаем сервисы командами:

sudo service postgresql stop
sudo staffcop stop
  1. Редактируем файл /etc/fstab:

sudo nano -w /etc/fstab

Прописываем в него строку:

/dev/sdX  /var/lib/postgresql/ ext4 rw,noatime 0 2

где /dev/sdX — ваш жёсткий диск; /var/lib/postgresql/ — каталог, в котором отобразится содержимое диска; ext4 — тип файловой системы (если вы используете другую фс jfs/xfs/reiser и т. д., эта опция меняется), rw — разрешение на чтение-запись на диск. Также можно прописать диск по UUID. Узнать UUID диска можно с помощью команды:

sudo blkid

В этом случае первая часть записи примет вид UUID=, где в кавычки нужно вписать результат вывода вышеуказанной команды.

Предупреждение

Разделы с GPT-форматированием можно примонтировать только по UUID-диска!

  1. Создаём папку для резервного копирования и перемещаем в неё данные из каталога базы данных:

mkdir /home/user/rezerv && sudo mv /var/lib/postgresql/* /home/user/rezerv

где user — это домашний каталог пользователя. Скорее всего, у вас он отличается. Узнать домашний каталог пользователя можно командой:

env | grep -E "home|HOME"

Результатом выдачи данной команды будет домашний каталог пользователя, от имени которого эта команда выполнена.

  1. Проверяем корректность монтирования командой:

sudo mount -a

Эта команда монтирует диск, который уже прописан в fstab, но еще не примонтирован.

Если мы что-то вписали неверно либо ошиблись, то мы увидим ошибки монтирования и, соответственно, получим возможность исправить допущенную ошибку. Проверяем корректность монтирования диска командой типа:

df -h

Также можно проверить, что данный раздел доступен на запись. Например, создадим текстовый файл и проверим его наличие командами:

touch /var/lib/postgresql/15/main/test_write.txt && ls -l /var/lib/postgresql/15/main/

Либо просто выполнив команду mount без параметров: её результатом станет вывод всех монтированных систем; наше новое устройство должно быть монтировано rw.

Если используете PostgreSQL 11, здесь и далее укажите правильную версию в пути — например, /var/lib/postgresql/11/main/

  1. Копируем всё на жёсткий диск:

sudo cp -R  /home/user/rezerv/* /var/lib/postgresql/

В случае если вы перемещали данные в другой каталог, произведите изменения в соответствии с реальным расположением файлов.

  1. Меняем владельца на postgres:

sudo chown -R postgres:postgres /var/lib/postgresql/15/main
  1. Выставляем ему права доступа на 700:

sudo chmod -R 700 /var/lib/postgresql/15/main
  1. Запускаем сервисы PostgreSQL, Staffcop и Nginx :

sudo service postgresql start
sudo staffcop start

Выполняем команду:

sudo staffcop sql

в появившемся приглашении пишем analyze; ждём.

Ошибки типа ПРЕДУПРЕЖДЕНИЕ: pg_shdescription пропускается только суперпользователь может анализировать этот объект некритичны, т. к. говорят о том, что команда, запущенная с данными правами, не смогла проанализировать служебные таблицы БД. Это и не требуется.

  1. Заходим в веб-интерфейс, проверяем, что всё работает, все отчёты видны и т. д. Если всё в порядке, можно удалять резервные файлы:

rm -R /home/user/rezerv

Используйте rm с осторожностью, чтобы не потерять данные.