Удаление информационной базы 1С из кластера и MS SQL Server без хвостов

· 10 мин

Содержание

Базу 1С с сервера SQL удаляют в два слоя. Сначала снимают регистрацию в кластере 1С: в консоли администрирования серверов 1С:Предприятия удаляют информационную базу и в появившемся окне выбирают вариант «Удалить базу данных». Тогда сервер 1С сам выполнит удаление базы на MS SQL Server. Если удалить только регистрацию, база данных останется на SQL-сервере и продолжит занимать диск — её добивают в SQL Server Management Studio командой DROP DATABASE.

Выбор способа простой. Консоль кластера — когда база одна и права у SQL-пользователя 1С есть. Утилита rac и PowerShell — когда баз много или удаление нужно встроить в регламент. Чистый SQL — когда регистрации в кластере уже нет, а «сиротская» база осталась.

Подготовка: финальная копия, сеансы и права

Удаление необратимо. Корзины у SQL Server нет, и база, удалённая через DROP DATABASE, вместе с ней теряет файлы данных. Перед удалением сделайте финальную резервную копию и убедитесь, что она читается.

Минимальный набор проверок перед началом:

  • 📦 Копия. Полный бэкап средствами SQL Server. Выгрузка .dt из Конфигуратора — по желанию, она удобна, если базу когда-нибудь придётся поднять на другой СУБД.
  • 👥 Сеансы. В консоли кластера откройте базу и посмотрите узел «Сеансы». Активные пользователи должны быть предупреждены и выйти сами.
  • 🔌 Соединения. Фоновые задания, регламентные задания и обмены держат соединения, даже когда людей в базе нет.
  • 🔑 Учётные данные. Нужны логин и пароль администратора самой информационной базы (пользователь 1С с административными правами) и, при наличии, пароль администратора кластера.
  • 🗄️ Права SQL-пользователя. Учётная запись, под которой 1С подключается к SQL Server, должна иметь право удалить базу: быть её владельцем (db_owner) или входить в роль сервера dbcreator/sysadmin.

Финальную копию удобнее всего снять так:

BACKUP DATABASE [buh_old]
TO DISK = N'D:\Backup\buh_old_final.bak'
WITH COPY_ONLY, CHECKSUM, STATS = 10;

RESTORE VERIFYONLY FROM DISK = N'D:\Backup\buh_old_final.bak';

COPY_ONLY не ломает цепочку разностных бэкапов, если на базу настроен план обслуживания. Имя buh_old здесь и дальше — пример, подставьте своё.

Чтобы новые пользователи не зашли во время работ, в свойствах информационной базы в консоли кластера включите флажок «Блокировка начала сеансов включена», задайте сообщение и код разрешения. После этого оставшиеся сеансы можно завершить вручную.

Принудительное завершение сеанса обрывает работу пользователя без сохранения. Делайте это после предупреждения и вне рабочего времени, если база ещё кем-то используется.

Удаление базы 1С через консоль кластера

Основной способ — оснастка «Администрирование серверов 1С Предприятия». Она подключается к агенту сервера 1С (по умолчанию порт 1540) и показывает все зарегистрированные базы.

  1. Откройте консоль, раскройте Central 1C:Enterprise 8.3 servers → <имя сервера> → Кластеры → <кластер> → Информационные базы.
  2. Найдите нужную базу. Сверьте имя в кластере с именем базы на SQL-сервере в её свойствах: они могут не совпадать.
  3. Щёлкните по базе правой кнопкой и выберите «Удалить».
  4. Введите логин и пароль администратора информационной базы.
  5. В окне выбора действия с базой данных отметьте один из трёх вариантов.
  6. Подтвердите удаление и дождитесь, пока база исчезнет из списка.

Что делает каждый вариант:

ВариантЧто происходит на SQL ServerКогда выбирать
Оставить базу данных без измененийНичего, удаляется только регистрация в кластереБазу переносят на другой сервер 1С или хотят подключить заново позже
Очистить базу данныхТаблицы 1С удаляются, пустая база остаётсяНужна пустая база с тем же именем и правами
Удалить базу данныхБаза удаляется целиком вместе с файламиБазу выводят из эксплуатации окончательно

💡 Если сомневаетесь, выберите первый вариант. Регистрацию в кластере восстановить легко, а базу данных после DROP — только из бэкапа.

