sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server-systemdatabaser – Återställ systemdatabaser

I de tidigare artiklarna i serien SQL Server System Databases har vi lärt oss syftet med alla SQL Server System-databaser som kommer som en del av SQL Server-installationen och förstått de bästa metoderna som ska implementeras för dem. Vi har också förstått Tempdb- och MSDB-databaserna mer i detalj. Eftersom säkerhetskopiering och återställning av systemdatabas är något annorlunda jämfört med användardatabaser, kommer vi att gå igenom hur man säkerhetskopierar systemdatabaser och återställer systemdatabas från säkerhetskopior i detalj i den här artikeln.

Säkerhetskopiera SQL-databas

Termen Säkerhetskopiering hänvisar till att kopiera data inuti en databas som en säkerhetskopia som kan användas för att återställa eller återställa data ytterligare.

En fullständig säkerhetskopia av en databas kommer att innehålla datakopiorna över datafiler och loggfiler för att antingen återställa som en databas eller göra en punkt-i-tid-återställning i händelse av katastrofer eller katastrofala misslyckanden. Därför är regelbundna fullständiga säkerhetskopior på systemet såväl som användardatabaser avgörande.

Förutom fullständig säkerhetskopiering stöder SQL Server flera andra säkerhetskopieringsalternativ som differentiell säkerhetskopiering, säkerhetskopiering av transaktionsloggar, säkerhetskopiering av filer, etc., men vi kommer inte att fokusera på dem eftersom det ligger utanför ramen för denna artikel.

En fullständig databassäkerhetskopiering bör schemaläggas för att köras med jämna mellanrum eller efter specifika konfigurationsändringar. Även om SQL Server kan acceptera hela databassäkerhetskopieringen i olika filtillägg, rekommenderas att du sparar den säkerhetskopian som en *.bak-fil för enklare klassificering och underhåll.

Säkerhetskopieringsdatabassyntaxen har många tillgängliga alternativ, men vi kommer bara att fokusera på de grundläggande kommandon som krävs för att ta den fullständiga säkerhetskopieringen av vilken databas som helst. Hela syntaxen finns i MSDN-artikeln.

BACKUP DATABAS Syntax (minimal)

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

Säkerhetskopiera användardatabaser

För att ta en fullständig säkerhetskopia av AdventureWorks databas, ersätt bara Databasnamnet och Filsökväg i kommandot BACKUP DATABASE ovan och kör det:

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

Säkerhetskopiera systemdatabaser

Genom att använda kommandot BACKUP DATABASE ovan kan vi ta en fullständig säkerhetskopia av systemdatabaser, såsom master, msdb och 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 navigera till ovanstående mappsökväg, och där ser vi de fullständiga databassäkerhetskopiorna som skapats framgångsrikt för både användardatabasen och systemdatabaserna:

Är det möjligt att säkerhetskopiera tempdb-databasen?

Låt oss försöka ta en fullständig säkerhetskopia av tempdb-systemdatabasen med samma syntax för BACKUP DATABASE:

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

Som vi diskuterade i tidigare artiklar, tempdb är den enda databasen för vilken en Säkerhetskopiering kan inte tas . tempdb-databasen kommer att skapas på nytt när SQL Server-tjänster startas. Därför, om det finns några problem med tempdb, kommer en omstart av SQL Server-tjänsten att hjälpa till att lösa dem.

Återställ databas

Att återställa en databas från Full Backup(*.bak) tar tillbaka databasen med fullständiga data eller "rullar tillbaka" en databas till en tidpunkt. Kommandot RESTORE kan också användas för att återställa filer, filgrupper eller transaktionsloggar, men det är inte omfattningen av den aktuella artikeln.

För att återställa en fullständig databassäkerhetskopiering , kan vi använda syntaxen nedan. Notera:I likhet med BACKUP-kommandot har RESTORE-kommandot många alternativ, men vi kommer bara att vädja till de grundläggande. Du kan hitta detaljerad information om dessa alternativ i en särskild MSDN-artikel.

ÅTERSTÄLL DATABAS-syntax

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

Återställ användardatabas

För att återställa AdventureWorks databasen från den fullständiga säkerhetskopian som vi tog tidigare, kan vi använda kommandot RESTORE DATABASE och ersätta Databasnamnet och Filsökväg som visas nedan:

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

Återställ modelldatabas

Låt oss försöka återställa modellsystemdatabasen med kommandot RESTORE DATABASE:

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

Säkerhetskopiering av modelldatabas kan framgångsrikt återställas med standardkommandot RESTORE DATABASE.

Återställ huvuddatabas

Låt oss nu försöka återställa systemmasterdatabasen med kommandot 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 ett fel som säger att SQL Server-instansen ska köras i enanvändarläget för att återställa huvuddatabasen. Som felmeddelandet indikerar måste vi starta vår SQL Server-instans i enanvändarläget och sedan försöka återställa huvuddatabasen.

