I de tidligere artikler i SQL Server System Databases-serien har vi lært formålet med alle SQL Server System-databaser, der kommer som en del af SQL Server-installationen, og forstået den bedste praksis, der skal implementeres for dem. Vi har også forstået Tempdb- og MSDB-databaserne mere detaljeret. Da sikkerhedskopiering og gendannelse af systemdatabasen er en smule anderledes sammenlignet med brugerdatabaser, vil vi gennemgå, hvordan man sikkerhedskopierer systemdatabaser og gendan systemdatabase fra sikkerhedskopier i detaljer i denne artikel.
Sikkerhedskopiering af SQL-database
Udtrykket Backup henviser til kopiering af data inde i en database som en backup-fil, der kan bruges til at gendanne eller gendanne data yderligere.
En fuld sikkerhedskopi af en database vil indeholde datakopierne på tværs af datafiler og logfiler for enten at gendanne som en database eller udføre gendannelsen på et tidspunkt i tilfælde af katastrofer eller katastrofale fejl. Derfor er regelmæssige fulde sikkerhedskopier på systemet såvel som brugerdatabaser afgørende.
Bortset fra fuld sikkerhedskopiering, understøtter SQL Server flere andre sikkerhedskopieringsmuligheder såsom differentiel sikkerhedskopiering, sikkerhedskopiering af transaktionslog, sikkerhedskopiering af filer osv., men vi vil ikke fokusere på dem, da det er uden for denne artikels omfang.
En komplet databasesikkerhedskopiering bør planlægges til at udføre periodisk eller efter eventuelle specifikke konfigurationsændringer. Selvom SQL Server kan acceptere Full Database Backup i forskellige filtypenavne, anbefales det at gemme denne backup som en *.bak-fil for lettere klassificering og vedligeholdelse.
Sikkerhedskopieringsdatabasesyntaksen har mange muligheder, men vi vil kun fokusere på de grundlæggende kommandoer, der kræves for at tage den fulde sikkerhedskopi af enhver database. Den fulde syntaks findes i MSDN-artiklen.
BACKUP DATABASE Syntaks (minimal)
BACKUP DATABASE <Database_name>
TO DISK = <File_Path>
GO
Sikkerhedskopier brugerdatabaser
For at tage en fuld sikkerhedskopi af AdventureWorks database, skal du bare erstatte databasenavnet og Filsti i ovenstående BACKUP DATABASE-kommando og udfør den:
BACKUP DATABASE [AdventureWorks]
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak'
GO
Sikkerhedskopi af systemdatabaser
Ved at bruge ovenstående BACKUP DATABASE-kommando kan vi tage en fuld sikkerhedskopi af systemdatabaser, såsom master, msdb og 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
Vi kan navigere til ovenstående mappesti, og der ser vi de fulde database-backups, der er oprettet med succes for både brugerdatabasen og systemdatabaserne:
Er det muligt at sikkerhedskopiere tempdb-databasen?
Lad os prøve at tage en fuld sikkerhedskopi af tempdb-systemdatabasen ved at bruge den samme BACKUP DATABASE-syntaks:
BACKUP DATABASE tempdb
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\tempdb_Full.bak'
GO
Som vi diskuterede i tidligere artikler, tempdb er den eneste database, for hvilken en Sikkerhedskopi kan ikke tages . tempdb-databasen vil blive oprettet på ny, hver gang SQL Server-tjenester startes. Derfor, hvis der er problemer med tempdb, vil genstart af SQL Server-tjenesten hjælpe med at løse dem.
Gendan database
Gendannelse af en database fra Full Backup(*.bak) bringer databasen tilbage med komplette data eller "ruller tilbage" en database til et tidspunkt. Kommandoen RESTORE kan også bruges til at gendanne filer, filgrupper eller transaktionslogfiler, men det er ikke omfanget af den aktuelle artikel.
For at gendanne en komplet databasesikkerhedskopi , kan vi bruge nedenstående syntaks. Bemærk:I lighed med BACKUP-kommandoen har RESTORE-kommandoen mange muligheder, men vi vil kun appellere til de grundlæggende. Du kan finde detaljerede oplysninger om disse muligheder i en dedikeret MSDN-artikel.
GENDAN DATABASE-syntaks
RESTORE DATABASE <Database_Name>
FROM DISK = <File Path>
WITH REPLACE
GO
Gendan brugerdatabase
For at gendanne AdventureWorks database fra den fulde sikkerhedskopi, vi tog tidligere, kan vi bruge kommandoen RESTORE DATABASE, der erstatter Databasenavnet og Filsti som vist nedenfor:
RESTORE DATABASE [AdventureWorks]
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak'
WITH REPLACE
GO
Gendan modeldatabase
Lad os prøve at gendanne modelsystemdatabasen ved hjælp af kommandoen RESTORE DATABASE:
RESTORE DATABASE model
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\model_Full.bak'
WITH REPLACE
GO
Sikkerhedskopiering af modeldatabase kan gendannes med standardkommandoen RESTORE DATABASE.
Gendan masterdatabase
Lad os nu prøve at gendanne systemmasterdatabasen ved hjælp af kommandoen RESTORE DATABASE:
RESTORE DATABASE master
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\master_Full.bak'
WITH REPLACE
GO
Det gav en fejl om, at SQL Server-instansen skulle køre i enkeltbrugertilstand for at gendanne masterdatabasen. Som fejlmeddelelsen indikerer, skal vi starte vores SQL Server-instans i enkeltbrugertilstand og derefter prøve at gendanne masterdatabasen.
For at starte en SQL Server-instans i enkeltbrugertilstand kan vi anvende en af følgende metoder:
- Kommandoprompt
- SQL Server-startparametre i SQL Server Configuration Manager.
Kommandoprompt tilgang
For at starte SQL Server-instansen i en enkeltbrugertilstand via kommandoprompt skal du åbne kommandoprompten med Kør som administrator mulighed som vist nedenfor:
Når det er gjort, skal du indtaste kommandoen:
NET STOP <SQL_Server_Service_Name>
SQL_Server_Service_Name kan fås via SQL Server Configuration Manager eller services.msc
SQL Server Configuration Manager
Services.msc
Da vores SQL Server Service er standardinstansen, kan vi bruge navnet MSSQLSERVER som fremhævet ovenfor. Når den er indtastet, vil den bede om bekræftelse for at stoppe alle afhængige tjenester. Vi kan også stoppe SQL Server Agent Service ved at skrive Y for Ja .
Når SQL Server-tjenesten er stoppet, kan vi starte den i enkeltbrugertilstand. Kør nedenstående kommando hvor /m betyder at starte SQL Server Service i enkeltbrugertilstand.
NET START MSSQLSERVER /m
Når det er udført, kan vi forsøge at gendanne masterdatabasen. Kør kommandoen RESTORE BACKUP som før:
Ved at starte SQL Server Instance i enkeltbrugertilstand er vi i stand til at gendanne mastersystemdatabasen med succes fra den sidst kendte Full Database Backup uden problemer. Vi har således lært, at for at gendanne masterdatabasen skal SQL Server-instansen være i enkeltbrugertilstand.
Med SQL Server-forekomst i enkeltbrugertilstand kan kun én bruger oprette forbindelse, og efter at vores gendannelsesaktiviteter er afsluttet, skal vi ændre den tilbage til multibrugertilstand ved at stoppe SQL Server-forekomsten og starte SQL Server-forekomst uden /m-indstillingen som vist nedenfor:
NET STOP MSSQLSERVER
NET START MSSQLSERVER
Når de er startet i normal tilstand eller flerbrugertilstand, kan alle brugere oprette forbindelse til SQL Server-instansen og udføre deres aktiviteter. Vi kan også bekræfte, at masterdatabasen blev gendannet til det tidspunkt, hvor fuld sikkerhedskopiering blev taget, og eventuelle konfigurationsændringer, der udføres derefter, skal udføres igen.
Få ting at bemærke, mens SQL Server Instance er i enkeltbrugertilstand:
- Når SQL Server-instansen er i enkeltbrugertilstand, kan kun én brugersession oprette forbindelse til den. Sørg derfor for, at SQL Server Agent Service og alle andre SQL Server-relaterede tjenester er i stoppet status. Ellers kan disse forbindelser blive etableret først, og hvis det sker, kan vi ikke oprette forbindelse til SQL Server for at gendanne databasen.
- Mens du opretter forbindelse via SSMS i en enkeltbrugertilstand, skal du afbryde Object Explorer og kun oprette forbindelse via forespørgselsvinduet. Hvis der oprettes en forbindelse fra Objekt Explorer, etableres en enkelt forbindelse. Derfor kan du ikke oprette forbindelse fra forespørgselsvinduet. Se nedenstående skærmbillede – det viser, hvordan du kun forbinder vinduet Ny forespørgsel uden at oprette forbindelse via Objekt Explorer:
SQL Server Startup Parameter i Configuration Manager
De, der er mere komfortable med GUI i stedet for kommandoprompten, kan anvende nedenstående fremgangsmåde.
1). Åbn SQL Server Configuration Manager ved at skrive MSSQLManager13.msc ind i kommandoprompten. Her henviser 13 til SQL Server 2016, så brug de korrekte tilsvarende tal for andre versioner af SQL Server:
- SQL-server 2012 – SQLServerManager11.msc
- SQL-server 2014 – SQLServerManager12.msc
- SQL-server 2016 – SQLServerManager13.msc
- SQL-server 2017 – SQLServerManager14.msc
- SQL-server 2019 – SQLServerManager15.msc
2). Udvid SQL Server Services :
3). Højreklik på SQL Server Service identificeret som SQL Server (MSSQLSERVER) > Egenskaber .
4). Vælg Opstartsparametre menufanen.
5). Klik på -m i Angiv en opstartsparameter feltet, og klik derefter på Tilføj for at starte SQL Server Service i en enkeltbrugertilstand.
6). Klik på OK og genstart SQL Server Service for at starte SQL Server Service i enkeltbrugertilstand.
For at ændre SQL Server-forekomsten fra enkeltbrugertilstand til multibrugertilstand eller normal tilstand efter gendannelse af masterdatabasen, skal du blot klikke på -m parameter fra Eksisterende parameter s , Klik på Fjern og genstart SQL Server-tjenesten.
Gendan MSDB-database
Lad os nu prøve at gendanne msdb-systemets databasesikkerhedskopi ved hjælp af standardkommandoen RESTORE DATABASE:
RESTORE DATABASE msdb
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\msdb_Full.bak'
WITH REPLACE
GO
Dette forsøg giver os en fejl, der angiver Eksklusiv adgang kunne ikke opnås, fordi databasen er i brug . Denne fejlmeddelelse angiver, at en anden proces bruger msdb . Derfor skal vi anvende en af nedenstående fremgangsmåder for at gendanne msdb-databasen korrekt:
- Start SQL Server-instansen eller -tjenesten i enkeltbrugertilstand, som vi gjorde tidligere for at undgå, at nogen opretter forbindelse og får adgang til msdb database.
- Eller medbring msdb database til enkeltbrugertilstand uden at nogen bruger forbinder til den.
Da vi ved, hvordan vi sætter SQL Server-forekomsten eller -tjenesten til enkeltbrugertilstand, mens vi gendanner mastersystemdatabasen, vil vi prøve den anden mulighed ved at ændre msdb-databasen til enkeltbrugertilstand for at gendanne msdb-databasesikkerhedskopien.
Kør nedenstående kommando:
USE [master]
GO
ALTER DATABASE [msdb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
Vigtigt :Udførelsen af ovenstående kommando kan mislykkes i følgende tilfælde:
- SQL Server Agent Service er oppe og køre. For at rette fejlen skal du stoppe SQL Server Agent Service og prøve igen.
- Alle brugersessioner er forbundet til msdb-databasen. Vi kan finde ud af aktive forbindelser til msdb eller en anden database ved at bruge nedenstående forespørgsel:
use master
GO
select spid
from sys.sysprocesses
where dbid = db_id('msdb')
Hvis denne forespørgsel giver resultater, indikerer det, at nogle brugersessioner er forbundet til msdb-databasen. I dette tilfælde bør vi dræbe disse sessioner med KILL-kommandoen og erstatte spiden hentet fra ovenstående forespørgselsudførelse:
KILL <spid>
Når ingen sessioner er forbundet til msdb database, vil vi med succes kunne bringe msdb-databasen i enkeltbrugertilstand. Når en database er i enkeltbrugertilstand, vil vi være i stand til at se ordet (enkeltbruger) vist i nærheden af databasen som fremhævet nedenfor for msdb-databasen:
Lad os prøve at gendanne msdb database nu ved at bruge vores RESTORE DATABASE-kommando:
Med msdb-database i enkeltbrugertilstand var vi i stand til at gendanne msdb database med succes fra den sidst kendte gode Fuld backup af msdb database. Gendannelse af en database fra backup vil som standard bringe den til flerbrugertilstand, og hvis den stadig er i enkeltbrugertilstand af en eller anden grund, kan vi udføre nedenstående kommando for at bringe den tilbage til flerbrugertilstand:
USE [master]
GO
ALTER DATABASE [msdb] SET MULTI_USER
GO
Genopbyg systemdatabaser
Til enhver ideel produktion miljøer, er det afgørende at have en komplet sikkerhedskopi af systemdatabaser på plads for at gendanne systemdatabaserne uden tab af data i tilfælde af utilsigtede fejl fra brugere eller databasekorruption eller katastrofegenetablering.
I værste tilfælde, hvis SQL Server Services ikke kan startes, skal vi først prøve at gendanne systemdatabaserne fra sidst kendte fulde sikkerhedskopier, og hvis vi ikke har fulde sikkerhedskopier tilgængelige og ikke kunne starte SQL Server Services, så er vi tilbage med kun én sidste mulighed, dvs. genopbygning af systemdatabaserne. Bemærk :Genopbygning af systemdatabaser vil rydde alle konfigurationer på serverniveau, der er gemt på tværs af alle systemdatabaser, og vi kan miste alle konfigurationer på server-/instansniveau såsom logins, SQL Server Agent-konfigurationer, andre kritiske detaljer, der er gemt på tværs af systemdatabaserne, vi har set på tværs af vores tidligere artikler.
Lad os tage et hurtigt kig på, hvordan man genopbygger systemdatabaser (Som nævnt ovenfor bør denne proces udføres som en sidste foranstaltning for at bringe SQL Server-forekomsten tilbage i mangel af fuld sikkerhedskopiering af systemdatabaser).
For at genopbygge systemdatabaserne skal vi bruge SQL Server-installationsmediet, enten monteret eller kopieret til den server, hvor vores SQL Server Instance er installeret. Når det er gjort, skal vi følge nedenstående trin:
- I kommandoprompten skal du navigere til stien, hvor SQL Server-opsætningsfilerne (setup.exe) er placeret:
C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\SQLServer2016
- Udfør nedenstående kommando, og udskift alle parametre med gyldige værdier. Værdi ACTION =REBUILDDATABASE angiver, at alle systemdatabaser skal genopbygges efter udførelse af denne kommando.
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName]
Parametre, der skal ændres, omfatter:
- Forekomstnavn – Instance Name of SQL Server, i vores tilfælde er det RRJ
- Konti – sysadmin-kontonavnet, i vores tilfælde er det sa
- StrongPassword – en stærk adgangskode til sa sysadmin-konto.
- Samlingsnavn – Sorteringsnavnet på SQL Server-databasen, hvis det skal ændres.
Konklusion
Vi har lært at sikkerhedskopiere og gendanne bruger- og systemdatabaser og forstået de yderligere foranstaltninger, der kræves for at gendanne systemdatabaser som master- og msdb-systemdatabaser. I tilfælde af manglende fuldstændige sikkerhedskopier af systemdatabaser, har vi også lært, hvordan man genopbygger systemdatabaser fra SQL Server-installationsmedier og forstået de konfigurationsrelaterede datatab, der er involveret under genopbygning af systemdatabaser. For at opsummere, forstod vi indirekte vigtigheden af at planlægge fulde sikkerhedskopier til systemdatabaser ud over brugerdatabaser.
Tak for din tid, og vi mødes snart igen med endnu en interessant artikel.