Ситуация, когда база данных 1С:Предприятие 7.7 на SQL Server перестает открываться из-за логических ошибок ввода-вывода, является критической для любого бизнеса. Особенно остро проблема стоит в тех случаях, когда повреждены системные страницы, а свежих бэкапов под рукой не оказалось. Рассмотрим подробно, как проанализировать ситуацию и какими методами можно восстановить работоспособность системы, минимизировав потери данных.
Разберем типичный сценарий: при попытке обращения к базе SQL Server выдает сообщение о неверной контрольной сумме (checksum mismatch). В логах это выглядит как ошибка страницы, например (1:25392). Попытки выполнить стандартное лечение командой DBCC CHECKDB с параметрами REPAIR_REBUILD или даже REPAIR_ALLOW_DATA_LOSS часто прерываются ошибкой 7985.
Проанализируем причину такого поведения. Если идентификатор объекта (Object ID) равен 5, это указывает на повреждение критических системных таблиц (например, syscolumns или sysrowsets). SQL Server не может запустить процедуру восстановления, так как он не способен даже прочитать структуру самой базы данных. В этом случае база часто переходит в состояние RestorePending, блокируя любой доступ к данным.
Прежде чем приступать к любым манипуляциям, обязательно создадим копию файлов базы данных (MDF и LDF). Работа с поврежденной базой — это всегда риск окончательно ее уничтожить.
Выясним, какие именно таблицы пострадали. Для этого попробуем выполнить выборочное чтение. Переведем базу в однопользовательский режим, чтобы избежать блокировок:
ALTER DATABASE [Имя_Вашей_Базы] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
Затем проанализируем, какие таблицы 1С попадают на поврежденную страницу. Мы можем использовать команду DBCC PAGE для исследования «сырых» данных, если обычный SELECT выдает ошибку 829. Посмотрим, как это выглядит в консоли:
-- db_id можно узнать через select db_id('имя_базы')
DBCC TRACEON (3604);
DBCC PAGE (5, 1, 25392, 3);
GO
Эта команда выведет содержимое страницы в лог. Если мы видим там названия полей или данные справочников, мы сможем понять, какая таблица 1С пострадала (например, SC131 — справочник номенклатуры или _1SCONST — константы).
Если база данных помечена как поврежденная и не дает делать экспорт, переведем ее в режим EMERGENCY. Рассмотрим преимущества этого режима: SQL Server игнорирует ошибки контрольных сумм при чтении, что позволяет нам «вытащить» максимум живых данных.
ALTER DATABASE [skladsql] SET EMERGENCY;
GO
ALTER DATABASE [skladsql] SET SINGLE_USER;
GO
В этом состоянии мы можем попытаться скопировать данные из поврежденных таблиц. Важно понимать, что 1С 7.7 активно использует связи между таблицами. Если мы потеряем таблицу _1SCONNECT или _1SSTREAM, это будет неприятно, но не смертельно. Однако потеря таблиц справочников (SC*) или документов (DH*, DT*) потребует более серьезного вмешательства.
Поскольку системные таблицы повреждены, восстановить оригинальную базу целиком через CHECKDB, скорее всего, не удастся. Нашим решением будет создание новой пустой базы данных и перенос в нее уцелевших объектов.
Выполним следующие действия по шагам:
1Cv7.md), чтобы SQL Server подготовил все необходимые таблицы.EMERGENCY), в качестве приемника — новую пустую базу.Разберем ситуацию, когда часть таблиц (например, Номенклатура или Константы) не удалось скопировать из-за повреждения страницы. Если у нас есть старая копия базы (даже полугодовой давности в формате DBF или SQL), мы можем использовать ее как донора структуры и части данных.
Проанализируем алгоритм замещения данных:
SC131) выполним вставку недостающих записей.Рассмотрим пример SQL-запроса для переноса данных из «старой» базы в «новую» для конкретной таблицы:
INSERT INTO NewDB.dbo.SC131
SELECT * FROM OldDB.dbo.SC131
WHERE ID NOT IN (SELECT ID FROM NewDB.dbo.SC131);
Этот подход позволит нам сохранить хотя бы ту информацию, которая не менялась с момента последнего бэкапа. Новые элементы, созданные за последние месяцы, придется восстанавливать вручную или через сопоставление с таблицами движений.
В 1С 7.7 таблицы итогов (RG*) и движений (RA*) регистров часто занимают самый большой объем. Если повреждены именно они, это «хорошая» новость. Таблицы итогов можно полностью очистить, а затем восстановить их, запустив в Конфигураторе процедуру «Тестирование и исправление» (ТИИ) с включенной опцией «Пересчет итогов».
Выясним, какие таблицы регистров можно восстановить автоматически. Если повреждена таблица RA* (движения), то после пересчета итогов данные в RG* могут стать неверными. В этом случае единственным выходом будет перепроведение документов за период, когда данные были потеряны.
Проанализируем причины, по которым SMART диска может быть в норме, но возникают ошибки контрольных сумм. Чаще всего это происходит из-за:
Рекомендации для системных администраторов 1С 7.7:
FULL.PAGE_VERIFY CHECKSUM для раннего обнаружения повреждений.DBCC CHECKDB по расписанию (хотя бы раз в неделю), чтобы выявить проблему до того, как она станет фатальной.Таким образом, даже при серьезном повреждении системных страниц SQL, сочетание режима EMERGENCY, ручного импорта таблиц и использования данных из старых архивов позволяет вернуть бизнес в рабочее состояние с минимальными потерями.