При работе с базами данных 1С:Предприятие часто возникает задача обеспечения отказоустойчивости. Бизнес требует, чтобы в случае выхода из строя основного сервера систему можно было запустить на резервном оборудовании с минимальными потерями данных и в кратчайшие сроки (в пределах 1–2 часов). Однако, когда инфраструктура построена на бесплатной СУБД MS SQL Server Express Edition, стандартные высокотехнологичные инструменты СУБД (такие как репликация AlwaysOn или встроенный механизм Log Shipping) оказываются недоступны.
В этой статье мы подробно разберем, как обойти аппаратные и программные ограничения MS SQL Express, какие существуют рабочие схемы резервирования баз данных 1С и как автоматизировать процесс актуализации резервного сервера.
Перед тем как проектировать отказоустойчивую систему, проанализируем архитектурные ограничения редакции MS SQL Express:
Task Scheduler (Планировщик задач Windows)..mdf) в версии Express ограничен 10 ГБ. Обратите внимание, что файл лога транзакций (.ldf) в этот лимит не входит, но если сама база превысит 10 ГБ, СУБД заблокирует запись. Если ваша база 1С приближается к 8–9 ГБ, вам необходимо заранее рассмотреть переход на другие СУБД (например, PostgreSQL) или коммерческую версию MS SQL Standard.Учитывая эти ограничения, рассмотрим проверенные практические схемы резервирования.
Проанализируем наиболее популярную и отказоустойчивую схему, которая позволяет минимизировать потерю данных до 1 часа, а время переключения (RTO) сократить до 15–30 минут.
Суть схемы: На основном сервере разворачивается рабочая база 1С, на резервном сервере СУБД находится в режиме ожидания (служба сервера 1С на нем остановлена или "спит", чтобы избежать конфликтов и случайного изменения данных пользователями).
Разберем регламент создания копий по шагам:
robocopy, которая умеет передавать только новые или изменившиеся файлы.Рассмотрим пример скрипта резервного копирования. Поскольку службы SQL Server Agent нет, мы будем вызывать утилиту командной строки sqlcmd через cmd-файл, запускаемый планировщиком Windows.
Пример скрипта для создания полного бэкапа (выполняется в 04:00):
sqlcmd -S SERVER1\SQLEXPRESS -E -Q "BACKUP DATABASE [Trade1C] TO DISK = N'D:\Backup\Trade1C_Full.bak' WITH FORMAT, INIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10"
Пример скрипта для создания разностного бэкапа (выполняется каждый час):
sqlcmd -S SERVER1\SQLEXPRESS -E -Q "BACKUP DATABASE [Trade1C] TO DISK = N'D:\Backup\Trade1C_Diff.bak' WITH DIFFERENTIAL, FORMAT, INIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10"
После создания файлов выполняем копирование на резервный сервер (SERVER2):
robocopy "D:\Backup" "\\SERVER2\BackupShare" /MIR /R:3 /W:5
На резервном сервере (SERVER2) скрипт восстанавливает базу. Сначала восстанавливаем полный бэкап с параметром NORECOVERY (это указывает SQL-серверу, что процесс восстановления не завершен и база пока не готова принимать подключения, ожидая разностный бэкап):
sqlcmd -S SERVER2\SQLEXPRESS -E -Q "RESTORE DATABASE [Trade1C] FROM DISK = N'C:\BackupShare\Trade1C_Full.bak' WITH FILE = 1, NORECOVERY, REPLACE"
Затем накатываем разностный бэкап и переводим базу в рабочий режим (параметр RECOVERY):
sqlcmd -S SERVER2\SQLEXPRESS -E -Q "RESTORE DATABASE [Trade1C] FROM DISK = N'C:\BackupShare\Trade1C_Diff.bak' WITH FILE = 1, RECOVERY"
При аварии основного сервера системному администратору останется лишь запустить службу 1С:Предприятия на резервном сервере и перенаправить пользователей (например, через изменение DNS-записи или настроек подключения в списках баз 1С).
Если для бизнеса критичен часовой лаг потери данных, и вы хотите сократить его до 10–15 минут, схема с разностными бэкапами может не подойти. В разностных бэкапах есть серьезный минус: каждый последующий разностный бэкап в течение дня увеличивается в размере, так как содержит в себе все изменения с ночи. При интенсивной работе к вечеру разностный бэкап может весить почти столько же, сколько вся база.
Выясним, как реализовать аналог профессионального механизма Log Shipping на базе MS SQL Express.
Для этого нам необходимо перевести базу данных 1С в модель восстановления FULL (Полная). В отличие от модели SIMPLE (Простая), в полной модели транзакции не очищаются из лога автоматически, и мы можем делать резервные копии самого журнала транзакций (файлы .trn).
Разберем алгоритм работы кастомного Log Shipping:
WITH NORECOVERY. База на резервном сервере переходит в состояние Restoring.
sqlcmd -S SERVER1\SQLEXPRESS -E -Q "BACKUP LOG [Trade1C] TO DISK = N'D:\Backup\Trade_Log.trn' WITH FORMAT, INIT"
Trade_Log.trn на резервный сервер.
sqlcmd -S SERVER2\SQLEXPRESS -E -Q "RESTORE LOG [Trade1C] FROM DISK = N'C:\BackupShare\Trade_Log.trn' WITH NORECOVERY"
Важное преимущество: Бэкапы логов транзакций весят крайне мало (обычно от нескольких мегабайт до десятков мегабайт), они мгновенно передаются по сети и быстро применяются.
В случае аварии на основном сервере, администратор выполняет на резервном сервере финальную команду восстановления, которая открывает базу для работы пользователей:
sqlcmd -S SERVER2\SQLEXPRESS -E -Q "RESTORE DATABASE [Trade1C] WITH RECOVERY"
Внимание! При использовании модели восстановления FULL обязательно следите за тем, чтобы бэкапы логов транзакций выполнялись без сбоев. Если бэкап лога перестанет выполняться, файл лога (.ldf) будет разрастаться бесконтрольно, пока не займет все дисковое пространство основного сервера.
Рассмотрим альтернативный вариант, когда резервирование настраивается не на уровне СУБД, а на уровне виртуализации. Если ваши серверы 1С и СУБД работают внутри виртуальных машин (например, на Hyper-V или VMware ESXi), можно настроить встроенную репликацию виртуальных машин на второй физический сервер-гипервизор.
Однако здесь кроется критически важный нюанс. При обычной репликации виртуальной машины файлы дисков копируются посекторно (режим Crash-Consistent). Если запустить такую реплику после аварии, SQL Server воспримет это как некорректное выключение питания. В базах 1С могут возникнуть логические ошибки, битые индексы или незавершенные транзакции.
Чтобы репликация виртуальной машины СУБД была безопасной, придерживайтесь следующих правил:
В процессе обсуждения часто возникает идея использовать встроенный механизм 1С — РИБ (Распределенные информационные базы) с автообменом. На первый взгляд, это кажется удобным: данные синхронизируются силами самой платформы 1С.
Однако использовать РИБ исключительно как средство создания резервного сервера крайне не рекомендуется по следующим причинам:
Механизмы резервного копирования и восстановления СУБД (модели бэкапов) являются гораздо более надежными, простыми в администрировании и гарантируют 100% идентичность данных без участия прикладных механизмов 1С.
Если ограничения MS SQL Express не позволяют вам построить надежную систему (например, база превысила 10 ГБ или требуется полноценная автоматическая репликация без написания скриптов), проанализируем альтернативные варианты:
pg_ctl promote.Для реализации резервирования базы 1С на MS SQL Express в течение 1–2 часов рекомендуем внедрить схему с полными ночными и ежечасными разностными бэкапами, автоматизированную через Планировщик задач Windows и утилиту sqlcmd. Это простое, бесплатное и надежное решение, проверенное годами эксплуатации в фирмах малого и среднего бизнеса.