Резервное копирование и восстановление базы 1С средствами PostgreSQL

Алгоритм резервного копирования баз 1С: 8 средствами PostgreSQL.

В интернете куча статей, как установить PostgreSQL и залить в него базу из dt.

Но столкнулся с проблемой резервного копирования и восстановления базы средствами PostgreSQL.

т.е.  при восстановлении базы сыпались ошибки, и восстановленная копия базы не работала.

Ошибочный алгоритм.

1. Делаем резервную копию скриптом или с помощью pgAdmin III — получаем файлик bkp…

2. Создаем пустую базу средствами 1С сервера.

3. Восстанавливаем резервную копию скриптом или с помощью pgAdmin III в базу, созданную на шаге 2.

и болт : во время восстановления уже видны ошибки и восстановленая копия получается не рабочая (в конфигуратор пускает, но в предприятие уже не войти, «ошибка аутентификации пользователя» и т.п.)

Правильный алгоритм.

1. Делаем резервную копию скриптом или с помощью pgAdmin III — получаем файлик bkp…

Пример командного файла :

«C:Program FilesPostgreSQL9.4.2-1.1Cinpg_dump.exe» —host localhost —port 5432 —username «postgres» —role «postgres» —no-password —format custom —blobs —section pre-data —section data —section post-data —encoding UTF8 —verbose —file «c:1c_base.backup» «1c_base»

pause

где   «1c_base»  — имя базы

       «c:1c_base.backup»  — имя файла резервной копии

2. Создаем пустую базу средствами Postgre — Я делал pgAdmin III -ом. (и пока не добавляем ее через «Администрирование сервера 1С» )

пустую базу можно создать командой CREATE DATABASE https://www.postgresql.org/docs/9.1/static/sql-createdatabase.html

3. Восстанавливаем резервную копию скриптом или с помощью pgAdmin III в базу созданную на шаге 2.

Пример командного файла :

«C:Program FilesPostgreSQL9.4.2-1.1Cinpg_restore.exe» —host localhost —port 5432 —username «postgres» —dbname «1c_base_copy» —role «postgres» —no-password  —section pre-data —section data —section post-data —verbose «C: 1c_base.backup»

pause

где   «1c_base_copy»  — имя пустой базы, созданой в шаге 2 средствами PostgreSQL

       «c:1c_base.backup»  — имя файла резервной копии

4. Добавляем базу созданную на шаге 2 с  восстановленной информацией в список баз на сервере 1С через остнастку «Администрирование сервера 1С».

Вот и все !!! Всем удачного дня !!!

