Перенос базы 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=#
Если всё ок, можно удалить старую базу, чтобы освободить место в корне.
Если вам нравятся мои посты, то подписывайтесь также:
Как перенести базу postgresql на другой диск?
привет. переношу базу postgresql 15 версии в centos 9 на другой диск по данной статье https://www.digitalocean.com/community/tutorials/h. .
Пытаюсь сделать все скриптом. Остановился на запуске службы sudo systemctl start postgresql с такой ошибкой:
× postgresql-15.service - PostgreSQL 15 database server Loaded: loaded (/usr/lib/systemd/system/postgresql-15.service; enabled; preset: disabled) Active: failed (Result: exit-code) since Sun 2023-06-04 21:10:55 +08; 22s ago Docs: https://www.postgresql.org/docs/15/static/ Process: 10980 ExecStartPre=/usr/pgsql-15/bin/postgresql-15-check-db-dir $ (code=exited, status=1/FAILURE) CPU: 16ms июн 04 21:10:55 asus systemd[1]: Starting PostgreSQL 15 database server. июн 04 21:10:55 asus postgresql-15-check-db-dir[10980]: "/var/lib/pgsql/15/data/" is missing or empty. июн 04 21:10:55 asus postgresql-15-check-db-dir[10980]: Use "/usr/pgsql-15/bin/postgresql-15-setup initdb" to initialize the database cluster. июн 04 21:10:55 asus postgresql-15-check-db-dir[10980]: See /usr/share/doc/postgresql15/README.rpm-dist for more information. июн 04 21:10:55 asus systemd[1]: postgresql-15.service: Control process exited, code=exited, status=1/FAILURE июн 04 21:10:55 asus systemd[1]: postgresql-15.service: Failed with result 'exit-code'. июн 04 21:10:55 asus systemd[1]: Failed to start PostgreSQL 15 database server.
а вот код команды который пытаюсь выполнить в пункте 4: https://github.com/David138it/Bash-Scripts/blob/ma.
как можно решить такую проблему? единственное заметил, что отличие от статьи в том что конфигурация файла postgresql находится в другом месте, очевидно из-за того что в статье centos другой версии 6/7/8.
- Вопрос задан 04 июн. 2023
- 676 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 2

Миллиардер, филантроп, патологический лгун
Перенесите на другой диск, а в старом каталоге оставьте симлинк - тогда и перенастраивать ничего не придётся.
Как перенести базу данных PostgreSQL на другой сервер с помощью pgAdmin 4
Всем привет! Сегодня мы рассмотрим процесс переноса базы данных PostgreSQL с одного сервера на другой, например, с компьютера разработчика на production-сервер, при этом мы будем использовать графический инструмент pgAdmin 4.

