Tryb SINGLE_USER pozwala połączyć się z bazą tylko jednemu klientowi, wykorzystywany przy operacjach naprawczych.
Na czym polega tryb SINGLE_USER w SQL Server
Tryb SINGLE_USER w Microsoft SQL Server ogranicza dostęp do wskazanej bazy danych do jednego połączenia użytkownika. Nie oznacza to wyłączenia całej instancji ani przełączenia wszystkich baz w tryb tylko do odczytu. Zmiana dotyczy konkretnej bazy i jej właściwości dostępu. Ustawienie wykonuje się poleceniem ALTER DATABASE, na przykład ALTER DATABASE NazwaBazy SET SINGLE_USER. Po przełączeniu SQL Server pozwala nawiązać tylko jedną aktywną sesję korzystającą z tej bazy.
Mechanizm jest przeznaczony przede wszystkim do czynności administracyjnych i naprawczych, podczas których równoczesne połączenia mogłyby zmienić dane albo zablokować operację. Przykładem jest przywracanie bazy, odtwarzanie spójności struktur za pomocą DBCC CHECKDB, zmiana niektórych właściwości bazy lub praca wymagająca wyłącznego dostępu. Tryb nie zastępuje kopii zapasowej i nie naprawia automatycznie uszkodzeń. Jedynie ogranicza liczbę dopuszczonych połączeń.
Przełączenie bazy i zakończenie obcych sesji
Najprostsza forma polecenia ALTER DATABASE ... SET SINGLE_USER może nie wystarczyć, jeżeli do bazy są już podłączone aplikacje, usługi albo narzędzia administracyjne. W takiej sytuacji SQL Server może odmówić zmiany trybu albo pojedyncze połączenie zostanie zajęte przez proces, który nie wykonuje planowanej operacji. Dlatego przy kontrolowanym oknie serwisowym stosuje się opcjonalną klauzulę WITH ROLLBACK IMMEDIATE albo WITH ROLLBACK AFTER.
ROLLBACK IMMEDIATE powoduje natychmiastowe rozłączenie innych transakcji i wycofanie ich niezakończonych zmian. Może to oznaczać utratę pracy wykonanej przez aplikację, jeżeli nie została wcześniej zatwierdzona instrukcją COMMIT. Wariant ROLLBACK AFTER pozwala odczekać określoną liczbę sekund, aby transakcje zakończyły się w sposób kontrolowany, a dopiero później wycofuje te, które nadal pozostają aktywne. Dobór wariantu powinien wynikać z wiedzy o stanie aplikacji i znaczeniu bieżących transakcji.
Przed zmianą trybu należy ustalić, które sesje korzystają z bazy. W SQL Server można w tym celu analizować między innymi widoki dynamicznego zarządzania sys.dm_exec_sessions i sys.dm_exec_requests, a także informacje o bazach w sys.databases. W praktyce trzeba uwzględnić nie tylko główną aplikację, lecz również zadania harmonogramu, usługi monitorujące, otwarte okna w SQL Server Management Studio oraz automatyczne mechanizmy ponawiające połączenia.
Wyłączne połączenie podczas operacji naprawczej
Po uzyskaniu trybu SINGLE_USER najważniejsze jest dopilnowanie, aby pierwsze połączenie trafiło do właściwego narzędzia. Samo otwarcie SQL Server Management Studio może wykorzystać jedyną dostępną sesję, zanim zostanie uruchomione polecenie naprawcze. Podobny problem może spowodować aplikacja działająca w tle, pulpit diagnostyczny albo usługa wykonująca cykliczne zapytania. Z tego powodu przed przełączeniem bazy zatrzymuje się procesy, które automatycznie nawiązują połączenia, oraz zamyka niepotrzebne okna zapytań.
W trakcie pracy trzeba odróżnić połączenie do bazy master od połączenia używanego przez właściwą bazę. Polecenie zmieniające tryb jest zwykle wykonywane z kontekstu master, ponieważ próba wykonania go z aktualnie używanej bazy może powodować konflikt z wymaganiem wyłącznego dostępu. Po zakończeniu czynności przywraca się normalny dostęp poleceniem ALTER DATABASE NazwaBazy SET MULTI_USER. Jeżeli tryb pozostanie ustawiony jako SINGLE_USER, zwykłe aplikacje mogą otrzymywać błędy logowania lub komunikaty o braku możliwości uzyskania połączenia.
Stan można zweryfikować w katalogu systemowym sys.databases. Kolumna user_access_desc pokazuje opis poziomu dostępu, między innymi MULTI_USER, RESTRICTED_USER albo SINGLE_USER. Warto sprawdzić również, czy zakończono aktywne żądania i czy nie pozostały otwarte transakcje. Po operacji naprawczej należy przeanalizować jej wynik, potwierdzić dostęp aplikacji oraz wykonać kontrolny test odczytu i zapisu zgodny z przeznaczeniem bazy.
Znaczenie trybu SINGLE_USER w praktyce serwisowej
Tryb SINGLE_USER dotyczy konkretnej bazy Microsoft SQL Server, a nie systemu Windows, całego komputera ani wszystkich programów korzystających z serwera. Jego użycie wymaga rozpoznania zależności między bazą, usługą aplikacyjną i narzędziami administracyjnymi. Nieprawidłowe wymuszenie rozłączenia może przerwać zapis danych, dlatego przed operacją trzeba potwierdzić, że aplikacja nie wykonuje krytycznej transakcji i że istnieje możliwość odtworzenia danych z kopii zapasowej.
Podczas diagnostyki komputera istotne jest także rozróżnienie problemu z trybem dostępu od problemu z samym silnikiem SQL Server. Komunikat o zajęciu bazy przez inne połączenie może wynikać z pozostawionej sesji, puli połączeń aplikacji, zadania SQL Server Agent albo niezamkniętego okna narzędzia administracyjnego. Dopiero po sprawdzeniu sesji, statusu bazy, logów SQL Server i wyniku konkretnej operacji można ocenić, czy występuje rzeczywiste uszkodzenie bazy, czy tylko nieprawidłowa organizacja dostępu.
Naprawa komputera z oprogramowaniem wykorzystującym SQL Server powinna obejmować zabezpieczenie danych, identyfikację aktywnych procesów, kontrolowane przełączenie trybu oraz przywrócenie MULTI_USER po zakończeniu prac. W przypadku laptopów i komputerów PC konieczne może być również sprawdzenie usług uruchamianych razem z systemem, konfiguracji klienta SQL Server oraz lokalnych błędów dysku, ponieważ awaria sprzętu może powodować skutki przypominające problem z dostępem do bazy.