Имя: Пароль:
IT
Админ
PostgreSQL 9.4 - ошибка при выполнении pg_dump -- ftell used
0 2dolist
 
19.10.17
10:20
Добрый день. При выполнении pg_dump.exe начала возникать ошибка:
pg_dump: [cumsom archiver] WARNING: ftell mismatch with expected position -- ftell used.

Архивы выполняются вызовом батника с кодом:
cd "путь к pg_dump.exe"
.\pg_dump.exe -Fc -h АдресСервера -U юзер постгреса -c ut11_3test > АдресДляДампа

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

При попытке восстановить файл дампа через pg_restore.exe выдаётся ошибка:
pg_restore: [archiver] input file does not appear to be a valid archive

Всё, что нашёл по ошибке ftell это то, что проблема возникала на 8-й версии и советуют обновиться до 9. У нас 9.4 и до недавнего времени всё работало.
1 novichok79
 
19.10.17
10:27
может быть обновить postgre до 9.6? в своих логах постгри чего-нибудь пишет?
2 novichok79
 
19.10.17
10:31
еще пишут что если в команде используется pipe notation (очевидно вертикальная палка), то ошибка появляется на Windows, в Linux'ах все норм.
3 2dolist
 
19.10.17
10:35
ошибок в логах по этому поводу нет. pipe notation-ов тоже не используем
4 novichok79
 
19.10.17
10:36
а если вместо этого

pg_dump.exe -Fc -h АдресСервера -U юзер постгреса -c ut11_3test > АдресДляДампа

использовать

pg_dump.exe -Fc -h АдресСервера -U юзер постгреса -c ut11_3test -f АдресДляДампа
?

места на диске для дампов хватает?
5 novichok79
 
19.10.17
10:37
какой размер дамп файла кстати? у меня 20 гигов восстанавливается нормально из кастомного формата postgre.
6 2dolist
 
19.10.17
10:37
места хватает, -f регается, что нельзя типа
размер дампа небольшой - порядка 2 гигов
7 novichok79
 
19.10.17
10:39
ну вот с stackoverflow, тоже что и я посоветовал

I found several bug reports indicating that pg_dump has problems writing to a pipe on Windows:

BUG #7794: pg_dump: errors when using pipes/streams
https://www.postgresql.org/message-id/[email protected]

BUG #6726: pg_dump - ftell mismatch when using -Fc and split
https://www.postgresql.org/message-id/[email protected]

Instead of writing to stdout and redirecting to a file, try using -f specify the output file:

pg_dump -Fc -U "username" -w "dbname" -f "filename".dmp
8 novichok79
 
19.10.17
10:40
(6) а что пишет?
может быть попробовать выгружать в другой формат?
9 2dolist
 
19.10.17
10:41
если -f, то пишет, что too many command-line arguements
10 2dolist
 
19.10.17
10:41
(8) форматы для pg_restore - это Fc (какая-то своя кодировка уже слегка заархивированная) и Fd (дистрибутив). Пробовал и то, и то - одинаково.
11 novichok79
 
19.10.17
10:44
(10) попробуй параметры писать с двумя тире,
у меня для дампов прописано следующее в батнике

REM Создание резервной копии
CALL "%PGBIN%\pg_dump.exe" --format=custom --compress=9 --jobs=%THREADSAMOUNT% --verbose --file=%DUMPPATH% 2> %LOGPATH%

работает как часы уже год.
12 novichok79
 
19.10.17
10:44
Fc, это ведь тоже самое что и --format=custom, по-моему.
13 2dolist
 
19.10.17
10:46
ага, идентично
14 novichok79
 
19.10.17
10:48
(13) результат такой же?
15 2dolist
 
19.10.17
10:48
после dumppath 2 это что?
16 2dolist
 
19.10.17
10:52
а где у тебя указано с какой базы делать дамп?
17 2dolist
 
19.10.17
10:53
ругается на CALL
18 novichok79
 
19.10.17
10:54
(15) это чтобы stdout шел в лог файл
(16) в переменной среды
(17) потому что это вызов из bat файла
19 novichok79
 
19.10.17
10:57
я бы делал так

pg_dump.exe --dbname=baza --format=custom --compress=9 --jobs=4 --host=superkomputer --port=5432 --username=postgres --password --verbose --file="C:\В гостях у сказки\дамп_2017_10_19.backup" 2> "C:\В гостях у сказки\дамп_2017_10_19.log"
20 novichok79
 
19.10.17
10:59
батник примерно такой

CLS
ECHO OFF
REM Установка кодовой страницы Win1251
CHCP 1251

REM Установка переменных окружения
REM Для сервера поменять переменные
SET PGBIN=C:\Program Files\PostgresPro 1C\9.4\bin\
SET PGHOST=......
SET PGPORT=......
SET PGUSER=......
SET PGPASSWORD=.....
SET PGDATABASE=%1