Исходные данные. Задача
Допустим, мы разрабатываем базу данных в PostgreSQL, при этом мы используем обычный клиентский компьютер под управлением операционной системы Windows 10, где собственно локально и установлен PostgreSQL.
В качестве инструмента разработки мы используем стандартное графическое приложение pgAdmin 4.
pgAdmin 4 – это стандартный и бесплатный графический инструмент для разработки баз данных в PostgreSQL, который можно использовать для написания SQL запросов, разработки процедур, функций, а также для выполнения базовых задач администрирования баз данных.
В итоге базу данных мы разработали, протестировали ее, внесли в нее необходимые данные, заполнили справочники, в общем, база данных готова.
Теперь у нас возникла необходимость перенести эту базу данных на реальный сервер, который и будет выступать в качестве сервера баз данных. И так как мы используем PostgreSQL, в качестве такого сервера баз данных обычно выступает сервер под управлением операционной системы Linux.
Таким образом, нам необходимо перенести базу данных PostgreSQL, разработанную в Windows, в базу данных PostgreSQL на Linux. В моем случае в качестве операционной системы Linux будет выступать дистрибутив Debian.
Создание дампа базы данных PostgreSQL в pgAdmin 4
Весь процесс переноса базы данных PostgreSQL достаточно простой, суть в следующем.
Нам необходимо создать копию нашей базы данных (дамп), затем создать пустую базу на нужном нам сервере и восстановить все данные, используя созданный ранее дамп.
Все это можно сделать с нашего клиентского компьютера, используя pgAdmin 4, если, конечно же, целевой сервер нам доступен, если недоступен, то придётся каким-то другим образом переносить дамп базы данных на нужный сервер и, используя стандартные консольные утилиты, восстановить базу данных из дампа.
Кстати, стоит отметить, что pgAdmin 4 для экспорта/импорта баз данных использует как раз эти стандартные консольные утилиты, в частности pg_dump, pg_dumpall и pg_restore, которые по умолчанию входят в состав PostgreSQL.
pg_dump – утилита для экспорта баз данных PostgreSQL
pg_dumpall – утилита для экспорта кластера баз данных PostgreSQL (всех данных на сервере)
pg_restore – утилита восстановления баз данных PostgreSQL из файла архива
Таким образом, благодаря pgAdmin 4 нам не нужно писать и выполнять команды в командной строке, за нас все это делает pgAdmin 4, мы всего лишь будем пользоваться мышкой, настраивая все параметры в графическом интерфейсе.
Создать дамп базы данных PostgreSQL можно в нескольких форматах, в частности:
Специальный (Custom) – это пользовательский формат, который использует сжатие. Данный формат по умолчанию предлагается в pgAdmin 4 и рекомендован для средних и больших баз данных. Обычно архивные файлы в таком формате создают с расширением backup, однако можно использовать и другое расширение.
Tar (tar) – база данных выгружается в формат tar. Данный формат не поддерживает сжатие.
Простой (plain) – в данном случае база данных выгружается в обычный текстовый SQL-скрипт, в котором все объекты базы данных и непосредственно сами данные будут в виде соответствующих SQL инструкций. Данный скрипт можно легко отредактировать в любом текстовом редакторе и выполнить, используя Query Tool, как обычные SQL запросы. Данный формат рекомендован для небольших баз данных, а также для тех случаев, когда требуется внести изменения в дамп базы данных перед восстановлением.
Каталог (directory) – этот формат файла создает каталог, в котором для каждой таблицы и большого объекта будут созданы отдельные файлы, а также файл оглавления в машиночитаемом формате, понятном для утилиты pg_restore. Этот формат по умолчанию использует сжатие, а также поддерживает работу в несколько потоков.
В данном материале мы рассмотрим создание дампа в специальном формате, а также в формате обычного SQL скрипта, дело в том, что процесс восстановления базы данных из этих форматов в pgAdmin 4 немного отличается.
Создание дампа базы данных в сжатом формате
Чтобы создать дамп базы данных PostgreSQL в pgAdmin 4, необходимо в обозревателе выбрать нужную базу данных, я выбираю базу данных shop, далее необходимо вызвать контекстное меню правой кнопкой мыши и нажать на пункт «Резервная копия».
Затем всего лишь нужно указать имя архивного файла и путь к каталогу, где его сохранить, для этого можно использовать кнопку с тремя точками.
Формат «Специальный», как было отмечено ранее, предлагается по умолчанию, поэтому выбирать его не требуется.
Как я уже отмечал, обычно архив в таком формате создают с расширением backup, я так и поступаю, т.е. архив назову shop.backup и сохраню его в каталоге D:\PostgreSQL_Backup\.
В случае необходимости задать определенный уровень сжатия можно с помощью параметра «Коэффициент сжатия», поддерживаются значения от 0 до 9, где 0 – вообще не использовать сжатие, а 9 самый высокий уровень сжатия, по умолчанию используется умеренное сжатие.
В нашем случае база данных небольшая, поэтому мы можем оставить все по умолчанию.
Больше никаких настроек в нашем случае делать нет необходимости, и мы можем нажать на кнопку «Резервная копия», чтобы запустить процесс создания дампа базы данных.
Когда появится сообщение «Успешно завершено», значит, процесс создания дампа базы данных PostgreSQL завершен успешно, в противном случае Вы будете получать сообщения о неуспешном завершении.

Создание дампа базы данных в простом формате SQL
В данном случае нам необходимо сделать практически все то же самое, только нужно выбрать формат «Простой» и дополнительно включить пару параметров, чтобы добавление данных осуществлялось с помощью обычных инструкций INSERT, а не с помощью команды COPY, которая используется по умолчанию.
Для этого переходим на вкладку «Параметры выгрузки» и включаем два параметра «Использовать команды INSERT» и «INSERT с указанием столбцов», хотя данный параметр можно и не указывать.
Заметка! Начинающим программистам рекомендую почитать мою книгу «SQL код», которая поможет Вам изучить язык SQL как стандарт, в ней рассматриваются все базовые конструкции языка SQL, приводится много примеров и скриншотов.
Импорт дампа базы данных PostgreSQL в pgAdmin 4
Дамп готов, теперь можно переходить к восстановлению базы данных из этого дампа. Однако перед тем как приступать к импорту, необходимо создать пустую базу данных, в которую собственно и импортировать все данные, как это делается, я подробно рассказывал в отдельном материале.
Все действия по созданию базы данных и восстановлению данных этой базы из архивной копии мы будем делать все на том же компьютере с помощью того же pgAdmin 4, только для этого необходимо подключиться к нужному нам серверу (пункт контекстного меню «Создать сервер» и ввести настройки для подключения, подробнее, как это делается, я рассказывал в той же статье, которая посвящена установке PostgreSQL на Debian).
Импорт сжатого дампа базы данных
Чтобы импортировать базу данных, дамп который был создан в «специальном» формате, необходимо на целевом сервере выбрать базу данных, которую требуется восстановить из дампа (мы ее предварительно создали), в контекстном меню выбрать пункт «Восстановить», затем в пункте «Имя файла», используя кнопку с тремя точками, указать файл дампа, который мы создали чуть ранее с расширением backup.
Больше никаких настроек вводить не требуется, нужный формат выбран по умолчанию, мы можем сразу нажимать кнопку «Восстановить».
Когда появится сообщение «Успешно завершено», процесс будет завершен.