Ещё один момент: при варианте «Удалить базу данных» команду на SQL Server выполняет сервер 1С от имени SQL-пользователя из свойств базы. Если у этой учётной записи не хватает прав, база в кластере может пропасть, а на SQL-сервере остаться. Это не страшно: её удаляют вручную по следующему разделу.

Удаление базы данных на SQL Server вручную

Ручное удаление нужно в трёх случаях: регистрацию в кластере сняли без удаления базы, консоль вернула ошибку прав или база давно «осиротела» после переезда.

Проверить, кто подключён

Откройте SQL Server Management Studio и выполните запрос в контексте master:

SELECT session_id, login_name, host_name, program_name, status
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID(N'buh_old');

Если в program_name видны рабочие процессы 1С, база всё ещё зарегистрирована в каком-то кластере. Остановитесь и проверьте это, иначе удалите живую базу.

Удалить базу

USE master;
GO
ALTER DATABASE [buh_old] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DROP DATABASE [buh_old];
GO

SET SINGLE_USER WITH ROLLBACK IMMEDIATE откатывает незавершённые транзакции и выбрасывает все подключения. Без этой строки DROP упадёт с ошибкой «база используется», если к ней кто-то подключён хотя бы на секунду.

То же самое можно сделать мышкой: в обозревателе объектов щёлкнуть по базе правой кнопкой → «Удалить» и в окне отметить флажок «Закрыть существующие соединения». Второй флажок, про удаление истории резервного копирования, разобран ниже.

ROLLBACK IMMEDIATE прерывает всё, что выполняется в базе, включая обмены и регламентные задания 1С. Запускайте только после того, как база снята с кластера.

Логин SQL Server, который остался от базы

Вместе с базой данных удаляется и её пользователь базы данных (database user). А вот логин уровня сервера (server login) остаётся. Если под каждую базу 1С заводили свой логин, после удаления на сервере копятся «пустые» учётные записи.

Прежде чем удалять логин, проверьте, не нужен ли он другим базам:

EXEC sp_MSforeachdb N'
USE [?];
SELECT DB_NAME() AS db, dp.name AS db_user
FROM sys.database_principals dp
JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE sp.name = N''usr1c_buh_old'';';

Пустой результат по всем базам значит, что логин свободен. Тогда:

DROP LOGIN [usr1c_buh_old];

🚫 Не удаляйте общий логин, под которым кластер 1С подключается ко всем базам сервера (часто это sa или отдельный служебный логин). Иначе перестанут открываться остальные базы.

Если логин — владелец каких-то других баз, DROP LOGIN вернёт ошибку. Смените владельца командой ALTER AUTHORIZATION ON DATABASE::[имя] TO [sa]; и повторите.

Файлы mdf/ldf, журнал транзакций и прочие остатки

DROP DATABASE для базы в состоянии ONLINE сам удаляет файлы данных .mdf и журнала транзакций .ldf. Остатки бывают в других ситуациях:

  • 📁 База была в состоянии OFFLINE или её отсоединили (Detach) — тогда SQL Server файлы не трогает, их удаляют руками из папки данных.
  • 🧾 Бэкапы .bak и .trn лежат в папке резервного копирования, их удаление — отдельное решение.
  • 📜 История бэкапов хранится в msdb и раздувает её со временем.
  • 🗂️ На сервере 1С остаётся служебная папка базы с журналом регистрации.

Путь к файлам удобно записать до удаления:

SELECT name, physical_name, type_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'buh_old');

Историю резервного копирования удалённой базы чистит системная процедура:

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'buh_old';

Папка базы на сервере 1С

Сервер 1С держит для каждой базы каталог с её идентификатором в папке кластера, например C:\Program Files\1cv8\srvinfo\reg_1541\<GUID базы>. Там журнал регистрации (1Cv8Log) и служебные данные сеансов. После удаления регистрации каталог иногда остаётся и может весить гигабайты из-за журнала.

Узнать GUID удалённой базы проще всего заранее: выполните rac infobase summary list до удаления и сохраните вывод. Если GUID потерян, сравните имена папок в reg_1541 со списком действующих баз — лишний каталог и есть остаток.

