Comments 10
Занимательно, но где же фикс в ванилу?
ИИ нынче неплохо пишет, но остается вопрос - зачем кому-то 1 Гб строки пихать в реляционную БД?
У нас ПО для информационного моделирования (отечественное, импортозаместились) пишет DWG-файлы в строки БД. А файлы пользователи могут насоздавать огого какие, как выяснилось... Причем записать такое ПО давало, а вот вычитать - уже нет. Обнаружили, когда дамп не создался.
Не проще было бы ссылку на внутреннее s3 хранилище вставлять?
DWG-файлы в строки БД
да сам формат текстовый, но внутри базы данных с ним не работают как со строками же, это просто хранилище как есть, переделать в binary и забыть, а вообще хранить большие файлы в базе данных это сигнал о том что кто то не то делает (да, бывают очень редкие кейсы, где транзакции очень нужны)
1c хранит свою конфигурацию (более 1гб) в одной(!) строке таблицы...
PostgreSQL по умолчанию хранит BLOB/CLOB именно как строки с экранированными спец-символами. Это упрощает хранение, выборки и backup/restore... Когда база мелкая...
Для истинных блобов нужно использовать экстеншн из стандартной поставки.
Когда при бэкапе баз 1с наткнулся на такую ошибку, решил ее именно с использованием copy to
Когда-то давно уже наталкивался на утилиту https://github.com/lzlabs/pg_dumpbinary , мне кажется, она решает ту же самую проблему.
Спасибо за ссылку! В стандартном 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)
Работа с длинными строками в PostgreSQL