Как развернуть бэкап новой версии SQL Server на старой версии СУБД для базы 1С?

Системный администратор IT и автоматизация бизнеса
← На главную

Перенос базы данных 1С между серверами — стандартная задача администрирования. Однако при этом часто возникает классическая проблема: базу данных обновили до более новой версии СУБД (например, перенесли на SQL Server 2012), а затем потребовалось развернуть ее резервную копию на старом сервере (например, на SQL Server 2008). Попытка стандартного восстановления из файла .bak или прикрепления файлов .mdf/.ldf на старой версии сервера неизменно заканчивается ошибкой совместимости.

В этой статье мы подробно разберем, почему Microsoft SQL Server не поддерживает обратную совместимость бэкапов, проанализируем технические нюансы структуры БД и рассмотрим рабочие методы решения этой проблемы, в том числе для баз данных большого объема (около 350 ГБ).

Почему стандартный бэкап СУБД не имеет обратной совместимости?

Разберем первопричину проблемы. Многие администраторы предполагают, что если в настройках базы данных на новом SQL Server изменить уровень совместимости (Compatibility Level) на старую версию (например, установить уровень 100 для SQL Server 2008 внутри SQL Server 2012), то бэкап легко восстановится на старом движке. К сожалению, это заблуждение.

Необходимо четко разграничивать понятия Compatibility Level и Database Version (внутренний физический формат версии базы данных):

  1. Compatibility Level (Уровень совместимости): Этот параметр влияет исключительно на логику работы оптимизатора запросов, парсер синтаксиса T-SQL и доступность некоторых новых функций СУБД. Он не меняет физическую разметку файлов на диске.
  2. Database Version (Внутренняя версия структуры): Это строго определенная структура заголовков страниц данных, системных таблиц метаданных и физической разметки файлов на диске. Каждому релизу SQL Server соответствует свой неизменяемый номер версии (например, SQL Server 2008 соответствует версия 655 или 661, а SQL Server 2012 — версия 706).

Как только база данных подключается к более новой версии СУБД, ее физическая структура автоматически и безвозвратно обновляется (выполняется внутренний апгрейд метаданных). Движок старого SQL Server физически не обучен чтению новой разметки заголовков и системных таблиц, созданных более новыми версиями СУБД. Механизма автоматического "физического даунгрейда" в Microsoft SQL Server не существует.

Поэтому восстановить бэкап .bak или прикрепить файлы .mdf/.ldf с версии 2012 на версию 2008 напрямую нельзя.

Ниже мы подробно рассмотрим проверенные и эффективные методы решения этой задачи.

---

Метод 1. Использование промежуточной копии базы и выгрузка в формат .dt

Самый простой путь для администратора 1С — это использование платформенного механизма выгрузки информационной базы в файл .dt. Платформа 1С хранит конфигурацию и данные в универсальном формате, не зависящем от версии конкретной СУБД. База, выгруженная в .dt на SQL Server 2012, без проблем загрузится на SQL Server 2008.

Однако для баз большого объема (например, 350 ГБ) прямая выгрузка на рабочей базе несет огромные риски:

Для решения этой проблемы применим эффективный обходной путь. Разберем его по шагам:

  1. На исходном сервере (SQL Server 2012) разворачиваем копию рабочей базы данных под другим именем (например, Staging_Copy) из свежего бэкапа. С этой базой никто из пользователей работать не будет.
  2. В кластере 1С регистрируем новую временную информационную базу, указывая в качестве СУБД нашу свежесозданную Staging_Copy.
  3. Запускаем конфигуратор этой временной базы 1С. Так как в ней нет активных сеансов пользователей, мы можем спокойно запустить процесс выгрузки в файл .dt (через меню Администрирование -> Выгрузить информационную базу...).
  4. Пока идет выгрузка, основная рабочая база продолжает функционировать в штатном режиме без блокировок и зависаний для пользователей.
  5. Полученный файл .dt переносим на целевой сервер с SQL Server 2008, создаем там пустую базу данных в СУБД, регистрируем ее в кластере 1С, заходим в конфигуратор и загружаем данные (Администрирование -> Загрузить информационную базу...).

---

Метод 2. Экспорт схемы и данных с помощью встроенных скриптов SQL Server

Если по каким-то причинам выгрузка через .dt не подходит или завершается с ошибками формата потока, мы можем воспользоваться генерацией T-SQL скриптов непосредственно в среде SQL Server Management Studio (SSMS).

Обратим внимание на важный нюанс: если просто сгенерировать скрипт создания таблиц и вставки строк для базы в 350 ГБ, мы получим текстовый файл размером в сотни гигабайт. Попытка открыть его в среде SSMS приведет к моментальному падению программы из-за нехватки оперативной памяти (out of memory). Поэтому действовать нужно аккуратно.

Проанализируем пошаговый алгоритм генерации совместимого скрипта:

  1. В среде SQL Server Management Studio на исходном сервере (SQL 2012) кликаем правой кнопкой мыши по нужной базе данных и выбираем: Tasks (Задачи) -> Generate Scripts... (Скриптовать...).
  2. В открывшемся мастере выбираем таблицы, которые необходимо перенести (обычно выбирают все объекты базы данных).
  3. На шаге выбора параметров сохранения файла нажимаем кнопку Advanced (Дополнительно). Это ключевой этап настройки:
    • Находим параметр Script for Server Version (Скрипт для версии сервера) и принудительно устанавливаем значение SQL Server 2008. Это исключит использование синтаксиса, который не поддерживается старой СУБД.
    • Находим параметр Types of data to script (Типы данных для скрипта). По умолчанию там выбрано "Schema only" (Только схемы). Нам необходимо переключить этот параметр в значение Schema and data (Схемы и данные).
  4. Завершаем работу мастера и сохраняем скрипт в файл на диске (например, db_backup.sql).