33 Comments

  1. lustin
  2. dimisa

    (1) lustin,

    Зачем так сложно ?

    cmd — файл в задания под какой нибуть локальной админской записью.

    Reply
  3. cssprite

    http://postgresql.ru.net/manual/backup-dump.html

    Текстовые файлы, созданные pg_dump предназначаются для последующего чтения программой psql. Общий вид команды для восстановления дампа:

    psql имя_БД < файл_дампа

    где файл_дампа — это файл, содержащий вывод команды pg_dump. База данных, заданная параметром имя_БД не будет создана данной командой, так что вы должны создать её сами из базы template0 перед запуском psql (например, с помощью команды createdb -T template0 имя_БД)

    Reply
  4. oldcopy

    Ещё следует уточнить что кодировка дампа должна совпадать с кодировкой сервера БД.

    Reply
  5. freeraider

    PostgreSQL не восстанавливает текущую базу из дампа.

    Поэтому, я восстанавливаю базу так:

    dropdb имя_базы

    createdb имя_базы

    psql имя_базы < файл_дампа

    Мой скрипт восстановления для Linux (работает под пользователем postgres):

    #!/bin/bash

    if [ -z «$1» ] ; then

    echo «Скрипт восстановления базы 1С. Параметры: 1 имя директории бэкапа, 2 имя базы 1С» 1>&2

    exit

    fi

    base_name=»$2″

    dir_name=»$1″

    archive_name=$dir_name/$base_name.sql.gz

    dropdb $base_name

    createdb $base_name

    gunzip -c $archive_name | psql $base_name

    Reply
  6. zazabadak

    У нас с восстановлением базы из дампа проблем вроде не вылезает, не ругается:

    dropdb -U postgres [имя базы]

    createdb -U postgres [имя базы]

    pg_restore -U postgres -d [имя базы] [имя файла]

    Reply
  7. Seltick

    Для разграничения архивов по дням: namebase_backup_%date:~6,4%-%date:~3,2%-%date:~0,2%.backup

    Если у пользователя установлен пароль: SET PGPASSWORD=123

    Готовый скрипт:

    SET PGPASSWORD=123

    «C:Program FilesPostgreSQL9.4.2-1.1Cinpg_dump.exe» —host localhost —port 5432 —username «postgres» —role «postgres» —no-password —format custom —blobs —section pre-data —section data —section post-data —encoding UTF8 —verbose —file «D:1cBackupNewut11_backup_%date:~6,4%-%date:~3,2%-%date:~0,2%.backup» «ut11»

    Reply
  8. Vovan58

    Рекомендую вот это описание : https://postgrespro.ru/docs/postgrespro/9.5/app-pgdump и https://postgrespro.ru/docs/postgrespro/9.6/app-pgrestore.html — вроде все понятно описано 🙂 и по-русски!

    Reply
  9. fedor_b

    Спасибо помогло. Наступал на те же грабли.

    Reply
  10. edgi

    Так же создаю резервные копии как писали в коментах.

    Но есть один вопрос. Иногда требуется срочно восстановить какую нибудь копию базы за определенный день. с командной строки я ее восстанавливаю в новую базу созданную посредством psql, но в 1ске то она не появиться надо вручную ее создать или с помощью 1с или через консоль администрирования 1с. А как через командную строку создать базу в 1с?

    Reply
  11. frkbvfnjh

    (7) Можно ли этим способом делать бэкап базы не выгоняя пользователей из базы?

    Reply
  12. der_mensch

    (11) Можно. В документашке прямо так и заявлено:

    pg_dump — это программа для создания резервных копий базы данных Postgres Pro. Она создаёт целостные копии, даже если база параллельно используется. Программа pg_dump не препятствует доступу других пользователей к базе данных (ни для чтения, ни для записи).
    Reply
  13. frkbvfnjh

    (12) Спасибо!

    Reply
  14. xmolex

    (11)

    м делать бэкап базы не выг

    Нет, нельзя. Одна операция в 1с меняет данные во многих sql таблицах. Бэкап базы существеннен по времени и у вас нет гарантии, что данные за это время не изменятся. Вы сделаете несколько бэкапов и они будут рабочие, но однажды попадете на восстановление данных.

    Reply
  15. t.v.s.

    (14) Не вводите людей в заблуждение.

    Не только можно, но и в большинстве случаев это единственный вариант. Например если база весит пару терабайт, работает 24/7/365 и каждый час простоя стоит N килобаксов.

    А по поводу длительности операции — там снэпшот создается, так что итоговый бэкап получается вполне себе консистентным.

    Reply
  16. xmolex

    (15)

    там снэпшот создается, так что итоговый бэкап полу

    Не знаю как насчет терабайт, а вот с базой 300Гб (select pg_database_size(‘base’);), которая используется 24/7/365, я сначала был такого же мнения как и вы. Бэкап делался минут 40, в течении которых пользователи плевались и матерились, т.к. предприятие тормозило еще как. Так вот в один прекрасный день, когда неудачно прошло обновление конфигурации и база отказалась запускаться, пришлось воспользоваться самым свежим бэкапом, сделанным таким путем, и каково же было мое недоумение, когда он загрузился без проблем, но при открытии в 1с счет фактур предприятие вылетало. Вы можете возразить, что мол кеши надо было чистить, но все это конечно было сделано. Сейчас система переделана. Два сервера: один мастер, другой слейв. Когда нужно сделать бэкап, слейв теряет соединение с мастером, к нему подключается сервер 1с предприятия и средствами 1с делают бэкап. После этого слейв подключается к мастеру и синхронизируется.

    Снепшот может и создается (хотя не уверен, а проверять ваши слова лень), но это снепшот sql базы. А вот 1с в этот момент может что-то активно писать и поменять данные в 1 таблице sql, и тут произойдет снепшот sql, а еще в 10 таблицах не успеет поменять, хотя должна, чтобы поддерживать свою логику. Вы же знаете, что одно добавление в регистр записи, может запускать множество других регистраций и каждая из них будет запускаться как одна транзакция в sql. Поэтому данные в базе у вас обязательно испортятся. Возможно база у вас и загрузится и даже работать будет, но данные будут неполными и это аукнется позже.

    Reply
  17. alexbur

    (16), А есть уверенность, что в момент потери связи между серверами 1С были записаны все необходимые движения? Вы считаете что все движения, связанные с проведением документа в 1С происходят в одной 1С транзакции?

    Reply
  18. xmolex

    (17)

    А есть уверенность, что в момент потери связи между серверами 1С были записаны все необходимые движения?

    Я говорил про сервера postgresql, а не 1с. Уверенности конечно нет, но т.к. бэкап делается средствами 1с, то 1с при обнаружении испорченных данных в документе его просто не выгрузит в бэкап. В результате структура базы будет цела, правда за минусом документа.

    Reply
  19. alexbur

    (18)

    Я говорил про сервера postgresql, а не 1с.

    Ага, не понял вас сразу. То есть фактически плюсом этого решения является то, что боевая база не тормозит в момент бэкапа? Но вот в плане надёжности такого решения я испытываю сильные сомнения. В момент обрыва связи между серверами postgre вероятность потерять данные не меньше чем при снепшоте. То что потом бэкап делается средствами 1С не панацея. Сталкивался я со случаями, когда бэкап из dt не разворачивался из-за сбойных данных внутри.

    Reply
  20. MulderCelica
    Reply
  21. PbI4

    А ни у кого не случается иногда такая ошибка при ресторе?

    pg_restore: обрабатываются данные таблицы «public._usersworkhistory»

    pg_restore: обрабатываются данные таблицы «public._yearoffset»

    pg_restore: обрабатываются данные таблицы «public.config»

    pg_restore: [внешний архиватор] не удалось прочитать входной файл: конец файла

    При чём всегда после конфига и иногда рестор отрабатывает без ошибки на том же самом дампе

    Reply
  22. vsasav

    (21) https://infostart.ru/public/956734/ — вот здесь все подробно описал, в том числе и вашу ситуацию, когда архив выгружается с помощью —format custom. Сам наткнулся на эти грабли при выполнении команды pg_restore. Это означает, что pg_dump прерывался с ошибкой на таблице public.config, однако, файл архива был создан, и следует уже использовать мой метод.

    Reply
  23. MnDb

    Добрый день, коллеги,

    Не получается сделать копию и восстановление.

    Делаю все как описано здесь, но при добавлении базы в консоли администирования 1С получаю ошибку: DATABASE не пригоден для использования

    Reply
  24. a.doroshkevich

    (23) Копируете и восстанавливаете на один и тот же сервер PG или разные?

    Reply
  25. MnDb

    (24) Разные.

    Reply
  26. a.doroshkevich

    1. на том на который восстанавливаете попробуйте с сервера 1С просто создать пустую базу, получится?

    2. насколько разные сервера? Версии? ОС?

    Reply
  27. MnDb

    (26)

    1. Пустая база создается, проблем нет.

    2. Идентичны.

    Reply
  28. a.doroshkevich

    Платформа 1с тоже одинаковая?

    Reply
  29. MnDb

    (28) да.

    Reply
  30. a.doroshkevich

    Ну тогда показывайте скрипты создания и восстановления

    Reply
  31. MnDb

    (30) Кажется разобрался, бэкап криво восстановился. Позже отпишусь.

    Reply
  32. MnDb

    (31)

    Я не говорил что ОС у меня Ubuntu.

    Выполнял копирование командой: pg_dump -C -h ipОткуда -U пользовательОткуда имяБДоткуда | psql -h ipКуда -U пользовательКуда имяБДкуда.

    По итогу система мне сказала что успешно выполнила все.

    Затем попытался создать базу в консоли администирования 1С и получил ошибку:DATABASE не пригоден для использования.

    В итоге получилась поломанная БД без таблиц.

    Проделал все тоже самое через файл, проверил наличие таблиц. Все получилось.

    Reply
  33. Logarifm_Andre

    (7)

    SET PGPASSWORD=123

    Добрый день,

    Выполнял выше указанные скрипты. Дамп отрабатывает без ошибок, но при попытки сделать восстановление в пустую созданную БД отрабатывает не корректно с ошибками, база не запускается.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *