PostgreSQL сказал: MultiXactId 1085002 еще не создан — очевидный обход

#postgresql #amazon-aurora

#postgresql #amazon-aurora

Вопрос:

Я получил странную ошибку при записи в свою базу данных Postgres через Aurora PostgreSQL на AWS

PostgreSQL версии 9.6.11

я пытаюсь исправить эту проблему в таблице admin_user

  Vacuum admin_user 
 Vacuum Freeze admin_user
  

Я не смог воссоздать таблицу, поскольку она подключена ко всем другим таблицам и вызовет большой беспорядок

Обновить вопрос

Я не могу получить доступ к таблице

введите описание изображения здесь

Комментарии:

1. Повреждение данных, возможно, вызванное старой ошибкой (вы отстаете на 8 незначительных выпусков), возможно, из-за проблем с оборудованием. Если вы все еще можете прочитать таблицу, выполните pg_dump из базы данных и восстановите ее в новом, нетронутом кластере (надеюсь, в последней младшей версии). Если вы не можете прочитать все строки из таблицы, вы должны зависеть от того, что ваш хостинг-провайдер может сделать для вас.

2. Спасибо, я обновил свой вопрос, чтобы показать, что я не могу получить доступ к таблице, но я попробую pg_dump

3. Meh. Тогда pg_dump (который, в конце концов, также выбирает все данные) также завершится неудачей. Вы зависите от милости вашего хостинг-провайдера. Я постараюсь написать полезный ответ.

Ответ №1:

По причинам, которые мы, вероятно, не можем здесь понять (может быть ошибка программного обеспечения PostgreSQL, которая могла быть исправлена в версии 9.6.19, может быть проблема с оборудованием), вы пострадали от повреждения данных.

Поскольку вы используете размещенную базу данных и не имеете доступа к базе данных, кроме как через SQL, ваши возможности ограничены.

Вероятно, лучше всего использовать подтранзакции для извлечения как можно большего количества данных из таблицы (вызываемой test в этом примере):

 /* will receive salvaged rows */
CREATE TABLE test_copy (LIKE test);
  

Вы можете запустить что-то вроде этого кода:

 DO
$$DECLARE
   c CURSOR FOR SELECT * FROM test;
   r test;
   cnt bigint := 0;
BEGIN
   OPEN c;

   LOOP
      cnt := cnt   1;

      /* block to start a subtransaction for each row */
      BEGIN
         FETCH c INTO r;

         EXIT WHEN NOT FOUND;
      EXCEPTION
         WHEN OTHERS THEN
            /* there was data corruption fetching the row */
            RAISE WARNING 'skipped corrupt data at row number %', cnt;

            NOVE c;

            CONTINUE;
      END;

      /* row is good, salvage it */
      INSERT INTO test_copy VALUES (r.*);
   END LOOP;
END;$$;
  

Удачи.