PostgreSQL "кортеж уже обновлен сам"
Наша база данных, кажется, сломана, обычно она использует около 1-2% процессора, но если мы запустим некоторые дополнительные бэкэнд-услуги, которые делают запросы UPDATE и INSERT для таблицы строк 10M (около 1 запроса за 3 секунды), все идет в ад (в том числе CPU увеличивается с 2% до 98% использования).
Мы решили отладить, что происходит, запустите VACUUM и ANALYZE, чтобы узнать, что неправильно с db, но...
production=# ANALYZE VERBOSE users_user;
INFO: analyzing "public.users_user"
INFO: "users_user": scanned 280 of 280 pages, containing 23889 live rows and 57 dead rows; 23889 rows in sample, 23889 estimated total rows
INFO: analyzing "public.users_user"
INFO: "users_user": scanned 280 of 280 pages, containing 23889 live rows and 57 dead rows; 23889 rows in sample, 23889 estimated total rows
ERROR: tuple already updated by self
мы не можем завершить ANALYZE на ЛЮБОЙ из таблиц и не смогли найти никакой информации об этой проблеме. Любые предложения, что может быть неправильным?
PostgreSQL 9.6.8 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit
Дополнительная информация по запросу:
Возможно, у вас поврежден pg_class
SELECT * FROM pg_class WHERE relname = 'users_user';
Выход: https://pastebin.com/WhmkH34U
Итак, первое, что нужно сделать, - выгнать все остальные сеансы и попробовать снова
Нет дополнительных сеансов, мы сбросили всю БД на новый сервер тестирования, проблема все еще возникает, нет клиентов, подключенных к этой БД
Ответы
Ответ 1
Я бы порекомендовал вам запустить сервер со следующими параметрами перед поиском дублированных строк:
enable_indexscan = off
enable_bitmapscan = off
ignore_system_indexes = on
Если ваш сервер вышел из строя, индексы могут находиться в другом состоянии табличных данных. Это происходит, например, когда повреждение влияет на видимость транзакции (pg_clog
). Затем найдите дублированную строку в pg_class
или pg_statistic
как указано в комментариях.
Вы также можете попытаться очистить pg_statistic
. Сначала запустите сервер с:
allow_system_table_mods = on
А затем выпустите TRUNCATE TABLE
и ANALYZE
после этого:
--Cleaning pg_statistic
TRUNCATE TABLE pg_catalog.pg_statistic;
--Analyze entire database
ANALYZE VERBOSE;
Если проблема в pg_statistic, этого должно быть достаточно.