Резервное копирование и восстановление базы 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 не будет опубликован. Обязательные поля помечены *