För att starta en SQL Server-instans i enanvändarläget kan vi använda en av följande metoder:

  • Kommandotolk
  • SQL Server Startup-parametrar i SQL Server Configuration Manager.

Kommandotolkning

För att starta SQL Server-instansen i ett enanvändarläge via kommandotolken, öppna kommandotolken med Kör som administratör alternativ som visas nedan:

När det är klart skriver du in kommandot:

NET STOP <SQL_Server_Service_Name>

SQL_Server_Service_Name kan erhållas via SQL Server Configuration Manager eller services.msc

SQL Server Configuration Manager

Services.msc

Eftersom vår SQL Server Service är standardinstansen kan vi använda namnet MSSQLSERVER som markerats ovan. När den väl har angetts kommer den att be om bekräftelse för att stoppa alla beroende tjänster. Vi kan också stoppa SQL Server Agent Service genom att skriva Y för Ja .

När SQL Server Service stoppas kan vi starta den i enanvändarläge. Kör kommandot nedan där /m innebär att du startar SQL Server Service i enanvändarläge.

NET START MSSQLSERVER /m

När det är utfört kan vi försöka återställa huvuddatabasen. Kör kommandot RESTORE BACKUP som tidigare:

Genom att starta SQL Server Instance i enanvändarläge kan vi återställa huvudsystemdatabasen framgångsrikt från den senast kända fullständiga databasbackupen utan några problem. Således har vi lärt oss att för att återställa huvuddatabasen bör SQL Server-instansen vara i enanvändarläge.

Med SQL Server-instans i enanvändarläge kan endast en användare ansluta och efter att våra återställningsaktiviteter är slutförda måste vi ändra den tillbaka till fleranvändarläge genom att stoppa SQL Server-instansen och starta SQL Server-instans utan /m-alternativet som visas nedan:

NET STOP MSSQLSERVER
NET START MSSQLSERVER

När de väl har startat i normalt läge eller fleranvändarläge kan alla användare ansluta till SQL Server-instansen och utföra sina aktiviteter. Vi kan också verifiera att huvuddatabasen återställdes till den tidpunkt då Full Backup togs och eventuella konfigurationsändringar som görs efter det måste utföras igen.

Några saker att notera när SQL Server Instance är i enanvändarläge:

  • När SQL Server-instansen är i enanvändarläge kan endast en användarsession ansluta till den. Se därför till att SQL Server Agent Service och alla andra SQL Server-relaterade tjänster finns i stoppad status. Annars kan dessa anslutningar upprättas först, och om det händer kan vi inte ansluta till SQL Server för att återställa databasen.
  • Medan du ansluter via SSMS i ett enanvändarläge, koppla bort Objektutforskaren och anslut endast via frågefönstret. Om en anslutning upprättas från Objektutforskaren upprättas en enda anslutning. Därför kan du inte ansluta från frågefönstret. Se skärmdumpen nedan – den visar hur du ansluter endast fönstret Ny fråga utan att ansluta via Objektutforskaren:

SQL Server Startup Parameter i Configuration Manager

De som är mer bekväma med GUI istället för kommandotolken kan använda tillvägagångssättet nedan.

1). Öppna SQL Server Configuration Manager genom att skriva MSSQLManager13.msc i kommandotolken. Här hänvisar 13 till SQL Server 2016, så använd rätt motsvarande nummer för andra versioner av SQL Server:

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

2). Expandera SQL Server Services :

3). Högerklicka på SQL Server Service identifierad som SQL Server (MSSQLSERVER) > Egenskaper .

4). Välj Startparametrar menyflik.

5). Klicka på -m i Ange en startparameter och klicka sedan på Lägg till för att starta SQL Server Service i enanvändarläge.

6). Klicka på OK och starta om SQL Server Service för att starta SQL Server Service i enanvändarläge.

För att ändra SQL Server-instansen från enanvändarläge till fleranvändarläge eller normalt läge efter att ha återställt huvuddatabasen, klicka bara på parametern -m från Befintlig parameter s , Klicka på Ta bort och starta om SQL Server-tjänsten.

Återställ MSDB-databas

Låt oss nu försöka återställa msdb-systemdatabassäkerhetskopian med standardkommandot RESTORE DATABASE:

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

Detta försök ger oss ett felmeddelande som anger Exklusiv åtkomst kunde inte erhållas eftersom databasen används . Det här felmeddelandet indikerar att någon annan process använder msdb . Därför måste vi använda en av metoderna nedan för att återställa msdb-databasen korrekt:

  • Starta SQL Server-instansen eller -tjänsten i enanvändarläget som vi gjorde tidigare för att undvika att någon ansluter och kommer åt msdb databas.
  • Eller ta med msdb databas till enanvändarläget utan att någon användare ansluter till den.

Eftersom vi vet hur vi ställer in SQL Server-instansen eller -tjänsten till enanvändarläge medan vi återställer huvudsystemdatabasen, kommer vi att prova det andra alternativet genom att ändra msdb-databasen till enanvändarläge för att återställa msdb-databasens säkerhetskopia.