IF '%PGDATABASE%'=='' (ECHO The database name is not specified & GOTO End)

REM Установка путей копирования
REM Для сервера установить D:\Backup\
SET STAGINGDIRECTORY=%TEMP%
SET BACKUPDIRECTORY=D:\Backup\

REM Формирование имени файла резервной копии и файла-отчета
SET DATETIME=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2% %TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
SET DUMPFILE=%PGDATABASE%_%DATETIME%.backup
SET LOGFILE=%PGDATABASE%_%DATETIME%.log

IF NOT EXIST "%STAGINGDIRECTORY%" MD "%STAGINGDIRECTORY%"
IF NOT EXIST "%BACKUPDIRECTORY%" MD "%BACKUPDIRECTORY%"

REM Смена диска и переход во временную папку
CD /d %STAGINGDIRECTORY%

SET DUMPPATH="%STAGINGDIRECTORY%\%DUMPFILE%"
SET LOGPATH="%STAGINGDIRECTORY%\%LOGFILE%"
SET FINALDUMPPATH="%BACKUPDIRECTORY%\%DUMPFILE%"
SET FINALLOGPATH="%BACKUPDIRECTORY%\%LOGFILE%"

REM Создание резервной копии
CALL "%PGBIN%\pg_dump.exe" --format=custom --compress=9 --jobs=%THREADSAMOUNT% --verbose --file=%DUMPPATH% 2> %LOGPATH%

REM Анализ кода завершения
IF NOT %ERRORLEVEL%==0 GOTO Error
GOTO Successfull

REM В случае ошибки удаляется поврежденная резервная копия и делается соответствующая запись в журнале
:Error
DEL %DUMPPATH%
ECHO %DATETIME%: Errors when creating a database backup %DUMPFILE%. >> %LOGPATH%
ECHO %DATETIME%: See the report %LOGFILE%. >> %LOGPATH%
GOTO End

REM В случае удачного резервного копирования просто делается запись в журнал
:Successfull
ECHO %DATETIME%: The backup %DUMPFILE% has been successfully created. >> %LOGPATH%
ECHO F| XCOPY %DUMPPATH% %FINALDUMPPATH% /I /H /R /Y
ECHO F| XCOPY %LOGPATH% %FINALLOGPATH% /I /H /R /Y
DEL %DUMPPATH%
DEL %LOGPATH%
GOTO End

REM Выходим из батника
:End
21 novichok79
 
19.10.17
11:03
SET THREADSAMOUNT=%2
не забудь установить переменную, иначе руганется
забыл дописать когда пароли затирал
22 2dolist
 
19.10.17
11:07
решили пойти методом деконструкции, так сказать. Начать с самого простого.

в общем, ошибка в формате - если убрать формат Fc, то дамп делается (правда, в формате .sql).
23 2dolist
 
19.10.17
11:09
не совсем понятно как лучше поступить и почему внезапно начал тупить формат custom и distributive
24 arsik
 
гуру
19.10.17
11:10
(23) Антивирь?
25 novichok79
 
19.10.17
11:19
(22) я использовал длинные параметры, именно по той причине, что сначала Fc у меня тоже тупил.
26 2dolist
 
19.10.17
11:21
(20) нехило! курить надо это. А какая версия postgre?
27 2dolist
 
19.10.17
11:23
ещё проблема что если запускать батником, а ни из командной строки, то создаётся файл 0 размера. Т.е. по какой-то причине не пишется. Блин, тут права чтоль поменялись...
28 novichok79
 
19.10.17
11:23
(26) я писал сам. чего там "курить"? все просто - делается дамп во временный каталог на системном SSD диске сервера, потом полученный файл копируется на диск для дампов, вместе с логом.
29 novichok79
 
19.10.17
11:25
(26) 9.4.10 для Windows x64 с сайта postgrespro.ru
30 novichok79
 
19.10.17
11:27
31 2dolist
 
19.10.17
11:30
(28) у нас 9.4.2-1С
32 novichok79
 
19.10.17
11:36
(31) отлично, я планирую с обновлением платформы на 8.3.10 поставить 9.6, с сайта 1С.
33 2dolist
 
19.10.17
11:45
пока норм работает платформа - уже обновили
34 2dolist
 
19.10.17
11:57
(32) а если просто у тебя запустить строку
35 2dolist
 
19.10.17
11:58
%PGBIN%\pg_dump.exe --format=custom --compress=9 --file=%DUMPPATH% > %LOGPATH%

отработает?
36 2dolist
 
19.10.17
11:59
ну, вручную заданными параметрами естественно. Я просто хочу узнать, у тебя --format=custom отрабатывает или нет без всяких обозначений переменных среды.
37 novichok79
 
19.10.17
12:06
(35) да, отработает. я уже писал выше, как я оформил бы вызов pg_dump без указания переменных среды.
38 novichok79
 