В результате все данные будут восстановлены из дампа, и таким образом мы перенесли базу данных PostgreSQL на новый сервер.
Импорт дампа базы данных в формате SQL
В случае с простым форматом, т.е. с обычными SQL инструкциями, использовать отдельный функционал для восстановления не получится, поэтому мы можем просто выполнить SQL скрипт, который содержится в этом файле.
Для этого открываем Query Tool (запросник) в контексте нужной нам базы данных, затем используя кнопку «Открыть файл» выбираем наш дамп в формате SQL и нажимаем кнопку «Выполнить».
Если инструкция выполнится без ошибок, значит, все хорошо.
Примечание! Если Вы уже восстановили базу данных предыдущим способом, то, чтобы использовать этот способ, необходимо пересоздать базу данных, иначе возникнет конфликт и, соответственно, ошибка, так как все объекты в базе уже будут существовать.
В итоге мы перенесли базу данных PostgreSQL с одного сервера, который управляется операционной системой Windows, на другой, который управляется Linux, хотя это, как Вы понимаете, в нашем случае было не так принципиально.
Стоит отметить, что если требуется перенести базу данных, размер которой достаточно большой, например, несколько десятков или сотен гигабайт, то лучше напрямую использовать консольные утилиты pg_dump или pg_dumpall, т.е. без графического интерфейса pgAdmin 4.
Видео – Перенос базы данных PostgreSQL на другой сервер с помощью pgAdmin 4
На сегодня это все, надеюсь, материал был Вам полезен, пока!
Перенос базы данных PostgreSQL на новый жесткий диск
Как мне перенести базу данных PostgreSQL на новый жесткий диск?
Если у Вас PostgreSQL установлен на системном диске C, но вы хотите переместить базы данных на другой раздел или внешний жесткий диск, т.к на диске C мало места, это может быть сделано без переустановки PostgreSQL.
Первым делом, остановите службу PostgreSQL на время переноса.
Windows XP
Пуск > Панель Управления> Администрирование > Службы
Windows Vista/W7
Пуск > Поиск > Службы
Вам нужно, чтобы открылось такое окно:

Щелкните правой кнопкой мыши по службе PostgreSQL и выберите в меню «Стоп» для остановки службы.
Затем создайте на том диске куда вы хотите перенести базу папку Program Files в ней PostgreSQL и в ней data. Должен получиться путь I:/Program Files/PostgreSQL/data
Далее скопируйте или переместите все данные из первоначальной папки c:/program files/PostgreSQL/8.3/data в новую созданную Вами I:/Program Files/PostgreSQL/data. Это может занять много времени.
Редактирование реестра:
Теперь мы должны указать PostgreSQL новую папку расположения данных, а для этого нам нужно внести изменения в реестр
Windows XP
Перейдите Пуск > Выполнить и в текстовом поле наберите команду regedit, нажмите enter, должно открыться следующее окно:
Windows Vista/W7
Перейдите Пуск> Все программы>Стандартные > Выполнить и в текстовом поле наберите команду regedit, нажмите enter, должно открыться следующее окно:

В левой панели откройте папку : HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/pgsql-8.3, см. картинку ниже:

На картинке красной линией обведен ключ, который нужно изменить. Щелкните правой кнопкой мыши по имени ключа и выберите «Изменить», откроется окно со значением ключа:
«C:/Program Files/PostgreSQL/8.3/bin/pg_ctl.exe» runservice -w -N «pgsql-8.3» -D «C:/Program Files/PostgreSQL/8.3/data/»
Теперь Вам нужно изменить только часть, выделенную жирным шрифтом. Вы переместили базу и должны указать PostgreSQL новый путь, именно он и выделен. Нельзя допустить ошибку в пути, поэтому можно сделать так: открыть в проводнике нашу папку /data и кликнуть правой кнопкой мыши по любому файлу и выбрать Свойства, откроется такое окно:

В строке «Размещение» будет написан полный путь к папке, который нужно выделить и скопировать. И после этого вставить его вместо выделенной части ключа в реестре. Старый ключ выглядел так:
«C:/Program Files/PostgreSQL/8.3/bin/pg_ctl.exe» runservice -w -N «pgsql-8.3» -D «C:/Program Files/PostgreSQL/8.3/data/»
Должно получиться так:
«C:/Program Files/PostgreSQL/8.3/bin/pg_ctl.exe» runservice -w -N «pgsql-8.3» -D «I:/Program Files/PostgreSQL/8.3/data/»
Это все. Закройте все окна и перезагрузите компьютер.
Если перенесенная база данных работает нормально можно удалить исходную папку /data на диске C, если Вы не сделали этого раньше.