Хотелось бы научиться оптимизировать базу из батника, чтобы например делать это по расписанию. Не подскажете как это сделать?
Пока приходится все делать ручками в pgAdmin VACUUM (FULL+ANALYZE) и REINDEX.
я себе такой батник состряпал:
@Echo Off
Echo "Backup start, wait..."
Call :SaveTime"C:/Program Files/PostgreSQL/8.4/bin/pg_dump.exe" --host localhost --port 5432 --username postgres --format custom --blobs --oids --verbose --file "C:\holdem_backup.b" h
echo
echo "backup complete"
echo
echo "restore...""C:/Program Files/PostgreSQL/8.4/bin/pg_restore.exe" --host localhost --port 5432 --username postgres --dbname h --clean --verbose "C:\holdem_backup.b"
Call :DiffTime
Echo Total time %DiffTime% sec
Echo.
Pause
Exit:SaveTime
For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set $Time=%%i
Set $D0=%$Time:~6,2%
Set $H0=%$Time:~8,2%
Set $N0=%$Time:~10,2%
Set $S0=%$Time:~12,2%
GoTo :EOF:DiffTime
For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set $Time=%%i
Set $D1=%$Time:~6,2%
Set $H1=%$Time:~8,2%
Set $N1=%$Time:~10,2%
Set $S1=%$Time:~12,2%Set DiffTime=-1
If %$D1% EQU %$D0% Set /A DiffTime=%$S1%+(%$N1%*60)+(%$H1%*3600)-(%$H0%*3600)-(%$N0%*60)-%$S0%
GoTo :EOFpause
только тут навешал фич замера времени и всякой инфо лабуды. по факту нужны только две строчки:
"C:/Program Files/PostgreSQL/8.4/bin/pg_dump.exe" --host localhost --port 5432 --username postgres --format custom --blobs --oids --verbose --file "C:\holdem_backup.b" h
"C:/Program Files/PostgreSQL/8.4/bin/pg_restore.exe" --host localhost --port 5432 --username postgres --dbname h --clean --verbose "C:\holdem_backup.b"
h - имя базы
C:\holdem_backup.b - куда скидывать временный дамп
postgres - имя пользователя
пароль не вводится нигде.
Что делается: дамп\восстановление из файла, перед восстановлением база полностью чистится. файл с базой на всякий случай не удаляется, но заменяется при следующем запуске последним, так что можно организовать при надобности хранилище последних n бэкапов.
Надеюсь объяснять чем дамп\восстановление лучше VACUUM (FULL+ANALYZE) и REINDEX объяснять не надо, это есть в faq ![]()
*не несу ответственности за потерю данных, но гарантирую работоспособность ♠_cool:
Надеюсь объяснять чем дамп\восстановление лучше VACUUM (FULL+ANALYZE) и REINDEX объяснять не надо, это есть в faq
Выдержка из faq:
6б. и регулярно проводить ее техобслуживание - вакуум (с параметрами Full + Analyze) и индексирование средствами pgAdmin
6в. для особо продвинутых - можно проделать с базой комбинацию Dump/restore - но там достаточно подводных камней, может потом и не восстановиться. Хотя, если сработает, размер базы таки уменьшится существенно.
Если не трудно, объясни хотя бы в двух словах. А вообще, большущее спасибо.
Да пожалуйста ![]()
По сути: ваакум базы работает как дефрагментация диска, только вместо диска - файлы базы, а вместо файлов на диске - записи в базе+строит оптимальную структуру внутри файла. реиндекс переразмещает и переназначает номера записей, тем самым удаляя некоторый мусор который остаётся в файле, но уже не нужен базе, упорядочивает, удаляет ошибки.
вместо этого: dump - скидывает все записи и структуры базы в файл, только самое нужное без мусора.
restore - создаёт новый чистый файл базы и аккуратненько по порядку укладывает все записи одновременно нумеруя их, соответственно без пустых пространств.
таким образом:
а) dump\restore занимает меньше времени чем операции ваакума и реиндекса
б) делает дело качественнее: ускорение работы имхо ощутимее по сравнению с вакумом
в) порой значительно сокращает размер самой базы за счёт аккуратной укладки.
P.S. сюда же можно вбить purge хэндхисторей, но с сохранением статистики через psql.exe и запрос "DELETE * FROM handhistories", но я нерешаюсь это делать пока))
www.ru.wikipedia.org/wiki/Пакетный_файл
Пакетные файлы в DOS имеют расширение .bat; для других операционных систем они могут иметь другие расширения — например, .CMD в Windows NT и OS/2, или .BTM в 4DOS или подобных оболочках.
я пробовал описанное
имя файла (с путем) в кавычки брать таки надо, а вот имя базы - нет
WARNING: errors ignored on restore: 53
Последняя строка была после восстановления с помощью батника. Страшно это?
ХМ при включении выдал табличку о каком то там чего то с базой, типа оптимизирует под себя.
что оптимизирует - ето вроде нормально
а вот ошибки... проверить бы надо базу на предмет совпадения инфы со старой
У меня получился вот такой батник:
@echo Off
"D:/Poker/PostgreData/bin/pg_dump.exe" --host localhost --port 5432 --username postgres --format custom --blobs --oids --verbose --file "E:\holdem_backup.b" pokerstars
"D:/Poker/PostgreData/bin/pg_restore.exe" --host localhost --port 5432 --username postgres --dbname pokerstars --clean --verbose "E:\holdem_backup.b"
pause
При запуске ничё не происходит. Вот лог:
D:Poker>я╗┐@echo Off
"я╗┐@echo" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
D:Poker>"D:/Poker/PostgreData/bin/pg_dump.exe" --host localhost --port 5432 --u
sername postgres --format custom --blobs --oids --verbose --file "E:holdem_back
up.b" pokerstars
pg_dump: [custom archiver] could not open output file "E:holdem_backup.b": Perm
ission denied
D:Poker>"D:/Poker/PostgreData/bin/pg_restore.exe" --host localhost --port 5432
--username postgres --dbname pokerstars --clean --verbose "E:holdem_backup.b"
pg_restore: [archiver] could not open input file "E:holdem_backup.b": Permissio
n denied
D:Poker>pause
Для продолжения нажмите любую клавишу . . .
Где ошибка?
а вот здесь уважаемый Morpheuzis таки неправ
слеш там правильный
меня вот только смущает реакция: отказ в доступе
из чего следует, что запускать батник надо от админа
и убери из него ехо
а еще в команде восстановления имя базы надо в кавычки, кажется
В батнике в команде на восстановление имя базы взял в кавычки. Сейчас батник такой:
"D:/Poker/PostgreData/bin/pg_dump.exe" --host localhost --port 5432 --username postgres --format custom --blobs --oids --verbose --file "E:\holdem_backup.b" pokerstars
"D:/Poker/PostgreData/bin/pg_restore.exe" --host localhost --port 5432 --username postgres --dbname "pokerstars" --clean --verbose "E:\holdem_backup.b"
pause
Ошибку выдает такую:
D:Poker>я╗┐"D:/Poker/PostgreData/bin/pg_dump.exe" --host localhost --port 5432
--username postgres --format custom --blobs --oids --verbose --file "E:\holdem_b
ackup.b" pokerstars
Синтаксическая ошибка в имени файла, имени папки или метке тома.
D:Poker>"D:/Poker/PostgreData/bin/pg_restore.exe" --host localhost --port 5432
--username postgres --dbname "pokerstars" --clean --verbose "E:\holdem_backup.b"
pg_restore: [archiver] could not open input file "E:\holdem_backup.b": Permissio
n denied
D:Poker>pause
Для продолжения нажмите любую клавишу . . .
Сижу под админом.
Если с батником так ничего и не получится - какие галочки расставить?

Сейчас запустил вручную, поставив галочку на "с OID". Процесс пошел, в окне пгадмина следующая надпись:
D:\Poker\PostgreData\bin\pg_dump.exe -h localhost -p 5432 -U postgres -F c -b -o -v -f "E:\holdem_backup.b\111cOID.backup" pokerstars
Может в батник эту команду так и написать?