Kör kommandot nedan:

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

Viktigt :Utförandet av kommandot ovan kan misslyckas i följande fall:

  • SQL Server Agent Service är igång. För att åtgärda felet, stoppa SQL Server Agent Service och försök igen.
  • Alla användarsessioner är anslutna till msdb-databasen. Vi kan ta reda på aktiva anslutningar till msdb eller annan databas genom att använda nedanstående fråga:
use master
GO
select spid
from sys.sysprocesses
where dbid = db_id('msdb')

Om den här frågan ger några resultat indikerar det att vissa användarsessioner är anslutna till msdb-databasen. I det här fallet bör vi döda dessa sessioner med kommandot KILL och ersätta spid erhållen från ovanstående frågekörning:

KILL <spid>

När inga sessioner är anslutna till msdb databas, kommer vi att framgångsrikt kunna föra msdb-databasen till enanvändarläge. Närhelst en databas är i enanvändarläge kommer vi att kunna se ordet (enanvändare) som visas i närheten av databasen som markerats nedan för msdb-databasen:

Låt oss försöka återställa msdb databasen använder nu vårt RESTORE DATABASE-kommando:

Med msdb-databas i enanvändarläge kunde vi återställa msdb databas framgångsrikt från den senast kända bra fullständiga säkerhetskopian av msdb databas. Att återställa en databas från säkerhetskopia kommer som standard att föra den till fleranvändarläge och om den fortfarande är i enanvändarläge av någon anledning kan vi utföra kommandot nedan för att återställa den till fleranvändarläge:

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

Återskapa systemdatabaser

För all idealisk produktion miljöer är det viktigt att ha en fullständig säkerhetskopia av systemdatabaser på plats för att återställa systemdatabaserna utan någon dataförlust i händelse av oavsiktliga misstag av användare eller databaskorruption eller katastrofåterställning.

I värsta fall, om SQL Server Services inte kan startas måste vi först försöka återställa systemdatabaserna från de senaste kända fullständiga säkerhetskopiorna och om vi inte har fullständiga säkerhetskopior tillgängliga och inte kunde starta SQL Server Services, då är vi kvar med bara ett sista alternativ, dvs. Återuppbyggnad av systemdatabaserna. Obs :Om du bygger om systemdatabaser rensas alla konfigurationer på servernivå som är lagrade i alla systemdatabaser och vi kan förlora alla konfigurationer på server-/instansnivå som inloggningar, SQL Server Agent-konfigurationer, andra viktiga detaljer lagrade i systemdatabaserna som vi har sett i våra tidigare artiklar.

Låt oss ta en snabb titt på hur man bygger om systemdatabaser (Som nämnts ovan bör denna process göras som en sista åtgärd för att återställa SQL Server-instansen i avsaknad av fullständiga säkerhetskopior av systemdatabaser).

För att bygga om systemdatabaserna skulle vi behöva installationsmediet för SQL Server, antingen monterat eller kopierat till servern där vår SQL Server-instans är installerad. När det är gjort bör vi följa stegen nedan:

  1. I kommandotolken, navigera till sökvägen där SQL Server-installationsfilerna (setup.exe) finns:

    C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\SQLServer2016
  2. Utför kommandot nedan och ersätt alla parametrar med giltiga värden. Värde ACTION =REBUILDDATABASE anger att alla systemdatabaser ska byggas om efter att kommandot har utförts.
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName]

Parametrar som ska ändras inkluderar:

  • Instansnamn – instansnamnet för SQL Server, i vårt fall är det RRJ
  • Konton – namnet på sysadmin-kontot, i vårt fall är det sa
  • StrongPassword – ett starkt lösenord för sa sysadmin-konto.
  • Sorteringsnamn – Sorteringsnamnet för SQL Server-databasen om det behöver ändras.

Slutsats

Vi har lärt oss hur man säkerhetskopierar och återställer användar- och systemdatabaser och förstått de ytterligare åtgärder som krävs för att återställa systemdatabaser som master- och msdb-systemdatabaser. I händelse av att fullständiga säkerhetskopior av systemdatabaser saknas, har vi också lärt oss hur man bygger om systemdatabaser från SQL Server-installationsmedia och förstått de konfigurationsrelaterade dataförluster som är involverade vid återuppbyggnad av systemdatabaser. För att sammanfatta, förstod vi indirekt vikten av att schemalägga fullständiga säkerhetskopior för systemdatabaser utöver användardatabaser.

Tack för din tid, och vi kommer snart att träffas igen med en annan intressant artikel.


  1. Hämta datum/tid från en Unix-tidsstämpel i SQLite

  2. Hur man återställer WordPress Admin Password via MySQL Command Prompt

  3. Hur man kommenterar i SQL

  4. Alternativ till Intersect i MySQL