Обновить

Работа с файлами в СУБД PostgreSQL и Postgres Pro Enterprise: барьеры и варианты их преодоления

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели9.2K
Всего голосов 14: ↑14 и ↓0+18
Комментарии8

Комментарии 8

Примечание: поскольку pg_largeobject — системная таблица, ее нельзя секционировать.

Это не страшно. Другое дело, что содержимое системных таблиц попадает в дамп при использовании ключика -s|--schema-only. Т.е. при создании дампа для обновления мажорной версии ПГ. Соответственно, когда у вас в pg_largeobject приличный объём, обновление будет отнюдь не быстрым. Мне коллеги подкидывали ситуацию, когда время обновления 100 Гб экземпляра с непустой pg_largeobject было более 10 часов.
PS. Я сам не проверял, но по логам обновления дело было именно в pg_largeobject. И это было пару-тройку лет назад. Рекомендую проверить, как оно сейчас.

1.Как обеспечивается репликация, когда хранение файлов осуществляется в базе данных. Как это влияет на производительность?

2. СУБД работает с файлами на сервере, как загрузить файл в базу данных с клиентской машины?

1.Как обеспечивается репликация, когда хранение файлов осуществляется в базе данных. Как это влияет на производительность?

Для типа BFILE (внешний файл) реплицируются только значения BFILE, т.е., по сути дела, это путь к файлу и имя файла. Решение проблемы репликации самих внешних файлов, а также того, чтобы на реплике пути к внешним файлам соответствовал путям к внешним файлам на основном сервере, возложена на пользователя.


Значения типа SFILE целиком хранятся в БД и реплицируются обычным образом, как и другие значения БД. Естественно, при больших объемах файлов это плохо влияет на производительность. Если для пользователя критична производительность при репликации, то следует использовать BFILE (т.е. ссылки на файлы) и обеспечивать репликацию самих файлов самостоятельно.

2. СУБД работает с файлами на сервере, как загрузить файл в базу данных с клиентской машины?

Для типа BFILE файл загружается на сервер средствами пользователя. СУБД "узнаёт" об этом файле только в момент создания значения BFILE (т.е. ссылки на внешний файл).


Для типа SFILE файлы можно загрузить либо с помощью серверных, либо с помощью клиентских функций. Подробности лучше посмотреть в документации:

https://postgrespro.ru/docs/enterprise/current/pgpro-sfile

А можете привести примеры кейсов, когда файлы нужно именно в базе хранить? На больших проектах и так почти все проблемы с производительностью связаны с работой базы, а тут еще файлы в нее писать. Потом еще мучаться с бекапированием и обновлением. Когда есть куча других вариантов, тот же s3.

В моей голове хранение файлов в базе - это моветон.

Работая в прошлом в банке с АБС на oracle был кейс что в бд хранились файлы с образцами подписей клиентов. Файлы занимают сущие копейки и хранить их в бд кажется логичным, тем более оракл это умел.

Согласен с тем, что хранить большие файлы в БД — плохая идея. Но некоторые пользователи так делают, это факт. Достаточно часто спрашивают об этом при переходе на Postgres с Oracle, где есть возможность хранить файлы в БД.

Большое спасибо за материал. Добавлю с чем мы столкнулись ещё.

Мало того, что в text и bytea нельзя положить больше 1Гб, но если вы положите строку меньше 1Гб но больше 0.5 Гб, например 600 Мб, то извлечь ее через SELECT нельзя. Только через copy. Как объяснили в поддержке, это особенность libpq. Было ли у вас такое?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Информация

Сайт
www.postgrespro.ru
Дата регистрации
Дата основания
Численность
501–1 000 человек
Местоположение
Россия
Представитель
Иван Панченко