Postgresql как перенести базу на другой диск
Перейти к содержимому

Postgresql как перенести базу на другой диск

  • автор:

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

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

Теперь разметим его с помощью 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=# 

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

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

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

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

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

Если на диске есть необходимые разделы, переходим к п. 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/11/main/test_write.txt && ls -l /var/lib/postgresql/11/main/ 

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

  1. Копируем всё на жёсткий диск:
sudo cp -R /home/user/rezerv/* /var/lib/postgresql/ 

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

  1. Меняем владельца на postgres:
sudo chown -R postgres:postgres /var/lib/postgresql/11/main 
  1. Выставляем ему права доступа на 700:
sudo chmod -R 700 /var/lib/postgresql/11/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 с осторожностью, чтобы не потерять данные.

© Copyright Atom Security, Inc.

Postgresql как перенести базу на другой диск

Как перенести одну из нескольких баз в другое место (к примеру на другой диск E:) не затрагивая месторасположение остальных БД ?

detach базы, копирование (перенос) файлов, attach

Ну или в плохом случае - полный бекап и потом рестор в новую базу.
Но первый лучше.

(1) а постгрес умеет работать с базами на разных дисках?

А Можно поподробней я не очень силен в postgree *((
как поменять место хранения всех баз я представляю, а вот как отжелить одну и перенести в другое место не особо

1) Выясняем в какой папке лежит нужная тебе БД. они имеют цифровые номера
2) Останавливаем постгес
3) переносим содержимое этой папки на нужный тебе диск
4) монтируем этт диск в исходную папку (в виндовсе это сделать можно тоже)
5) убеждаемся что с правами доступа к файлам ОК
6) запускаем пострегс

Как перенести базы 1С PostgreSQL на другой диск (папку)

Разберем сценарий переноса баз 1С PostgreSQL на другой диск или папку. Для этого требуется перенастроить запуск службы СУБД с новым параметрами. А точнее — изменить ключ «-D», за которым следует указание каталога данных.

Итак, ищем ветку в системном реестре (пример — в вашем случае название службы может отличаться, в зависимости от версии PostgreSQL):

Содержимое параметра ImagePath для службы «postgresql-1c-13 — PostgreSQL Server 13»:

«C:\Program Files\PostgreSQL\bin\pg_ctl.exe» runservice -N «postgresql-1c-13» -D «C:\PostgreSQL\data» -w

План перевода ИБ PostgreSQL на другое расположение

  1. Выполните резервное копирование ИБ (через Конфигуратор, средствами СУБД).
  2. Временно остановите службу Агента сервера 1С.
  3. Остановите службу PostgreSQL. Сделайте бэкап ветки реестра с параметрами службы. Для подстраховки, чтобы можно было вернуться к прежним настройкам, если при новых появятся ошибки.
  4. Скопируйте каталог с базами на другой диск.

Пример команды с копированием папок и прав безопасности ниже (выполняйте от имени администратора).

robocopy C:\PostgreSQL D:\PostgreSQL /E /COPYALL /SECFIX
  1. Измените путь к базам в реестре — скорректируйте ImagePath для службы PostgreSQL (-D «D:\PostgreSQL\data»).

Пусть все получится, и PostgreSQL вместе с сервером 1С корректно примут новое расположение файлов БД.

__________
Если что-то не получается и требуется поддержка — наши программисты готовы помочь → +7-911-500-10-11

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *