Жил был сервис, и была у него база, и жила она в /var/lib/postgresql
на основном диске. И стала база занимать почти весь диск.
Ну и мы не лыком шиты, перенесем ее на отдельный диск.
План такой:
- Добавляем новый диск
- Монтируем его в какую-то папку
- Переносим туда БД
- Тут, возможно, мы захотим жить в новой директории - тогда поменяем конфиг.
- Прячем текущую папку
/var/lib/postgresql
- Монтируем наш диск вместо старой папки
Погнали 🚀
Готовим диск #
Представим, что мы уже добавили диск в гипервизоре и видим его в выводе lsblk
:
admin@host.infra.domain.local:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 99.2M 1 loop /snap/core/10908
loop1 7:1 0 99.2M 1 loop /snap/core/10859
sda 8:0 0 550G 0 disk
├─sda1 8:1 0 1M 0 part
└─sda2 8:2 0 550G 0 part /
sdb 8:16 0 1000G 0 disk <<<<------- THIS
Теперь разметим его с помощью parted
:
parted /dev/sdb
mklabel gpt
unit s
mkpart primary ext4 0% 100%
quit
Отформатируем раздел в ext4:
mkfs.ext /dev/sdb1
Монтируем диск #
Сначала создадим левую папку, куда мы примонтируем новый раздел и будем перекидывать базу mkdir /tempdb
.
☝️ Хорошим тоном считается добавлять в /etc/fstab записи с UUID диска, а не /dev/sdb1.
Дальше посмотрим UUID нашего раздела. Даем команду blkid
:
/dev/sda2: UUID="b651b0ae-ef1d-11e9-be07-005056926860" TYPE="ext4" PARTUUID="1cd39f87-c0cd-f24d-baff-a39ff152be09"
/dev/loop0: TYPE="squashfs"
/dev/loop1: TYPE="squashfs"
/dev/sdb1: UUID="fe561baa-f4de-4c52-bdff-cc496353a0a9" TYPE="ext4" PARTLABEL="primary" PARTUUID="4d0987b3-0010-434c-aac4-b42ba2a75582"
Вот же он: /dev/sdb1: UUID="fe561baa-f4de-4c52-bdff-cc496353a0a9"
Теперь добавляем строку в файл /etc/fstab
, можно руками через vi/nano, можно echo-м:
echo 'UUID=fe561baa-f4de-4c52-bdff-cc496353a0a9 /tempdb ext4 defaults 0 0' >> /etc/fstab
После этого делаем mount -a
. Раздел примонтирован в новую папку.
Перенос базы #
Сначала остановим сервис systemctl stop postgresql
, чтобы во время копирования не записывались свежие данные.
Начинаем копировать данные:
rsync -arv /var/lib/postgres/ /tempdb
и ждем. У меня база на 500Гб копировалась два часа, но всё зависит от железа, самой базы, фазы луны и дня недели.
На этом этапе мы можем изменить путь к базе в конфигурационном файле postgresql и запустить сервис, всё будет работать. Для этого редактируем файл /etc/postgres/10/main/postgresql.conf
и меняем пусть к директории в строке:
data_directory = '/tempdb/10/main'
Но если мы не хотим менять папку в конфиге Постгреса, то нужно спрятать старую базу, ведь мы не хотим ее сразу удалять, вдруг понадобится.
mkdir /var/oldpostgres && mv /var/lib/postgres/ /var/oldpostgres
Теперь проверим, что мы не напутали с папками и /var/lib/postgresql на месте. Если нет - mkdir /var/lib/postgresql
.
Размонтируем диск umount /tembdb
, а затем заходим в nano /etc/fstab
и редактируем строку с подключением. Нам нужно изменить точку монтирования. Должно получиться так:
UUID=fe561baa-f4de-4c52-bdff-cc496353a0a9 /var/lib/postgresql ext4 defaults 0 0
☝️ Не забудь, что UUID у тебя будет свой уникальный
Делаем mount -a
и пробуем запустить сервис systemctl start postgresql
.
Проверяем #
Как проверить? Ну например netstat -tulpn | grep 5432
, и если у вас постгрес на стандартном порту, должен быть вывод, вроде:
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 225199/postgres
tcp6 0 0 :::5432 :::* LISTEN 225199/postgres
Можно попробовать зайди в базу sudo -u postgres psql
:
psql (10.16 (Ubuntu 10.16-0ubuntu0.18.04.1))
Type "help" for help.
postgres=#
Если всё ок, можно удалить старую базу, чтобы освободить место в корне.
💡 Если вам нравятся мои посты, то подписывайтесь также:
- Новостной канал 📺
- Чат 🤘🏼