Папка reg_1541 зависит от порта менеджера кластера. Если кластер поднят на другом порту, имя будет другим, например reg_2541.

Список баз у пользователей

У сотрудников база ещё видна в окне запуска 1С. Список хранится в файле %APPDATA%\1C\1CEStart\ibases.v8i. Удалите строку базы кнопкой «Удалить» в окне запуска или через общий файл списка, если вы раздаёте его централизованно.

Скрипт PowerShell для пакетного удаления

Когда нужно убрать десяток тестовых копий, консоль кластера утомляет. Утилита rac из каталога платформы работает через сервер администрирования ras (по умолчанию порт 1545), поэтому служба ras должна быть запущена.

Последовательность команд:

  1. rac cluster list — получить GUID кластера.
  2. rac infobase summary list --cluster=<GUID> — найти GUID базы по имени.
  3. rac infobase drop с ключом --drop-database удаляет регистрацию вместе с базой на SQL Server, с ключом --clear-database — очищает её. Без этих ключей удаляется только регистрация.

Набросок скрипта, который удаляет одну базу по имени:

$rac   = "C:\Program Files\1cv8\8.3.24.1691\bin\rac.exe"   # подставьте свою версию
$ras   = "localhost:1545"
$ibName = "buh_old"
$ibUser = "Администратор"
$ibPwd  = "пароль"

# GUID кластера
$cluster = (& $rac $ras cluster list |
    Select-String '^cluster\s*:\s*(.+)$').Matches[0].Groups[1].Value.Trim()

# GUID базы по имени
$lines = & $rac $ras infobase summary list --cluster=$cluster
$ib = $null
for ($i = 0; $i -lt $lines.Count; $i++) {
    if ($lines[$i] -match '^infobase\s*:\s*(.+)$') { $guid = $Matches[1].Trim() }
    if ($lines[$i] -match '^name\s*:\s*(.+)$' -and $Matches[1].Trim() -eq $ibName) {
        $ib = $guid; break
    }
}
if (-not $ib) { Write-Error "База $ibName не найдена"; exit 1 }

& $rac $ras infobase drop --cluster=$cluster --infobase=$ib `
    --infobase-user=$ibUser --infobase-pwd=$ibPwd --drop-database

Перед тем как ставить такой скрипт в планировщик, проверьте точный синтаксис на своей версии платформы командой rac help infobase. Если у кластера задан администратор, добавьте к командам ключи --cluster-user и --cluster-pwd.

Для SQL-части (история бэкапов, логины) удобен командлет Invoke-Sqlcmd из модуля SqlServer:

Invoke-Sqlcmd -ServerInstance "SQL01" -Database "msdb" `
  -Query "EXEC dbo.sp_delete_database_backuphistory @database_name = N'buh_old';"

⚠️ Пароли в открытом виде в скрипте — плохая практика. Храните их в защищённом хранилище учётных данных или запрашивайте при запуске.

Как убедиться, что от базы ничего не осталось

Короткий контроль после работ:

Проверка после удаления базы
Выполнено: 0 / 7

Пункт про SQL Agent часто забывают. План обслуживания, в котором база была выбрана явно, после удаления начнёт падать каждую ночь. Откройте Управление → Планы обслуживания в SSMS и уберите базу из задач.

Ошибки при удалении и что с ними делать

Диагностика: выберите симптом

Частые вопросы

Можно ли восстановить базу после DROP DATABASE?
Только из резервной копии. SQL Server не хранит удалённые базы, а файлы mdf и ldf удаляются вместе с ней.
Удаление базы 1С освобождает клиентскую лицензию?
Лицензии занимают сеансы, а не базы. Как только сеансы завершены, лицензии освобождаются, удаление базы на это не влияет.
Нужно ли останавливать службу сервера 1С для удаления базы?
Нет. Удаление делается на работающем кластере. Остановка службы оборвёт сеансы во всех остальных базах сервера.
Что безопаснее: очистить базу или удалить её?
Очистка оставляет пустую базу с прежними правами и настройками файлов — удобно, если на её место сразу загрузят новую. Удаление полностью освобождает место.
Можно ли удалить базу, просто стерев файлы mdf и ldf?
Нет. SQL Server держит файлы открытыми, а в системных таблицах останется запись о базе в состоянии ошибки. Удаляйте через DROP DATABASE.