sql >> Database >  >> RDS >> Sqlserver

SQL Server-systeemdatabases - Systeemdatabases herstellen

In de vorige artikelen van de serie SQL Server-systeemdatabases hebben we het doel van alle SQL Server-systeemdatabases die deel uitmaken van de SQL Server-installatie geleerd en hebben we de best practices begrepen die voor hen moeten worden geïmplementeerd. We hebben ook de Tempdb- en MSDB-databases in meer detail begrepen. Aangezien Back-up en herstel van de systeemdatabase enigszins verschilt van gebruikersdatabases, zullen we in dit artikel in detail bespreken hoe u een back-up van systeemdatabases maakt en de systeemdatabase herstelt vanuit back-ups.

Back-up SQL-database

De term Back-up verwijst naar het kopiëren van de gegevens in een database als een back-upbestand dat kan worden gebruikt om de gegevens verder te herstellen of te herstellen.

Een volledige back-up van een database bevat de gegevenskopieën over gegevensbestanden en logbestanden om ofwel te herstellen als een database of om het herstel op een bepaald tijdstip uit te voeren in geval van rampen of catastrofale storingen. Daarom zijn regelmatige volledige back-ups op het systeem en de gebruikersdatabases cruciaal.

Naast volledige back-up ondersteunt SQL Server verschillende andere back-upopties, zoals differentiële back-up, transactielogboekback-up, bestandsback-up, enz., maar we gaan hier niet op focussen omdat dit buiten het bestek van dit artikel valt.

Een volledige databaseback-up moet worden gepland om periodiek of na specifieke configuratiewijzigingen te worden uitgevoerd. Hoewel SQL Server de volledige databaseback-up in verschillende bestandsextensies kan accepteren, wordt het aanbevolen om die back-up op te slaan als een *.bak-bestand voor eenvoudiger classificatie en onderhoud.

De back-updatabasesyntaxis heeft veel opties beschikbaar, maar we zullen ons alleen concentreren op de fundamentele opdrachten die nodig zijn om de volledige back-up van een database te maken. De volledige syntaxis is aanwezig in het MSDN-artikel.

BACK-UP DATABASE-syntaxis (minimaal)

BACKUP DATABASE <Database_name> 
TO DISK = <File_Path>
GO

Back-up gebruikersdatabases

Een volledige back-up maken van de AdventureWorks database, vervang gewoon de Databasenaam en Bestandspad in het bovenstaande BACKUP DATABASE-commando en voer het uit:

BACKUP DATABASE [AdventureWorks] 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak'
GO

Back-up systeemdatabases

Met de bovenstaande opdracht BACKUP DATABASE kunnen we een volledige back-up maken van systeemdatabases, zoals master, msdb en model:

BACKUP DATABASE master 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\master_Full.bak'
GO
BACKUP DATABASE model 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\model_Full.bak'
GO
BACKUP DATABASE msdb 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\msdb_Full.bak'
GO

We kunnen naar het bovenstaande mappad navigeren en daar zien we de volledige databaseback-ups die met succes zijn gemaakt voor zowel de gebruikersdatabase als de systeemdatabases:

Is het mogelijk om een ​​back-up te maken van de tempdb-database?

Laten we proberen een volledige back-up te maken van de tempdb-systeemdatabase met dezelfde BACKUP DATABASE-syntaxis:

BACKUP DATABASE tempdb 
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\tempdb_Full.bak'
GO

Zoals we in eerdere artikelen hebben besproken, tempdb is de enige database waarvoor een Backup kan niet worden gebruikt . De tempdb-database wordt opnieuw gemaakt wanneer SQL Server-services worden gestart. Als er dus problemen zijn met tempdb, zal het herstarten van de SQL Server-service helpen om deze op te lossen.

Database herstellen

Het herstellen van een database vanuit Full Backup(*.bak) brengt de database terug met volledige gegevens of "draait" een database terug naar een bepaald punt in de tijd. De opdracht RESTORE kan ook worden gebruikt om bestanden, bestandsgroepen of transactielogboeken te herstellen, maar dit valt buiten het bestek van dit artikel.

Om een volledige databaseback-up te herstellen , kunnen we de onderstaande syntaxis gebruiken. Opmerking:net als bij het BACKUP-commando, heeft het RESTORE-commando veel opties, maar we zullen alleen een beroep doen op de basisopties. U kunt gedetailleerde informatie over deze opties vinden in een speciaal MSDN-artikel.

HERSTEL DATABASE-syntaxis

