1

Раньше сегодня я пытался восстановить базу данных PostgreSQL (8.1.22) из ​​производства, используя pgAdmin III. Однако, после того, как процедура восстановления завершена, он начал бросать ошибки как:Ошибка «неверная последовательность байтов» при восстановлении базы данных PostgreSQL

WARNING: errors ignored on restore: 4 

Кроме того, при исследовании я обнаружил, что из всех таблиц не были восстановлены 3 таблицы (содержали 0 строк). Когда я проверил журнал, я обнаружил ошибку происходит некорректно около 3-х таблиц:

pg_restore: [archiver (db)] Error from TOC entry 5390; 0 442375 TABLE DATA tablename postgres 
pg_restore: [archiver (db)] COPY failed: ERROR: invalid byte sequence for encoding "UTF8": 0xea0942 
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". 
CONTEXT: COPY tablename , line 7875 

Я пытался исследовать мою проблему на Google, но это не дало никаких результатов. Просьба помочь в восстановлении этих трех таблиц без каких-либо ошибок.

ответ

11

Старые версии PostgreSQL не были такими строгими в соответствии с UTF-8, что и более новые версии. Предположительно вы пытаетесь восстановить данные, содержащие недопустимый UTF-8 с такой более старой версии, в более новую версию.

Неверные строки должны быть очищены. Вы можете следовать этой процедуре для каждой таблицы, которые не были импортированы из-за этих ошибок:

  1. Извлечь содержимое таблицы из файла дампа в SQL обычный текстовый файл:

    pg_restore --table=tablename --data-only dumpfile >plaintext.sql 
    
  2. Удалите недопустимые символы в текстовом редакторе или автоматически с iconv:

    iconv -c -f UTF-8 -t UTF-8 <plaintext.sql >plaintext-cleaned.sql 
    
  3. Импортируйте продезинфицировать данные:

    psql dbname < plaintext-cleaned.sql