Ситуация, когда доступ к MS SQL Server на уровне администратора СУБД (пользователь sa) утерян, а базу необходимо срочно перенести или восстановить, встречается в практике системного администрирования нередко. Ситуация осложняется, если штатная выгрузка 1С (файл .dt) не загружается на новый сервер из-за внутренних ошибок целостности, а стандартное «Тестирование и исправление» в файловом режиме занимает слишком много времени. Разберем по шагам, как решить эту задачу, имея доступ только к операционной системе сервера.
Прежде чем приступать к радикальным мерам, проверим самый простой вариант. Часто при установке MS SQL Server системные администраторы включают опцию Windows Authentication и добавляют текущего пользователя или группу «Администраторы» в список sysadmin. Проанализируем, как это можно использовать:
sa или создать нового пользователя с полными правами.Если этот вариант не сработал, рассмотрим более глубокие методы управления сервером.
Как совершенно верно подмечено в обсуждении, для манипуляций с базой на уровне файлов пароль sa не требуется. Этот метод является самым быстрым для переноса «битой» базы на другой сервер для последующего анализа и исправления. Разберем этот процесс по шагам:
Шаг 1. Остановка службы SQL Server. Чтобы файлы базы данных разблокировались и их можно было скопировать, необходимо остановить службу экземпляра SQL. Это можно сделать через оснастку services.msc или SQL Server Configuration Manager.
Шаг 2. Поиск файлов. Нам необходимо найти два основных файла:
.MDF — основной файл данных, содержащий все таблицы, индексы и объекты базы..LDF — журнал транзакций, в котором хранятся изменения данных.Обычно они располагаются в каталоге установки SQL Server, например: C:\Program Files\Microsoft SQL Server\MSSQL[Версия].MSSQLSERVER\MSSQL\Data.
Шаг 3. Копирование и перенос. Скопируем эти файлы на новый сервер. Важно помнить: версия SQL Server на целевом сервере должна быть такой же или выше, чем на исходном. Понижение версии (например, с SQL 2014 на SQL 2008) при прямом подключении файлов невозможно.
Шаг 4. Подключение (Attach) базы на новом сервере. На новом сервере, где у нас есть права администратора, воспользуемся командой Attach в SSMS или выполним SQL-скрипт:
USE [master]
GO
CREATE DATABASE [ИмяБазы_Новая]
ON (FILENAME = 'C:\Path\To\YourBase.mdf'),
(FILENAME = 'C:\Path\To\YourBase_log.ldf')
FOR ATTACH;
GO
Если нам все же необходимо восстановить контроль над текущим сервером без его переустановки, воспользуемся запуском SQL Server с флагом -m. Проанализируем этот алгоритм:
-m. Это переведет сервер в однопользовательский режим (Single-User Mode), где любой член локальной группы администраторов Windows имеет права sysadmin.sqlcmd и выполним команду добавления своего пользователя в админы:
EXEC sp_addsrvrolemember 'DOMAIN\User', 'sysadmin';
GO
После этого не забудьте убрать флаг -m и перезапустить службу в обычном режиме.
Выясним причину, по которой база выгружается в .dt, но не загружается обратно. Часто это происходит из-за того, что в файловом варианте 1С (в котором обычно проверяют «битость») механизмы контроля целостности мягче, чем в MS SQL. При загрузке в SQL сервер пытается создать индексы и накладывает ограничения уникальности. Если в таблице есть дублирующиеся записи, которые там оказаться не должны, процесс обрывается с ошибкой.
Вместо бесконечного «Тестирования и исправления» средствами 1С, которое для базы в 7 Гб может идти несколько суток, эффективнее использовать инструменты SQL. Рассмотрим основные команды для проверки и исправления:
Проверка базы на ошибки:
DBCC CHECKDB ('ИмяВашейБазы') WITH NO_INFOMSGS, ALL_ERRORMSGS;
Эта команда выведет список всех логических и физических повреждений. Если ошибки обнаружены, SQL Server предложит варианты исправления.
Исправление ошибок (Repair):
Для выполнения исправления базу нужно перевести в монопольный режим. Внимание: использование REPAIR_ALLOW_DATA_LOSS может привести к удалению поврежденных данных, поэтому предварительно обязательно сделайте копию файлов MDF/LDF.
ALTER DATABASE [ИмяВашейБазы] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DBCC CHECKDB ('ИмяВашейБазы', REPAIR_ALLOW_DATA_LOSS);
GO
ALTER DATABASE [ИмяВашейБазы] SET MULTI_USER;
GO
Если вы все же решили использовать файловый вариант (загрузив .dt в локальную базу) для исправления ошибок, обязательно используйте утилиту chdbfl.exe. Она находится в папке bin установленной платформы. Рассмотрим алгоритм действий:
chdbfl.exe.1Cv8.1CD.Проанализировав ситуацию, мы видим, что связка 1С и MS SQL предоставляет администратору гораздо больше инструментов для спасения данных, чем файловый вариант. Главное — не ограничиваться только средствами платформы 1С, а активно использовать возможности СУБД для диагностики и восстановления целостности таблиц.