RESTORE DATABASE <Database_Name> 
FROM  DISK = <File Path>
WITH  REPLACE
GO

Gebruikersdatabase herstellen

Om de AdventureWorks . te herstellen database van de volledige back-up die we eerder hebben gemaakt, kunnen we de opdracht RESTORE DATABASE gebruiken, ter vervanging van de Databasenaam en Bestandspad zoals hieronder weergegeven:

RESTORE DATABASE [AdventureWorks] 
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak' 
WITH REPLACE
GO

Modeldatabase herstellen

Laten we proberen de modelsysteemdatabase te herstellen met behulp van de opdracht RESTORE DATABASE:

RESTORE DATABASE model 
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\model_Full.bak' 
WITH REPLACE
GO

De back-up van een modeldatabase kan met succes worden hersteld met behulp van de standaardopdracht RESTORE DATABASE.

Hoofddatabase herstellen

Laten we nu proberen de hoofddatabase van het systeem te herstellen met de opdracht RESTORE DATABASE:

RESTORE DATABASE master 
FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\master_Full.bak' 
WITH  REPLACE
GO

Het gaf een foutmelding dat het SQL Server-exemplaar in de modus voor één gebruiker moet worden uitgevoerd om de hoofddatabase te herstellen. Zoals de foutmelding aangeeft, moeten we onze SQL Server-instantie starten in de modus voor één gebruiker en vervolgens proberen de hoofddatabase te herstellen.

Om een ​​SQL Server-instantie in de modus voor één gebruiker te starten, kunnen we een van de volgende methoden toepassen:

  • Opdrachtprompt
  • SQL Server-opstartparameters in de SQL Server Configuration Manager.

Opdrachtpromptbenadering

Om het SQL Server-exemplaar te starten in de modus voor één gebruiker via de opdrachtprompt, opent u de opdrachtprompt met Als administrator uitvoeren optie zoals hieronder getoond:

Als het klaar is, typt u de opdracht:

NET STOP <SQL_Server_Service_Name>

De SQL_Server_Service_Name kan worden verkregen via de SQL Server Configuration Manager of services.msc

SQL Server Configuration Manager

Services.msc

Aangezien onze SQL Server-service de standaardinstantie is, kunnen we de naam MSSQLSERVER gebruiken zoals hierboven aangegeven. Eenmaal ingevoerd, zal het om bevestiging vragen om alle afhankelijke services te stoppen. We kunnen de SQL Server Agent-service ook stoppen door Y . in te typen voor Ja .

Wanneer de SQL Server-service is gestopt, kunnen we deze starten in de modus voor één gebruiker. Voer de onderstaande opdracht uit waar /m betekent het starten van SQL Server Service in de modus voor één gebruiker.

NET START MSSQLSERVER /m

Wanneer het wordt uitgevoerd, kunnen we proberen de hoofddatabase te herstellen. Voer de opdracht RESTORE BACKUP uit zoals eerder:

Door SQL Server Instance in Single-User-modus te starten, kunnen we de hoofdsysteemdatabase zonder problemen herstellen vanaf de laatst bekende Full Database Backup. We hebben dus geleerd dat om de hoofddatabase te herstellen, de SQL Server-instantie in de modus voor één gebruiker moet staan.

Met een SQL Server-instantie in de modus voor één gebruiker, kan slechts één gebruiker verbinding maken en nadat onze herstelactiviteiten zijn voltooid, moeten we deze terugzetten naar de modus voor meerdere gebruikers door de SQL Server-instantie te stoppen en de SQL Server-instantie zonder de optie /m te starten, zoals weergegeven hieronder:

NET STOP MSSQLSERVER
NET START MSSQLSERVER

Eenmaal gestart in de normale modus of de modus voor meerdere gebruikers, kunnen alle gebruikers verbinding maken met de SQL Server-instantie en hun activiteiten uitvoeren. We kunnen ook controleren of de hoofddatabase is hersteld tot het moment waarop volledige back-up werd gemaakt en dat eventuele configuratiewijzigingen daarna opnieuw moeten worden uitgevoerd.