19.10.17
12:07
(36) тоже писал: батник работает уже год.
39 novichok79
 
19.10.17
12:09
(34) просто запусти батник, который я тебе дал, и проверь сам.
40 ansh15
 
19.10.17
12:11
(19) --jobs хороший параметр, но его можно использовать только с форматом вывода directory, то есть --format=directory.
https://postgrespro.ru/docs/postgrespro/9.6/app-pgdump
(0)Попробуй, когда-то проверял в PowerShell
& 'C:\Program Files\PostgresPro 1C\9.6\bin\pg_dump.exe' "-Fc" "-b" "-fC:\pgsql\bench.bak" "bench"
& 'C:\Program Files\PostgresPro 1C\9.6\bin\pg_restore.exe' "-dbench" "C:\pgsql\bench.bak"
База bench должна быть вновь созданной.
Так работает.
41 2dolist
 
19.10.17
12:22
а дамп, который в формате sql не удаётся восстановить через psql.

Вообще какая-то засада и нихрена не понятно. Почему fc перестал работать.

Попробовали выгрузить в архив с форматом tar, он пгрестором не цепляется - говорит формат не тот.
42 2dolist
 
19.10.17
12:23
хотя, на винде мб тар и не пойдёт
43 novichok79
 
19.10.17
12:25
(40) я да запамятовал, что он только при восстановлении может дать газу. а бэкап только без него делается, если в кастом формате.
(41) просто вызови pg_dump с ключом --format=custom, дальнейшеий диалог не имеет смысла, пока ты этого не сделаешь.
44 ansh15
 
19.10.17
12:27
Вот и ответ
"I suspect that what's happening is that stdout isn't getting put into
binary mode, so that Microsoft's CR/NL translation corrupts the data.
If that's true, though, the resulting backup file should be corrupt"
Отсюда https://www.postgresql.org/message-id/23854.1446474615%40sss.pgh.pa.us
45 2dolist
 
19.10.17
12:39
(43) просто вызови pg_dump с ключом --format=custom

так изначально так и было. -Fc это прямой аналог --format custom.

он выдаёт
pg_dump: [cumsom archiver] WARNING: ftell mismatch with expected position -- ftell used.
46 Йохохо
 
19.10.17
12:45
(45) нельзя в произвольном порядке комбинировать старую и новую нотации, перепиши все в новой с учетом (44)
47 2dolist
 
19.10.17
13:21
(46) у меня не работают обозначения через --format
попробовал запустить
"адрес\pg_dump.exe" --format=custom --verbose --file="куда ставить"

не отработало - ругается на format=custom - неопределенная лексема
48 2dolist
 
19.10.17
13:23
(46) в 44 просто сказано не использовать |
И нак не используем
49 2dolist
 
19.10.17
13:51
Нет больше идей как оживить custom archiver? Уже появляется желание снести и переустановить просто постгрешку.
50 novichok79
 
19.10.17
15:12
(49) у меня все норм, покажи полностью что пишешь
51 2dolist
 
19.10.17
15:16
В общем, в командной строке нормально отрабатывает таким образом:

cd "адрес\PostgreSQL\9.4.2-1.1C\bin"
.\pg_dump.exe --host АдресХоста --port 5432 --username "postgres" --пасс --format custom --verbose --file "АдресКудаСкидыватьАрхивчик" "ut11_3test"

Осталось запустить это в батнике, а то просто так не отрабатывает
52 novichok79
 
19.10.17
15:31
(51) я еще равно обычно после параметров ставлю. но если так работает, то норм.
53 2dolist
 
19.10.17
15:35
(52) сейчас пробую твой батничек развернуть. Вопрос есть. А Зачем нам нужна промежуточная директория, из которой потом всё равно перекачиваем в конечную?
54 novichok79
 
19.10.17
15:46
(53) промежуточная директория на SSD диске, а конечная - на обычном HDD. это нужно для скорости.
55 2dolist
 
19.10.17
15:52
(54) хитро.
Не взлетает что-то батничек. Подозреваю, что с кодировкой дело. выполнение команды chcp уже не отрабатывает даже.
56 2dolist
 
19.10.17
16:18
Спасибо большое novichok79! взял за основу батник из (20), переписал его и всё взлетело.

Но такой момент. Многопоточная архивация недоступна для формата custom. Пришлось её отменить.
57 novichok79
 
20.10.17
08:39
(56) был рад помочь.
58 novichok79
 
20.10.17
08:41
(57) был бы еще более рад, если бы мне на яндекс-кошелек упало чуть-чуть денежек ))))
59 2dolist
 
23.10.17
10:36
(58) так данные нужны чтоб скинуть!
60 novichok79
 
23.10.17
15:54
(59) отлично, написал на [email protected] с ****[email protected]
61 2dolist
 
25.10.17
09:15
отблагодарил
62 novichok79
 
25.10.17
10:02
(61) получил, спасибо, очень приятно.