Здравствуйте!
Подскажите, может кто-нибудь сталкивался: при попытке сделать бэкап базы получаем ошибку
pg_basebackup: could not read COPY data: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
База PostgreSQL 9.6 на Centos 7 (64-bit), размер - 78 Gb. Бэкап делаем командами
pg_dump -U postgres base > /var/lib/pgsql/9.6/backups/base.sql
На этом же сервере есть другая база, pg_dump для которой проходит без проблем. Эта база размером примерно 10 Gb
Я предполагаю, что сервер Postgres рестартует из-за OOM killer. Но как это подтвердить или исправить не знаю (знаний в Linux не много). Подскажите, что с этим можно делать и куда посмотреть?
И ещё, старый админ сервера каким-то образом сделал перезапуск службы сервера postgresql после падения. Новый админ не знает как его остановить. Я смотрел
systemctl edit postgresql-9.6
, но там пусто. Crontab -e под пользователями тоже пустые. Из-за чего это может происходить?
Похоже, что так и есть. Можно попробовать развернуть последнюю 11-ю редакцию PostgresSQL, может быть есть улучшения, а также увеличить размер памяти, или свопа на ssd, хотя бы.
В таблице _document474 есть поле, в котором размер данных(обычно это бинарная строка типа bytea) превышает 500 МБ. Это давняя особенность pg_dump.
Здесь и здесь есть более подробные описания данной проблемы.
Для решения можно воспользоваться утилитами pg_dumpbinary/pg_restorebinary.
Посмотреть в /var/log/messages что пишется по этому поводу. Возможно, процесс postgres, выполняющий выборку данных для pg_basebackup, забирает всю имеющуюся физическую память и убивается.
Похоже, что так и есть. Можно попробовать развернуть последнюю 11-ю редакцию PostgresSQL, может быть есть улучшения, а также увеличить размер памяти, или свопа на ssd, хотя бы.
(3)Спасибо большое за ответ, проверили, swop по htop во время бэкапа практически не задействован, используется только 4 Mb из 7,87 Gb
В /var/log/messages пишет
Oct 5 16:13:05 1c-server systemd: Created slice User Slice of root.
Oct 5 16:13:05 1c-server systemd: Started Session 113 of user root.
Oct 5 16:13:05 1c-server systemd-logind: New session 113 of user root.
Oct 5 16:13:06 1c-server systemd-logind: New session 114 of user root.
Oct 5 16:13:06 1c-server systemd: Started Session 114 of user root.
Oct 5 16:16:20 1c-server monit: 'postgres' failed protocol test [PGSQL] at /var/run/postgresql/.s.PGSQL.5432 -- PGSQL: connection terminator write error -- Broken pipe
Oct 5 16:16:20 1c-server monit: 'postgres' trying to restart
Oct 5 16:16:20 1c-server monit: 'postgres' stop: '/usr/sbin/service postgresql-9.6 stop'
Oct 5 16:16:20 1c-server systemd: Stopping PostgreSQL 9.6 database server...
Oct 5 16:16:21 1c-server systemd: Stopped PostgreSQL 9.6 database server.
Oct 5 16:16:21 1c-server monit: 'postgres' start: '/usr/sbin/service postgresql-9.6 start'
Oct 5 16:16:21 1c-server systemd: Starting PostgreSQL 9.6 database server...
Oct 5 16:16:21 1c-server postmaster: LOG: redirecting log output to logging collector process
Oct 5 16:16:21 1c-server postmaster: HINT: Future log output will appear in directory "pg_log".
Oct 5 16:16:21 1c-server systemd: Started PostgreSQL 9.6 database server.
Oct 5 16:16:52 1c-server monit: 'postgres' connection succeeded to /var/run/postgresql/.s.PGSQL.5432
Показать
Как я понимаю ошибка именно в строке 'postgres' failed protocol test [PGSQL] at /var/run/postgresql/.s.PGSQL.5432 -- PGSQL: connection terminator write error -- Broken pipe
Пока пытались разобраться, обнаружили ещё одну ошибку во время pg_dump:
Error message from server: ERROR: invalid memory alloc request size 1590249045
pg_dump: The command was: COPY public._document474
но размер этой таблицы всего 140 Мб если верить запросу SELECT pg_size_pretty( pg_total_relation_size( '_document474' ) );
Самое главное, мы не можем остановить сервис postgres, что-то его постоянно перезапускает, из-за этого не можем попробовать обновить его или перенести на другой сервер
(6) и (3) Спасибо, всё получилось.
Пришлось обновить сервер до 12 с помощью pg_upgrade и очистить 2 поля в _document474. Pg_admin показывал, что размер этих полей 45 Mb, однако, селектом не мог их показать. И в базе эти отчеты не открывались
После обновления всё заработало.
В таблице _document474 есть поле, в котором размер данных(обычно это бинарная строка типа bytea) превышает 500 МБ. Это давняя особенность pg_dump.
Здесь и здесь есть более подробные описания данной проблемы.
Для решения можно воспользоваться утилитами pg_dumpbinary/pg_restorebinary.