Een paar dingen om op te merken als de SQL Server-instantie zich in de modus voor één gebruiker bevindt:

  • Als de SQL Server-instantie zich in de modus voor één gebruiker bevindt, kan er slechts één gebruikerssessie verbinding mee maken. Zorg er daarom voor dat de SQL Server Agent-service en alle andere SQL Server-gerelateerde services zich in de stopped bevinden. toestand. Anders kunnen die verbindingen eerst tot stand komen en als dit gebeurt, kunnen we geen verbinding maken met SQL Server om de database te herstellen.
  • Terwijl u verbinding maakt via SSMS in een modus voor één gebruiker, koppelt u de Objectverkenner los en maakt u alleen verbinding via het Query-venster. Als er een verbinding tot stand wordt gebracht vanuit de Objectverkenner, wordt er één verbinding tot stand gebracht. Daarom kunt u geen verbinding maken vanuit het queryvenster. Raadpleeg de onderstaande schermafbeelding – deze laat zien hoe u alleen verbinding kunt maken met het venster Nieuwe query zonder verbinding te maken via Objectverkenner:

SQL Server-opstartparameter in Configuration Manager

Degenen die meer vertrouwd zijn met GUI in plaats van de opdrachtprompt, kunnen de onderstaande aanpak toepassen.

1). Open de SQL Server Configuration Manager door MSSQLManager13.msc . te typen in de opdrachtprompt. Hier verwijst 13 naar SQL Server 2016, dus gebruik de juiste corresponderende nummers voor andere versies van SQL Server:

  • SQL Server 2012SQLServerManager11.msc
  • SQL Server 2014SQLServerManager12.msc
  • SQL Server 2016SQLServerManager13.msc
  • SQL Server 2017SQLServerManager14.msc
  • SQL Server 2019SQLServerManager15.msc

2). Vouw SQL Server Services uit :

3). Klik met de rechtermuisknop op SQL Server Service geïdentificeerd als SQL Server (MSSQLSERVER) > Eigenschappen .

4). Selecteer de Opstartparameters menutab.

5). Klik op -m in de Geef een opstartparameter op veld en klik vervolgens op Toevoegen om de SQL Server-service te starten in een modus voor één gebruiker.

6). Klik op OK en start de SQL Server-service opnieuw om de SQL Server-service te starten in de modus voor één gebruiker.

Om het SQL Server-exemplaar te wijzigen van de modus voor één gebruiker naar de modus voor meerdere gebruikers of de normale modus na het herstellen van de hoofddatabase, klikt u gewoon op -m parameter van Bestaande parameter s , Klik op Verwijderen en start de SQL Server-service opnieuw.

MSDB-database herstellen

Laten we nu proberen de back-up van de msdb-systeemdatabase te herstellen met de standaardopdracht RESTORE DATABASE:

RESTORE DATABASE msdb 
FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\msdb_Full.bak' 
WITH  REPLACE
GO

Deze poging levert een foutmelding op waarin staat dat Exclusieve toegang niet kon worden verkregen omdat de database in gebruik is . Deze foutmelding geeft aan dat een ander proces msdb . gebruikt . We moeten dus een van de onderstaande benaderingen toepassen om de msdb-database correct te herstellen:

  • Start de SQL Server-instantie of -service in de modus voor één gebruiker zoals we eerder hebben gedaan om te voorkomen dat iemand verbinding maakt en toegang krijgt tot de msdb database.
  • Of breng de msdb database naar de modus voor één gebruiker zonder dat een gebruiker er verbinding mee maakt.

Omdat we weten hoe we de SQL Server Instance of Service in single-user modus kunnen zetten terwijl we de hoofdsysteemdatabase herstellen, zullen we de tweede optie proberen door de msdb-database te wijzigen in Single-user modus om de back-up van de msdb-database te herstellen.

Voer het onderstaande commando uit:

USE [master]
GO
ALTER DATABASE [msdb] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

Belangrijk :De uitvoering van het bovenstaande commando kan in de volgende gevallen mislukken:

  • De SQL Server Agent-service is actief. Om de fout op te lossen, stopt u de SQL Server Agent-service en probeert u het opnieuw.
  • Alle gebruikerssessies zijn verbonden met de msdb-database. We kunnen actieve verbindingen met msdb of een andere database achterhalen door de onderstaande vraag te gebruiken:
use master
GO
select spid
from sys.sysprocesses
where dbid = db_id('msdb')

Als deze query resultaten oplevert, geeft dit aan dat sommige gebruikerssessies zijn verbonden met de msdb-database. In dit geval moeten we die sessies beëindigen met het KILL-commando en de spid . vervangen verkregen uit de bovenstaande query-uitvoering:

KILL <spid>

