Мы сталкиваемся с критической ситуацией, когда после переноса базы данных 1С:УПП средствами SQL Server методом отключения (detach) и последующего подключения (attach) произошло загадочное исчезновение документов. Самое тревожное в этой ситуации — это то, что записи о создании, изменении и проведении этих документов сохранились в журнале регистрации 1С, но самих документов в базе нет. Давайте подробно разберем, почему такое могло произойти, какие шаги предпринять для диагностики и как предотвратить подобные инциденты в будущем.
Предполагается, что администратор выполнял перенос базы 1С:УПП. Классический сценарий, описанный в сообщении 6, заключается в следующем:
detach)..mdf) и журнала транзакций (.ldf) были физически перенесены в новое местоположение (или на другой сервер).attach) из нового местоположения.Если этот процесс был выполнен корректно, потеря документов является крайне необычным явлением, как отмечено в сообщении 7. Это наводит нас на мысль, что либо администратор не договаривает всех подробностей, либо в процессе переноса возникли скрытые проблемы.
Ключевое наблюдение, вызывающее недоумение, состоит в том, что в журнале регистрации 1С записи о документах (создан, изменен, проведен) присутствуют, но самих документов нет. Объяснение этому дает сообщение 4: журнал регистрации 1С хранится не в самой базе данных SQL Server, а на кластере сервера 1С. Это означает, что сервер 1С зафиксировал факт операции с документом в момент ее выполнения, но по каким-то причинам эти изменения либо не были корректно записаны в SQL-базу, либо были утеряны из нее позднее.
Наличие записей в журнале регистрации подтверждает, что в момент их создания 1С "знала" о существовании этих документов и успешно инициировала их сохранение. Отсутствие же документов в SQL-базе прямо указывает на проблему на уровне взаимодействия 1С с SQL Server, повреждения данных на диске, ошибок в процессе переноса или восстановления.
Для того чтобы выяснить истинную причину потери данных, нам предстоит провести комплексную проверку. Важно задать правильные вопросы администратору и исследовать состояние базы данных и сервера SQL.
Первым делом мы должны получить максимально полную информацию от администратора, выполнявшего перенос. Задайте следующие вопросы:
detach/attach, использовались ли полные бэкапы/ресторы, транзакционные или разностные бэкапы? (Сообщение 5)move) или скопированы (copy) с удалением оригинала? Сохранились ли они в исходном месте? (Сообщение 10)detach/attach? (Сообщение 10)DBCC CHECKDB?Документы 1С хранятся в SQL Server как набор таблиц. Каждый вид документа имеет свою "шапку" (основные данные) и, возможно, одну или несколько "табличных частей".
_Document123 (шапка) и _Document123_VT456 (табличная часть), выполните:
SELECT COUNT(*) FROM _Document123;
SELECT COUNT(*) FROM _Document123_VT456;
Если количество записей равно нулю или значительно меньше ожидаемого, это подтвердит, что данные отсутствуют непосредственно в SQL-базе.
Помимо очевидных ошибок администратора, существуют и более тонкие технические нюансы, которые могли привести к потере данных. Рассмотрим их подробнее.
Мы выясним, какая модель восстановления была установлена для базы данных.
Простая модель (Simple Recovery Model): При этой модели журнал транзакций автоматически усекается (очищается) при каждом контрольном событии (checkpoint). Это означает, что невозможно восстановить базу данных на определенный момент времени, а только до момента последнего полного или разностного резервного копирования. Если администратор переносил базу без создания предварительной резервной копии и произошла ошибка, все данные, измененные с момента последнего бэкапа, могли быть утеряны без возможности восстановления по журналу транзакций. В таком случае, если файл журнала транзакций (.ldf) был перенесен без соответствующей базы данных (.mdf) из старого бэкапа, он мог быть бесполезен.
Полная модель (Full Recovery Model): Эта модель сохраняет все записи журнала транзакций до тех пор, пока журнал не будет сам резервно скопирован. Это позволяет восстановить базу данных на любой момент времени, включая восстановление после ошибочных операций. Если база данных работала в полной модели восстановления, но файл журнала транзакций (.ldf) был утерян или поврежден во время переноса, это может привести к невозможности восстановления актуального состояния базы данных, даже если основной файл данных (.mdf) был успешно перенесен.
Важно: Для критически важных баз данных 1С всегда следует использовать полную модель восстановления, регулярно выполняя резервное копирование журнала транзакций.
Хотя метод detach/attach является стандартным способом перемещения базы данных, он требует абсолютной точности:
.mdf или .ldf были повреждены в процессе копирования (например, из-за сбоев диска, сети или недостаточного свободного места), то при последующем подключении база данных может быть неполной или поврежденной.detach, становится владельцем файлов и единственным пользователем с полными разрешениями. При переносе на новый сервер или в новое местоположение необходимо убедиться, что учетная запись службы SQL Server имеет соответствующие права доступа (чтение и запись) к новым файлам базы данных. Отсутствие прав может сделать данные недоступными, даже если физически они присутствуют.Мы проанализируем состояние дисковой подсистемы. Проблемы с дисковым хранилищем могут быть причиной потери данных:
Такие проблемы бывает трудно обнаружить сразу, и они могут проявиться только при попытке доступа к поврежденным данным.
При отключении и повторном подключении базы данных некоторые её настройки могут быть сброшены или изменены. Хотя это напрямую не приводит к потере документов, такие изменения могут нарушить работу 1С, что, в свою очередь, может быть ошибочно воспринято как потеря данных:
attach. Это может потребовать ручной корректировки.Trustworthy или Service Broker, которые могут быть необходимы для корректной работы 1С или некоторых её механизмов. Например, Service Broker используется 1С для фоновых заданий и других асинхронных операций.Проверьте эти настройки после переноса. Если какие-либо из них не соответствуют требованиям 1С, это может вызвать проблемы в работе, включая ошибки доступа к данным.
Когда база данных переносится на другой экземпляр SQL Server, могут возникнуть "осиротевшие" пользователи (Orphaned Users). Это происходит, когда логин пользователя в базе данных (database user) не связан с соответствующим логином на экземпляре SQL Server (server login). В результате сервер 1С или пользователи могут не получить доступ к своим объектам в базе, даже если сами данные физически присутствуют.
Для решения этой проблемы мы можем использовать системную хранимую процедуру sp_change_users_login с опцией auto_fix или вручную пересоздать связки. Пример использования sp_change_users_login:
USE [ИмяВашейБазыДанных];
GO
EXEC sp_change_users_login 'Auto_Fix', 'ИмяПользователяБазыДанных';
GO
Выполните этот запрос для всех пользователей базы данных, связанных с 1С. Также вы можете просмотреть список осиротевших пользователей:
USE [ИмяВашейБазыДанных];
GO
EXEC sp_change_users_login 'Report';
GO
Хотя метод detach/attach обычно подразумевает, что целевой экземпляр SQL Server должен быть той же версии или новее, могут возникнуть нюансы совместимости между версиями SQL Server и платформы 1С. Некоторые версии платформы 1С могут требовать определенной версии SQL Server или иметь особенности, которые необходимо учитывать при миграции. Несоответствие может приводить к некорректной работе или потере данных, если новая версия SQL Server некорректно интерпретирует или модифицирует структуру данных.
Мы рассмотрим возможность возникновения ошибок целостности данных. При переносе больших объемов информации или при наличии проблем в исходной базе данных до переноса могут возникнуть логические ошибки целостности данных:
Если документы удалились, но записи в журнале регистрации остались, это может указывать на нарушение ссылочной целостности, при которой "шапки" документов или их табличные части были утеряны, но связанные записи в других таблицах (например, в регистрах, откуда берутся данные для журнала регистрации 1С) остались.
В редких случаях некорректная работа дисковых контроллеров с кэшированием без батарейного питания (write-back caching без защиты) может привести к потере данных при сбоях питания. SQL Server может считать, что данные записаны на диск, тогда как они всё ещё находятся в кэше контроллера и не были физически сброшены. В случае внезапного отключения питания эти данные могут быть безвозвратно утеряны. Это не связано напрямую с переносом, но может усугубить ситуацию при возникновении других сбоев.
Критически важный момент, часто игнорируемый: отсутствие адекватного тестирования миграции на тестовом контуре. Если перенос выполнялся сразу на продуктивной среде без предварительной проверки на копии, все выявленные проблемы становятся продуктивными. Тестирование позволяет выявить потенциальные проблемы совместимости, производительности и целостности данных до того, как они затронут реальную работу.
Для минимизации рисков при работе с критически важными базами данных 1С и SQL Server мы настоятельно рекомендуем следующее:
Full Recovery Model): Для всех критически важных баз данных 1С на SQL Server устанавливайте полную модель восстановления. Регулярно выполняйте резервное копирование журнала транзакций, чтобы обеспечить возможность восстановления на любой момент времени (Point-in-Time Recovery).DBCC CHECKDB для проверки логической и физической целостности данных.
USE [ИмяВашейБазыДанных];
GO
DBCC CHECKDB WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
Если обнаружены ошибки, немедленно предпримите действия по их исправлению, предпочтительно из свежего бэкапа.
Trustworthy, Service Broker, совместимость) соответствуют требованиям 1С после переноса.В случае с данной ситуацией, отсутствие предварительного бэкапа перед переносом (как признался администратор в сообщении 12) является критической ошибкой, которая значительно усложняет возможность восстановления утраченных данных. Дальнейшие действия должны быть направлены на тщательный анализ всех упомянутых нами аспектов для выявления корневой причины проблемы и предотвращения ее повторения в будущем.