Pull to refresh

Comments 10

ИИ нынче неплохо пишет, но остается вопрос - зачем кому-то 1 Гб строки пихать в реляционную БД?

У нас ПО для информационного моделирования (отечественное, импортозаместились) пишет DWG-файлы в строки БД. А файлы пользователи могут насоздавать огого какие, как выяснилось... Причем записать такое ПО давало, а вот вычитать - уже нет. Обнаружили, когда дамп не создался.

Не проще было бы ссылку на внутреннее s3 хранилище вставлять?

DWG-файлы в строки БД

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

1c хранит свою конфигурацию (более 1гб) в одной(!) строке таблицы...

PostgreSQL по умолчанию хранит BLOB/CLOB именно как строки с экранированными спец-символами. Это упрощает хранение, выборки и backup/restore... Когда база мелкая...

Для истинных блобов нужно использовать экстеншн из стандартной поставки.

Когда при бэкапе баз 1с наткнулся на такую ошибку, решил ее именно с использованием copy to

Спасибо за ссылку! В стандартном pg_dump нет WITH BINARY, а этот скрипт делает WITH BINARY. Он может помочь в случае, если строка вписывается в 1Гб в бинарном представлении (первый пример из статьи). Второй пример (с двумя столбцами) не выгружает:

postgres=# create database testdb;
\c testdb \\
drop table if exists t;
create table t (c1 text storage external, c2 text storage external);
insert into t (c1) VALUES (repeat('a', 1024*1024*512));
update t set c2 = c1;
CREATE DATABASE
You are now connected to database "testdb" as user "postgres".
DROP TABLE
CREATE TABLE
INSERT 0 1
UPDATE 1
testdb=# \q
postgres@test:~$ pg_dumpbinary -d testdb -t t aa
Database testdb dump created at 2025-06-02T21:23:17
Dumping pre data section at 2025-06-02T21:23:17
Dumping data at 2025-06-02T21:23:18
psql:/tmp/pg_dumpbinUrYI.tmp:18: ERROR:  out of memory
DETAIL:  Cannot enlarge string buffer containing 536870941 bytes by 536870912 more bytes.
ERROR running command: psql  -p 5432 -v ON_ERROR_STOP=1 -d testdb -f /tmp/pg_dumpbinUrYI.tmp
An error occurs from a child process, aborting...
^CReceived terminating signal (INT)
Received terminating signal (INT)
Sign up to leave a comment.