Als er geen sessies zijn verbonden met de msdb database, zullen we in staat zijn om de msdb-database met succes in de modus voor één gebruiker te brengen. Telkens wanneer een database zich in de modus voor één gebruiker bevindt, kunnen we het woord (één gebruiker) in de buurt van de database zien, zoals hieronder gemarkeerd voor de msdb-database:

Laten we proberen de msdb . te herstellen database nu met behulp van onze RESTORE DATABASE-opdracht:

Met de msdb-database in de modus voor één gebruiker konden we msdb . herstellen database succesvol vanaf de laatst bekende goede Volledige back-up van msdb databank. Als u een database terugzet vanaf een back-up, wordt deze standaard in de modus voor meerdere gebruikers gebracht en als deze om welke reden dan ook nog steeds in de modus voor één gebruiker staat, kunnen we de onderstaande opdracht uitvoeren om deze terug te brengen naar de modus voor meerdere gebruikers:

USE [master]
GO
ALTER DATABASE [msdb] SET MULTI_USER
GO

Systeemdatabases opnieuw opbouwen

Voor elke ideale productie omgevingen, is het van cruciaal belang om een ​​volledige back-up van systeemdatabases te hebben om de systeemdatabases te herstellen zonder enig gegevensverlies in het geval van onopzettelijke fouten door gebruikers of databasecorrupties of noodherstel.

In het ergste geval, als SQL Server Services niet kan worden gestart, moeten we eerst proberen de systeemdatabases te herstellen van de laatst bekende volledige back-ups en als we geen volledige back-ups beschikbaar hebben en SQL Server Services niet kunnen starten, dan zijn we rest met slechts één laatste optie, namelijk Het opnieuw opbouwen van de systeemdatabases. Opmerking :Door systeemdatabases opnieuw op te bouwen, worden alle configuraties op serverniveau gewist die zijn opgeslagen in alle systeemdatabases en kunnen we alle configuraties op server-/instantieniveau verliezen, zoals aanmeldingen, SQL Server Agent-configuraties en andere kritieke details die zijn opgeslagen in de systeemdatabases die we in onze vorige artikelen hebben gezien.

Laten we even kijken hoe systeemdatabases opnieuw kunnen worden opgebouwd (zoals hierboven vermeld, moet dit proces worden uitgevoerd als een laatste maatregel om de SQL Server-instantie terug te halen als er geen volledige back-ups van systeemdatabases zijn).

Om de systeemdatabases opnieuw op te bouwen, hebben we de SQL Server-installatiemedia nodig, ofwel aangekoppeld of gekopieerd naar de server waarop onze SQL Server-instantie is geïnstalleerd. Als het klaar is, moeten we de onderstaande stappen volgen:

  1. Navigeer in de opdrachtprompt naar het pad waar de installatiebestanden van SQL Server (setup.exe) zich bevinden:

    C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\SQLServer2016
  2. Voer de onderstaande opdracht uit en vervang alle parameters door geldige waarden. Waarde ACTIE =REBUILDDATABASE geeft aan dat alle systeemdatabases opnieuw moeten worden opgebouwd na het uitvoeren van die opdracht.
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName]

Te wijzigen parameters zijn onder meer:

  • InstanceName – de instantienaam van SQL Server, in ons geval is dit RRJ
  • Accounts – de sysadmin-accountnaam, in ons geval is dit sa
  • SterkWachtwoord – een sterk wachtwoord voor de sa sysadmin-account.
  • CollatieNaam – de sorteernaam van de SQL Server-database als deze moet worden gewijzigd.

Conclusie

We hebben geleerd hoe we een back-up kunnen maken van gebruikers- en systeemdatabases en hebben de aanvullende maatregelen begrepen die nodig zijn om systeemdatabases zoals master- en msdb-systeemdatabases te herstellen. In het geval dat volledige back-ups van systeemdatabases ontbreken, hebben we ook geleerd hoe u systeemdatabases opnieuw kunt opbouwen vanaf SQL Server-installatiemedia en hebben we de configuratiegerelateerde gegevensverliezen begrepen die optreden bij het opnieuw opbouwen van systeemdatabases. Samenvattend begrepen we indirect het belang van het plannen van volledige back-ups voor systeemdatabases naast gebruikersdatabases.

Bedankt voor je tijd, en we zullen elkaar snel weer ontmoeten met een ander interessant artikel.


  1. Datum- en tijdseenheden in MySQL (volledige lijst)

  2. Postgres VOOR LUS

  3. Hoe te migreren van MSSQL naar MySQL

  4. Hoe de RTRIM()-functie werkt in MySQL