Перенос базы PostgreSQL на другой сервер

В процессе перехода с 1С УТ 10 на 1С УТ 11 возникла задача выгрузки данных типовой обработкой перехода, но проблема — текущий сервер слабенький и памяти на эту процедуру не хватало. Также был новый сервер, более мощный для дальнейшей работы на 1С УТ 11. Было решено сперва перенести старую базу на новый сервер и уже оттуда делать выгрузку. На обоих серверах в качестве БД был PostgreSQL.

При загрузки базы возникала ошибка:

pg_restore: restoring data for table «_reference20»
pg_restore: [tar archiver] corrupt tar header found in e388645783b719e153965767e18f4baf4645229302ce9ffa13190 (expected 17, computed 35577) file position 9188850688
pg_restore: *** aborted because of error

 

Было много разных попыток, но ничего не помогало, не буду об этом подробнее, лучше расскажу, что в итоге было сделано.

Посмотрев, что стоит за этой таблицей, где возникала ошибка, стало понятно, что это справочник внешних обработок, очевидно, что его содержимое нам совершенно не нужно для перехода.

Берем полученный pg_dump’ом файл и разархивируем его (например, 7z) в каталог, далее ищем в нем файл restore.sql, по сути это SQL-скрипт, в котором прописано как восстанавливать базу, еще в каталоге есть файлы с расширением dat — в них находится содержимое таблиц.

Нужно открыть restore.sql в текстовом редакторе (лучше использовать Notepad++) и сделать поиск+замену подстроки $$PATH$$ на путь к вашему каталогу, где лежат dat-файлы, например c:/temp/w (последний слэш не нужен). Не забываем сохранить файл.

Теперь нужно очистить dat-файл с данными нашей таблицы, где возникает ошибка. В моем случае у справочника есть еще табличная часть, а значит кроме _reference20 нужно еще почистить и _reference20_vt412. Поиском находим, что это 15523.dat и 15524.dat соответственно. Очистить нужно не буквально, а записать в файл два символа \. (обратный слэш и точка), можно для этого в командной строке использовать

echo \. > XXXX.dat

Находил мнение, что базу 1С для PostgreSQL лучше создавать средствами 1С, не знаю насколько это так, но при танцах с бубнами это может пригодится. Далее в созданную базу будем заливать данные командой psql (вместо pg_restore):

psql.exe —host localhost —port 5432 —username postgres —dbname=w —file=»C:\temp\w\restore.sql»

Ждем окончания процесса, должно получится!