Перенос базы на другой жёсткий диск¶
Внимание
Жёсткий диск/раздел должен существовать в системе и быть подключен физически.
Внимание
Нельзя использовать одну и ту же точку монтирования для файлов и БД.
Если на диске есть необходимые разделы, переходим к п. 2.
При отсутствии разделов — размечаем диск любой программой разметки, например так:
sudo cfdisk /dev/sdX
и создаём на нём файловую систему командой
sudo mkfs.ext4 /dev/sdX
где Х — завершение имени диска.
Останавливаем сервисы командами:
sudo service postgresql stop
sudo staffcop stop
Редактируем файл /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-диска!
Создаём папку для резервного копирования и перемещаем в неё данные из каталога базы данных:
mkdir /home/user/rezerv && sudo mv /var/lib/postgresql/* /home/user/rezerv
где user — это домашний каталог пользователя. Скорее всего, у вас он отличается. Узнать домашний каталог пользователя можно командой:
env | grep -E "home|HOME"
Результатом выдачи данной команды будет домашний каталог пользователя, от имени которого эта команда выполнена.
Проверяем корректность монтирования командой:
sudo mount -a
Эта команда монтирует диск, который уже прописан в fstab, но еще не примонтирован.
Если мы что-то вписали неверно либо ошиблись, то мы увидим ошибки монтирования и, соответственно, получим возможность исправить допущенную ошибку. Проверяем корректность монтирования диска командой типа:
df -h
Также можно проверить, что данный раздел доступен на запись. Например, создадим текстовый файл и проверим его наличие командами:
touch /var/lib/postgresql/11/main/test_write.txt && ls -l /var/lib/postgresql/11/main/
Либо просто выполнив команду mount без параметров: её результатом станет вывод всех монтированных систем; наше новое устройство должно быть монтировано rw.
Копируем всё на жёсткий диск:
sudo cp -R /home/user/rezerv/* /var/lib/postgresql/
В случае, если вы перемещали данные в другой каталог, произведите изменения в соответствии с реальным расположением файлов.
Меняем владельца на postgres:
sudo chown -R postgres:postgres /var/lib/postgresql/11/main
Выставляем ему права доступа на 700:
sudo chmod -R 700 /var/lib/postgresql/11/main
Запускаем сервисы PostgreSQL, Staffcop и Nginx :
sudo service postgresql start
sudo staffcop start
Выполняем команду:
sudo staffcop sql
в появившемся приглашении пишем analyze; ждём.
Ошибки типа «ПРЕДУПРЕЖДЕНИЕ: «pg_shdescription» пропускается — только суперпользователь может анализировать этот объект» некритичны, т. к. говорят о том, что команда, запущенная с данными правами, не смогла проанализировать служебные таблицы БД. Это и не требуется.
Заходим в веб-интерфейс, проверяем что всё работает, все отчёты видны и т. д. Если всё в порядке, можно удалять резервные файлы:
rm -R /home/user/rezerv
Используйте rm с осторожностью, чтобы не потерять данные.