Перейти к основному содержимому

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

·508 слов·3 минут
работа
Юрий Семеньков
Автор
Юрий Семеньков
DevOps, tech, geek, mentor
Оглавление

Жил был сервис, и была у него база, и жила она в /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=# 

Если всё ок, можно удалить старую базу, чтобы освободить место в корне.


💡 Если вам нравятся мои посты, то подписывайтесь также:

Related

Бекапы индексов в Elasticsearch
·399 слов·2 минут
работа