В процессе эксплуатации систем на базе MS SQL Server Express часто возникает критическая ситуация: размер базы данных достигает лимита в 10 ГБ, что блокирует работу веб-сервисов. Если пароль администратора SQL сервера утерян, а доступ к серверу нужен срочно, рассмотрим, как можно восстановить контроль над экземпляром, используя права локального администратора операционной системы Windows.
Для сброса прав или создания нового администратора SQL сервера необходимо перевести службу в режим Single User Mode. Этот режим позволяет любому пользователю с правами администратора Windows подключаться к SQL серверу с правами sysadmin.
SQL Server через оснастку services.msc. Убедитесь, что служба SQL Server Agent также остановлена, так как она может занять единственное доступное соединение.-m. Для этого откройте командную строку от имени администратора и выполните:
net start MSSQLSERVER /m
*Примечание: Если у вас именованный экземпляр, имя службы будет выглядеть как MSSQL$ИмяЭкземпляра.*После запуска службы в режиме -m, мы можем подключиться к серверу через SQL Server Management Studio (SSMS) от имени администратора Windows.
SSMS и подключитесь к серверу, используя аутентификацию Windows.sysadmin:
USE [master];
GO
CREATE LOGIN [MyNewAdmin] WITH PASSWORD = 'StrongPassword123';
ALTER SERVER ROLE [sysadmin] ADD MEMBER [MyNewAdmin];
GO
SQL Server и запустите её в обычном режиме (без параметра -m).После получения доступа к базе данных необходимо освободить место, чтобы вернуть систему в рабочее состояние. Поскольку файл .mdf уже достиг лимита, обычное удаление строк через DELETE может привести к еще большему росту лога транзакций .ldf. Используем более эффективные методы.
TRUNCATE TABLE. Она не записывает удаление каждой строки в лог, что критически важно при нехватке места:
USE [MYBASE];
GO
TRUNCATE TABLE [MyTable];
GO
.mdf на диске останется прежним. Чтобы операционная система «увидела» освободившееся пространство, необходимо выполнить сжатие базы данных:
USE [MYBASE];
GO
DBCC SHRINKDATABASE (N'MYBASE', 10);
GO
Если после манипуляций с базой данных (отсоединение/присоединение или перенос) веб-сервис выдает ошибку Login failed for user 'NT AUTHORITY\SYSTEM', значит, нарушена связь между пользователем базы данных и логином сервера (проблема «осиротевших» пользователей).
Чтобы исправить это, выполните команду для синхронизации SID:
USE [MYBASE];
GO
EXEC sp_change_users_login 'Auto_Fix', 'NT AUTHORITY\SYSTEM';
GO
Помните, что MS SQL Server Express имеет жесткое ограничение на размер базы. Если объем данных постоянно растет, регулярная очистка и SHRINKDATABASE — это лишь временные меры. Рассмотрите возможность архивации старых данных или перехода на версию SQL Server Standard (если позволяет лицензионная политика), так как работа «впритык» к лимиту 10 ГБ часто приводит к повреждению целостности базы при внезапных сбоях питания или нехватке места на диске.
При выполнении команд всегда делайте резервную копию файлов .mdf и .ldf перед началом любых манипуляций, так как при работе в Single User Mode риск случайного удаления данных возрастает.