Как перенести базу postgresql на другой диск?
переношу базу postgresql 15 версии в centos 9 на другой диск по данной статье https://www.digitalocean.com/community/tutorials/how-to-move-a-postgresql-data-directory-to-a-new-location-on-ubuntu-22-04#step-3-restarting-postgresql . Пытаюсь сделать все скриптом. Остановился на запуске службы 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.
Как переместить базу postgresql на другой диск
PostgreSQL 9.6 в Windows Server 2008 — понадобилось перенести базу на другой диск.
Нашел инструкции по переносу, все очень просто — останови службу PG, поправь путь в реестре, скопируй базу, запусти службу.
Одна проблема — у меня служба PG уже ОСТАНОВЛЕНА — а пользователи спокойно работают с базой данных, и не замечают этого.
Что я делаю не так, и что тогда надо останавливать?
Есть другой способ остановить PG ?
Потому что папка с базой данных явно кем-то открыта на запись, да и PGAdmin показывает, что PG — работает. (а служба PG — остановлена, это вообще как . )
Перенос базы 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=#
Если всё ок, можно удалить старую базу, чтобы освободить место в корне.
Если вам нравятся мои посты, то подписывайтесь также:
forum.lissyara.su
Добрым словом и кулаком, добьёшься больше чем одним добрым словом.
PostgreSQL перенос БД на другой диск
MySQL/PostgreSQL/SQLite/Oracle/M$SQL/.
Модератор: terminus
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Первое новое сообщение • 7 сообщений • Страница 1 из 1
kharkov_max капитан Сообщения: 1861 Зарегистрирован: 2008-10-03 14:56:40
PostgreSQL перенос БД на другой диск
Имеется мониторинг zabbix, БД postgresql разрослась до больших размеров.
Собственно механизмами zabbix Housekeeper и postgresql vacuumdb база была уменьшена, установлены меньшие периоды храниния данных и т.д. и т.п
http://www.umgum.com/zabbix-housekeeper . sql-vacuum
Но вот остался вопрос.
Возможно ли на postgreSQL не перенося все БД перенести только одну БД postgresql на другой диск?
Т.е. подключаем дополнительный диск и "как то" переносим на него только 1 базу, не меняя месторасположения других БД postgresql.
kharkov_max
Хостинг HostFood.ru
Услуги хостинговой компании Host-Food.ru
Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
mak_v_ проходил мимо
Re: PostgreSQL перенос БД на другой диск
Непрочитанное сообщение mak_v_ » 2014-07-31 12:22:39
А в чем собственно проблема?
Деатач базы, перенос файла БД, атач базы. вуаля.
mak_v_
PYO сержант Сообщения: 185 Зарегистрирован: 2011-08-18 12:46:45
Re: PostgreSQL перенос БД на другой диск
Нет. Вариант:
- создать на другом диске кластер бд
- перенести туда базу заббикс
- запустить второй постгрес, естественно используя другой порт тцп.
mak_v_ проходил мимо
Re: PostgreSQL перенос БД на другой диск
Непрочитанное сообщение mak_v_ » 2014-08-02 21:50:32
ну если ТСу нужно "онлайн" - реплика RO решит
mak_v_
PYO сержант Сообщения: 185 Зарегистрирован: 2011-08-18 12:46:45
Re: PostgreSQL перенос БД на другой диск
Да, бардак на Украине.
BlitzKrieg ст. прапорщик Сообщения: 538 Зарегистрирован: 2008-03-13 12:02:59
Re: PostgreSQL перенос БД на другой диск
kharkov_max писал(а): День добрый.
Имеется мониторинг zabbix, БД postgresql разрослась до больших размеров.
Собственно механизмами zabbix Housekeeper и postgresql vacuumdb база была уменьшена, установлены меньшие периоды храниния данных и т.д. и т.п
http://www.umgum.com/zabbix-housekeeper . sql-vacuum
Но вот остался вопрос.
Возможно ли на postgreSQL не перенося все БД перенести только одну БД postgresql на другой диск?
Т.е. подключаем дополнительный диск и "как то" переносим на него только 1 базу, не меняя месторасположения других БД postgresql.
Помнится что vacuum просто помечает мусор как свободное место, а есть там еще vacuum analyze или типа того. При выполнении лочит базу, бикерфул. Это 9.3 так.
BlitzKrieg
FiL ст. лейтенант Сообщения: 1374 Зарегистрирован: 2010-02-05 0:21:40
Re: PostgreSQL перенос БД на другой диск
kharkov_max писал(а): День добрый.
Имеется мониторинг zabbix, БД postgresql разрослась до больших размеров.
Собственно механизмами zabbix Housekeeper и postgresql vacuumdb база была уменьшена, установлены меньшие периоды храниния данных и т.д. и т.п
http://www.umgum.com/zabbix-housekeeper . sql-vacuum
Но вот остался вопрос.
Возможно ли на postgreSQL не перенося все БД перенести только одну БД postgresql на другой диск?
Т.е. подключаем дополнительный диск и "как то" переносим на него только 1 базу, не меняя месторасположения других БД postgresql.
Если вкратце, то
CREATE TABLESPACE 'new_tablespace' LOCATION 'directory' ALTER DATABASE 'database_name' SET default_tablespace = 'new_tablespace';
A дальше для всех таблиц из этой базы
ALTER TABLE "table_name" SET TABLESPACE "new_tablespace"; ALTER INDEX "index_name" SET TABLESPACE "new_tablespace";
Получить список всех таблиц можно из pg_tables where schemaname='database_name'