powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / работа с pg_toast
3 сообщений из 3, страница 1 из 1
работа с pg_toast
    #39048626
D0KX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.

Есть задача по миграции на более новую версию PostgreSQL, но при дампе возникают ошибки ссылающиеся на pg_toast_NNNN, в одной таблице, в которой хранятся бинарные данные (bytea).
Для быстрого выхода из ситуации решил ненужные строки из этой таблицы удалить, но даже удаление приводило к ошибке.
Тогда в ненужных строках я заменил update'ом бинарники на что-то типа 'a22' и после этого эти строки легко удалились, но дамп так и не проходит, так как огромный файл есть и в нужных мне строках, но в какой именно неизвестно.
Стал искать в information_schema где же хранятся эти toast-данные, но там так и не нашел.
При vacuum'ации таблицы обратил внимание как Postgres выводит сообщение про этот toast (pg_toast.pg_toast_NNNN), сделал выборку по этому имени таблицы и о чудо, данные появились, теперь я могу заменить/очистить их тут (конечно это потеря файла, но что-то мне подсказывает, что его искать никто не будет :), другого пока выхода не вижу, так как мигрировать надо будет уже скоро).
Так же посмотрел и другие toast таблицы которые упоминались при vacuum'ации, строк в них было до 50, а вот в "проблемной" 311 тысяч строк. И вот теперь мне очень хочется найти эту запись в исходной таблице, чтобы понять кто его записал и что у него за название.

Отсюда вопрос, как в Postgres'е найти связку: строка&toast если знаем таблицу в которой надо искать и pg_toast_NNNN
Ну и так как замена данных это совсем уж грубое решение, может кто подскажет как дампить такие огромные (хотя точный размер пока и не знаю) данные?
...
Рейтинг: 0 / 0
работа с pg_toast
    #39049237
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начну с конца - дампить - как обычно. Несколько терабайт нормально дампятся.
Ваша проблема в отказе оборудования с вероятностью 95% (не записалось, диски подыхают, память битая, что угодно) во время занесения этой информации в базу и возложения МПХ на логи (вопрос в профнепригодности админа, если он вообще был).

Теперь ваш основной вопрос... Вообще справка рулит. Вас интересует вот эта страница: http://www.postgresql.org/docs/9.4/static/catalog-pg-class.html

Если грубо, то вам надо что-то типа:
Код: sql
1.
2.
3.
SELECT s.relname FROM pg_class s
LEFT JOIN pg_class t ON t.reltoastrelid = s.oid
WHERE c.relname = 'pg_toast_NNNN'
...
Рейтинг: 0 / 0
работа с pg_toast
    #39049263
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D0KXВсем привет.

Есть задача по миграции на более новую версию PostgreSQL, но при дампе возникают ошибки ссылающиеся на pg_toast_NNNN, в одной таблице, в которой хранятся бинарные данные (bytea).
Для быстрого выхода из ситуации решил ненужные строки из этой таблицы удалить, но даже удаление приводило к ошибке.
Тогда в ненужных строках я заменил update'ом бинарники на что-то типа 'a22' и после этого эти строки легко удалились, но дамп так и не проходит, так как огромный файл есть и в нужных мне строках, но в какой именно неизвестно.
Стал искать в information_schema где же хранятся эти toast-данные, но там так и не нашел.
При vacuum'ации таблицы обратил внимание как Postgres выводит сообщение про этот toast (pg_toast.pg_toast_NNNN), сделал выборку по этому имени таблицы и о чудо, данные появились, теперь я могу заменить/очистить их тут (конечно это потеря файла, но что-то мне подсказывает, что его искать никто не будет :), другого пока выхода не вижу, так как мигрировать надо будет уже скоро).
Так же посмотрел и другие toast таблицы которые упоминались при vacuum'ации, строк в них было до 50, а вот в "проблемной" 311 тысяч строк. И вот теперь мне очень хочется найти эту запись в исходной таблице, чтобы понять кто его записал и что у него за название.

Отсюда вопрос, как в Postgres'е найти связку: строка&toast если знаем таблицу в которой надо искать и pg_toast_NNNN
Ну и так как замена данных это совсем уж грубое решение, может кто подскажет как дампить такие огромные (хотя точный размер пока и не знаю) данные?

1)См тут все разобрано http://www.databasesoup.com/2013/10/de-corrupting-toast-tables.html
2)А какая версия Postgres у вас и когда последний раз вы ее обновляли?
3)Правильно ли я понимаю что Backups через pg_dump вообще никогда не делались на базе?

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / работа с pg_toast
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]