Поскольку файл будет огромным, выполнять его на целевом сервере (SQL Server 2008) через графический интерфейс SSMS нельзя. Для этого мы применим консольную утилиту sqlcmd, которая оптимизирована под чтение тяжелых файлов пакетами.

Для запуска скрипта выполним следующую команду в командной строке (cmd) на целевом сервере:


sqlcmd -S Имя_Целевого_Сервера -d Имя_Пустой_Базы -i C:\Scripts\db_backup.sql -a 32767

Параметр -a 32767 задает увеличенный размер сетевого пакета команд, что существенно ускоряет выполнение транзакций по вставке данных.

---

Метод 3. Перенос данных с помощью мастера импорта и экспорта СУБД (SSIS)

Для больших баз данных вставка сотен миллионов строк через текстовые файлы T-SQL скриптов — крайне неэффективный и медленный процесс. Гораздо надежнее использовать встроенную технологию SQL Server Integration Services (SSIS).

Рассмотрим этот мощный инструмент, который позволяет перенести данные напрямую из одной СУБД в другую без промежуточных текстовых файлов. Нам понадобятся оба запущенных сервера в одной локальной сети.

Разберем процесс по шагам:

  1. На исходном сервере (SQL 2012) выполняем генерацию скрипта структуры БД (как в Методе 2), но в параметре Types of data to script оставляем значение Schema only (Только схемы). Полученный скрипт структуры будет весить всего несколько мегабайт.
  2. На целевом сервере (SQL 2008) создаем абсолютно пустую базу данных и накатываем на нее скрипт схемы. Теперь у нас есть две базы с абсолютно идентичной структурой таблиц, но на целевом сервере таблицы пока пустые.
  3. Запускаем мастер импорта и экспорта. В меню "Пуск" или в SSMS выбираем пункт SQL Server Import and Export Wizard.
  4. В качестве источника (Source) указываем наш сервер SQL Server 2012 и базу-источник.
  5. В качестве приемника (Destination) указываем целевой сервер SQL Server 2008 и созданную пустую базу данных.
  6. Выбираем вариант копирования: Copy data from one or more tables or views (Скопировать данные из одной или нескольких таблиц или представлений).
  7. Отмечаем галочками все таблицы базы данных 1С.
  8. В параметрах сопоставления обязательно проверяем настройки. При необходимости ставим флаг Enable identity insert (Разрешить вставку значений идентификаторов), чтобы сохранить неизменными все уникальные внутренние ключи 1С.
  9. Запускаем процесс выполнения пакета SSIS. Инструмент начнет перекачивать данные напрямую из одной базы в другую на максимальной скорости с использованием буферизованной пакетной вставки (Bulk Insert).

Этот метод является одним из самых производительных и безопасных для переноса структуры и данных баз данных 1С объемом 350 ГБ и более.

---

Метод 4. Перенос данных через Linked Server (Связанные серверы)

Еще один профессиональный способ переноса данных "на лету" без использования графических мастеров — это настройка связи между серверами СУБД через механизм Linked Server.

Проанализируем этот сценарий. Мы можем связать старый сервер SQL Server 2008 с новым сервером SQL Server 2012 напрямую, а затем запустить SQL-запрос, который перекачает данные из таблиц источника в таблицы приемника.

Для настройки связанного сервера на целевом сервере SQL Server 2008 выполним следующий T-SQL скрипт:


EXEC sp_addlinkedserver 
   @server = N'SourceSQL2012', 
   @srvproduct=N'SQL Server';
GO

EXEC sp_addlinkedsrvlogin 
   @rmtsrvname = N'SourceSQL2012', 
   @useself = N'FALSE', 
   @locallogin = NULL, 
   @rmtuser = N'sa', 
   @rmtpassword = N'Ваш_Пароль_sa_На_Источнике';
GO

После успешного создания связи мы можем переносить данные из таблиц с помощью прямого запроса. Сначала мы создаем пустую структуру таблиц на сервере-приемнике (например, скопировав схему через SSMS), а затем запускаем транзакционное наполнение таблиц:


-- Пример ручного переноса данных конкретной таблицы 
-- Включаем возможность вставки явных значений в автоинкрементное поле (Identity)
SET IDENTITY_INSERT Имя_Локальной_Таблицы ON;

INSERT INTO Имя_Локальной_Таблицы (Поле1, Поле2, Поле3)
SELECT Поле1, Поле2, Поле3 
FROM [SourceSQL2012].[Имя_Удаленной_БД].[dbo].[Имя_Удаленной_Таблицы];

SET IDENTITY_INSERT Имя_Локальной_Таблицы OFF;

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

---

Резюме и рекомендации

Мы подробно разобрали физические ограничения совместимости файлов баз данных Microsoft SQL Server и изучили альтернативные варианты даунгрейда версии СУБД.

Подведем итог и выберем оптимальную стратегию работы:

← На главную