TGViewer
Антон Дорошкевич | маяк в мире 1С и СУБД Антон Дорошкевич | маяк в мире 1С и СУБД @explorer1c · 2.02K subscribers
Post #12 2.04K
🔤🔤🔤 PostgreSQL, symlink, неожиданность с репликацией и бэкапами

Есть довольная распространённая практика переноса каталога Журнала предзаписи транзакций (WAL) на другой диск, что даже рекомендуется разработчиками Postgres и звучит эта рекомендация так:
Имеет смысл размещать WAL на другом диске, отличном от того, где находятся основные файлы базы данных. Для этого можно переместить каталог pg_wal в другое место (разумеется, когда сервер остановлен) и создать символическую ссылку из исходного места на перемещённый каталог.

И тут всё хорошо. Действительно в Postgres нет настройки расположения каталога pg_wal и его перенос решается через создание символической ссылки на каталог (symlink).

По всей видимости лёгкость, понятность и распространённость такого подхода повлияла на то что Администраторы СУБД либо Системные администраторы помимо каталога pg_wal так же этим способом переносят и другие каталоги Postgres.

А тут нас ждёт очень интересная проблема...
Дело в том, что утилита pg_basebackup с помощью которой создаются резервные копии кластера PostgreSQL и реплики (для них создание резервной копии кластера это первый шаг создания) не учитывает символические ссылки.

Что в итоге мы можем получить:
Допустим что установили Postgres и он по умолчанию создал каталог с базой данный в /var/lib/postgres/data.
Далее мы создали в нём базу ERP (пока пустую) её OID пусть будет 358924. Соответсвенно все данные этой базы будут у нас располагаться в каталоге /var/lib/postgres/data/base/358924

Заранее зная что база будет большой, админы выделили место под базу в каталоге /data, а место под wal в каталоге /wal_data
Опираясь на опыт переноса каталог pg_wal:
▫️Останавливаем postgres
▫️Переносим каталог var/lib/postgres/data/pg_wal в /wal_data/pg_wal
▫️Делаем symlink между этими каталогами

❗️Переносим каталог var/lib/postgres/data/base/358924 в /data/358924 (каталог нашей ERP)
▫️Делаем symlink между этими каталогами

Стартуем postgres - всё работает!!!

Казалось бы, что может пойти не так? 😁

Рассказываю:
Как правильные админы, после создания мастера мы делаем реплику
Утилитой pg_basebackup заливаем данные с мастера на реплику.

Стартуем реплику и тоже всё стартует и работает!!!
И даже когда мы начнём заливать в базу ERP данные - они послушно побегут на реплику, так как передаются посредством трансляции WAL.

Так мы счастливо работаем какое-то время и затем наступает момент когда нам потребовалось сделать резервную копию кластера с мастера:

❗️Мы запускаем pg_basebackup. она выполняется, вот только копия не содержит нашу базу ERP.
Поскольку база на мастере располагается в каталоге с символической ссылкой и вместо данных, утилита в бэкап кластера скопирует просто пустой каталог /358924.
❗️Тоже самое нас ждёт при попытке создать новую реплику.
Она создастся, но вот только без базы ERP.

Как же правильно вынести какую-то базу или несколько баз, а может и все сразу в другое место?

Для этого необходимо использовать Таблиные пространства (tablespace)
Т.е. в нашем сценарии мы должны были сначала создать табличное пространство
CREATE TABLESPACE erp_data LOCATION '/data'

а затем создать базу ERP уже в этом табличном пространстве
CREATE DATABASE ERP WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = erp_data


Если же мы хотим чтобы все базы по умолчанию создавались в нужном нам каталоге, то есть 2 варианта:

1. Заново инициализировать кластер Postgres через Initdb указав в качестве расположения каталог /data
2. Переопределить табличное пространство по умолчанию в конфигурационном файле postgresql.conf переопределив параметр default_tablespace = '/data'

❗️Будьте очень осторожны с символическими ссылками не смотря на то, что это очень удобный и быстрый инструмент!
  • 🔥 34
  • 👍 13
  • ❤ 3
More from @explorer1c
  1. Sep 21, 2026Можно ли сделать поведение PostgreSQL в отношении потребления памяти процессами более жест…
  2. Sep 11, 2026Сегодня ровно год первому сообщению в канале! Огромное спасибо всем вам! Честно - было оче…
  3. Sep 9, 2026Теперь на багборде можно легко и быстро сравнить версии платформы по изменениям! Уверен чт…
  4. Sep 7, 2026Начнём...)
  5. Sep 2, 2026Как собрать для анализа запроса все временные таблицы с их содержимым? Все мы хорошо знаем…
  6. Aug 26, 2026Небольшой анонс поездок и мероприятий с моим участием: 08-10/09 - Обучение по кластеру 1с…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →