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

Как переместить базу postgresql на другой диск

  • автор:

Как перенести базу 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 на другой диск

Перенос базы 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'

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

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