#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;$$;
Удачи.