V předchozích článcích série SQL Server System Databases jsme se seznámili s účelem všech databází SQL Server System, které jsou součástí instalace SQL Serveru, a porozuměli nejlepším postupům, které je třeba pro ně implementovat. Podrobněji jsme také porozuměli databázím Tempdb a MSDB. Vzhledem k tomu, že Zálohování a obnova systémové databáze se mírně liší od uživatelských databází, podrobně si v tomto článku projdeme, jak zálohovat systémové databáze a obnovit systémovou databázi ze záloh.
Zálohování databáze SQL
Termín Záloha odkazuje na kopírování dat uvnitř databáze jako záložní soubor, který lze použít k obnovení nebo dalšímu obnovení dat.
Úplná záloha databáze bude obsahovat kopie dat napříč datovými soubory a soubory protokolu, které lze buď obnovit jako databázi, nebo provést obnovu v určitém okamžiku v případě jakékoli katastrofy nebo katastrofického selhání. Pravidelné úplné zálohy v systému a také databáze uživatelů jsou proto zásadní.
Kromě úplné zálohy podporuje SQL Server několik dalších možností zálohování, jako je rozdílová záloha, záloha transakčního protokolu, záloha souborů atd., ale nebudeme se na ně zaměřovat, protože to nespadá do rozsahu tohoto článku.
Úplné zálohování databáze by mělo být naplánováno tak, aby se spouštělo pravidelně nebo po jakýchkoli konkrétních změnách konfigurace. Přestože SQL Server může přijmout úplnou zálohu databáze s různými příponami souborů, doporučuje se uložit tuto zálohu jako soubor *.bak pro snazší klasifikaci a údržbu.
Syntaxe databáze Backup má k dispozici mnoho možností, ale my se zaměříme pouze na základní příkazy potřebné k úplnému zálohování jakékoli databáze. Úplná syntaxe je uvedena v článku MSDN.
ZÁLOHOVÁNÍ DATABÁZE Syntaxe (minimální)
BACKUP DATABASE <Database_name>
TO DISK = <File_Path>
GO
Zálohování uživatelských databází
Chcete-li provést úplnou zálohu AdventureWorks databáze, stačí nahradit Název databáze a Cesta k souboru ve výše uvedeném příkazu BACKUP DATABASE a spusťte jej:
BACKUP DATABASE [AdventureWorks]
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak'
GO
Zálohování systémových databází
Pomocí výše uvedeného příkazu BACKUP DATABASE můžeme provést úplnou zálohu systémových databází, jako je hlavní, msdb a 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
Můžeme přejít na výše uvedenou cestu ke složce a tam vidíme Úplné zálohy databáze úspěšně vytvořené pro databázi uživatelů i systémové databáze:
Je možné zálohovat databázi tempdb?
Zkusme provést úplnou zálohu systémové databáze tempdb pomocí stejné syntaxe BACKUP DATABASE:
BACKUP DATABASE tempdb
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\tempdb_Full.bak'
GO
Jak jsme probrali v minulých článcích, tempdb je jediná databáze, pro kterou je Záloha nelze vzít . Databáze tempdb bude nově vytvořena při každém spuštění služeb SQL Server. Pokud se tedy vyskytnou nějaké problémy s tempdb, pomůže je vyřešit restartování služby SQL Server.
Obnovit databázi
Obnova databáze z úplné zálohy (*.bak) vrátí databázi zpět s kompletními daty nebo „vrátí“ databázi k určitému časovému bodu. Příkaz RESTORE lze také použít k obnovení souborů, skupin souborů nebo protokolů transakcí, ale to není předmětem aktuálního článku.
Chcete-li obnovit úplnou zálohu databáze , můžeme použít níže uvedenou syntaxi. Poznámka:Podobně jako příkaz BACKUP má příkaz RESTORE mnoho možností, ale my se budeme odvolávat pouze na ty základní. Podrobné informace o těchto možnostech naleznete ve vyhrazeném článku MSDN.
OBNOVIT syntaxi DATABASE
RESTORE DATABASE <Database_Name>
FROM DISK = <File Path>
WITH REPLACE
GO
Obnovení uživatelské databáze
Chcete-li obnovit AdventureWorks databáze z úplné zálohy, kterou jsme použili dříve, můžeme použít příkaz RESTORE DATABASE, který nahradí Název databáze a Cesta k souboru jak je uvedeno níže:
RESTORE DATABASE [AdventureWorks]
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak'
WITH REPLACE
GO
Obnovení databáze modelu
Zkusme obnovit databázi modelu systému pomocí příkazu RESTORE DATABASE:
RESTORE DATABASE model
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\model_Full.bak'
WITH REPLACE
GO
Zálohu modelové databáze lze úspěšně obnovit pomocí výchozího příkazu RESTORE DATABASE.
Obnovení hlavní databáze
Nyní zkusme obnovit systémovou hlavní databázi pomocí příkazu RESTORE DATABASE:
RESTORE DATABASE master
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\master_Full.bak'
WITH REPLACE
GO
Vyvolalo to chybu oznamující, že instance SQL Server by měla být spuštěna v režimu jednoho uživatele, aby se obnovila hlavní databáze. Jak ukazuje chybová zpráva, musíme spustit instanci SQL Serveru v režimu jednoho uživatele a poté zkusit obnovit hlavní databázi.
Pro spuštění instance SQL Serveru v režimu jednoho uživatele můžeme použít jednu z následujících metod:
- Příkazový řádek
- Parametry spuštění serveru SQL v nástroji SQL Server Configuration Manager.
Přístup pomocí příkazového řádku
Chcete-li spustit instanci SQL Server v režimu jednoho uživatele pomocí příkazového řádku, otevřete příkazový řádek pomocí Spustit jako správce možnost, jak je uvedeno níže:
Po dokončení zadejte příkaz:
NET STOP <SQL_Server_Service_Name>
SQL_Server_Service_Name lze získat prostřednictvím SQL Server Configuration Manager nebo services.msc
Správce konfigurace serveru SQL
Služby.msc
Protože naše služba SQL Server je výchozí instancí, můžeme použít název MSSQLSERVER jak je zvýrazněno výše. Po zadání požádá o potvrzení zastavení všech závislých služeb. Službu SQL Server Agent Service můžeme také zastavit zadáním Y pro Ano .
Když je služba SQL Server zastavena, můžeme ji spustit v režimu jednoho uživatele. Spusťte níže uvedený příkaz, kde /m znamená spuštění služby SQL Server Service v režimu jednoho uživatele.
NET START MSSQLSERVER /m
Po jeho provedení se můžeme pokusit obnovit hlavní databázi. Spusťte příkaz RESTORE BACKUP jako dříve:
Spuštěním instance SQL Server v režimu jednoho uživatele jsme schopni úspěšně obnovit databázi hlavního systému z poslední známé úplné zálohy databáze bez jakýchkoli problémů. Zjistili jsme tedy, že pro obnovení hlavní databáze by instance SQL Serveru měla být v režimu jednoho uživatele.
S instancí SQL Server v režimu jednoho uživatele se může připojit pouze jeden uživatel a po dokončení našich činností obnovy jej musíme změnit zpět na režim pro více uživatelů zastavením instance SQL Server a spuštěním instance SQL Server bez možnosti /m, jak je znázorněno níže:
NET STOP MSSQLSERVER
NET START MSSQLSERVER
Po spuštění v normálním režimu nebo režimu pro více uživatelů se mohou všichni uživatelé připojit k instanci SQL Serveru a provádět své činnosti. Můžeme také ověřit, že hlavní databáze byla obnovena do doby, kdy byla provedena Úplná záloha, a jakékoli změny konfigurace provedené poté je třeba provést znovu.
Několik věcí k poznámce, když je instance SQL Server v režimu pro jednoho uživatele:
- Když je instance SQL Server v režimu jednoho uživatele, může se k ní připojit pouze jedna uživatelská relace. Proto se ujistěte, že služba SQL Server Agent Service a všechny ostatní služby související s SQL Serverem jsou zastaveny postavení. V opačném případě mohou být tato připojení navázána jako první, a pokud k tomu dojde, nebudeme se moci připojit k serveru SQL a obnovit databázi.
- Při připojování prostřednictvím SSMS v režimu pro jednoho uživatele odpojte Průzkumníka objektů a připojte se pouze prostřednictvím okna dotazu. Pokud je navázáno připojení z Průzkumníka objektů, vytvoří se jediné připojení. Proto se nemůžete připojit z okna dotazu. Podívejte se na níže uvedený snímek obrazovky – ukazuje, jak připojit pouze okno Nový dotaz bez připojení přes Object Explorer:
Parametr spouštění serveru SQL v Configuration Manager
Ti, kterým vyhovuje GUI místo příkazového řádku, mohou použít níže uvedený přístup.
1). Otevřete Správce konfigurace serveru SQL zadáním MSSQLManager13.msc do příkazového řádku. Zde 13 odkazuje na SQL Server 2016, takže pro ostatní verze SQL Serveru použijte správná odpovídající čísla:
- 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). Rozbalte Služby serveru SQL :
3). Klikněte pravým tlačítkem na SQL Server Service označenou jako SQL Server (MSSQLSERVER) > Vlastnosti .
4). Vyberte Parametry spouštění kartu nabídky.
5). Klikněte na -m v části Určit spouštěcí parametr pole a poté klikněte na Přidat ke spuštění služby SQL Server v režimu jednoho uživatele.
6). Klikněte na OK a restartujte službu SQL Server, abyste spustili službu SQL Server v režimu jednoho uživatele.
Chcete-li po obnovení hlavní databáze změnit instanci SQL Server z režimu jednoho uživatele na režim pro více uživatelů nebo normální režim, stačí kliknout na parametr -m z existujícího parametru s , Klikněte na Odebrat a restartujte službu SQL Server.
Obnovení databáze MSDB
Nyní zkusme obnovit zálohu systémové databáze msdb pomocí výchozího příkazu RESTORE DATABASE:
RESTORE DATABASE msdb
FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\msdb_Full.bak'
WITH REPLACE
GO
Tento pokus nám přinesl chybu oznamující Nelze získat výhradní přístup, protože databáze se používá . Tato chybová zpráva označuje, že nějaký jiný proces používá msdb . Ke správné obnově databáze msdb tedy musíme použít jeden z níže uvedených přístupů:
- Spusťte instanci nebo službu SQL Server v režimu pro jednoho uživatele jako dříve, aby se nikdo nepřipojoval a neměl přístup k msdb databáze.
- Nebo přineste msdb databáze do režimu pro jednoho uživatele, aniž by se k ní připojoval jakýkoli uživatel.
Protože víme, jak přepnout instanci nebo službu SQL Server do režimu pro jednoho uživatele při obnově hlavní systémové databáze, vyzkoušíme druhou možnost změnou databáze msdb na režim pro jednoho uživatele, abychom obnovili zálohu databáze msdb.
Spusťte níže uvedený příkaz:
USE [master]
GO
ALTER DATABASE [msdb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
Důležité :Provedení výše uvedeného příkazu může selhat v následujících případech:
- Služba SQL Server Agent Service je spuštěna. Chcete-li chybu opravit, zastavte službu SQL Server Agent Service a zkuste to znovu.
- Jakékoli uživatelské relace jsou připojeny k databázi msdb. Aktivní připojení k msdb nebo jiné databázi můžeme zjistit pomocí níže uvedeného dotazu:
use master
GO
select spid
from sys.sysprocesses
where dbid = db_id('msdb')
Pokud tento dotaz přinese nějaké výsledky, znamená to, že některé uživatelské relace jsou připojeny k databázi msdb. V tomto případě bychom měli tyto relace ukončit příkazem KILL a nahrazením spid získané z výše uvedeného provedení dotazu:
KILL <spid>
Když nejsou k msdb připojeny žádné relace databáze, budeme schopni úspěšně uvést databázi msdb do režimu pro jednoho uživatele. Kdykoli je databáze v režimu pro jednoho uživatele, budeme moci vidět slovo (Single User) zobrazené poblíž databáze, jak je zvýrazněno níže pro databázi msdb:
Zkusme obnovit msdb databáze nyní pomocí našeho příkazu RESTORE DATABASE:
S databází msdb v režimu jednoho uživatele jsme byli schopni obnovit msdb databáze úspěšně z poslední známé dobré Úplné zálohy msdb databáze. Obnova databáze ze zálohy ji ve výchozím nastavení přenese do režimu pro více uživatelů, a pokud je z nějakého důvodu stále v režimu pro jednoho uživatele, můžeme provést níže uvedený příkaz a vrátit ji zpět do režimu pro více uživatelů:
USE [master]
GO
ALTER DATABASE [msdb] SET MULTI_USER
GO
Znovu sestavit systémové databáze
Pro každou ideální výrobu V prostředích je důležité mít k dispozici úplnou zálohu systémových databází pro obnovu systémových databází bez ztráty dat v případě jakýchkoli náhodných chyb ze strany uživatelů nebo poškození databáze nebo obnovy po havárii.
V nejhorším případě, pokud nelze spustit SQL Server Services, musíme nejprve zkusit obnovit systémové databáze z posledních známých úplných záloh, a pokud nemáme k dispozici úplné zálohy a nelze spustit SQL Server Services, pak jsme zbývá pouze jedna poslední možnost, tj. Přebudování systémových databází. Poznámka :Přebudování systémových databází vymaže všechny konfigurace na úrovni serveru uložené ve všech systémových databázích a můžeme ztratit všechny konfigurace na úrovni serveru/instance, jako jsou přihlášení, konfigurace SQL Server Agent a další důležité podrobnosti uložené v systémových databázích, které jsme viděli v našich předchozích článcích.
Pojďme se rychle podívat na to, jak znovu sestavit systémové databáze (Jak bylo zmíněno výše, tento proces by měl být proveden jako poslední opatření k obnovení instance SQL Serveru při absenci úplných záloh systémových databází).
K opětovnému sestavení systémových databází bychom potřebovali instalační médium SQL Server, buď připojené, nebo zkopírované na server, kde je nainstalována naše instance SQL Server. Jakmile bude hotovo, měli bychom postupovat podle následujících kroků:
- V příkazovém řádku přejděte na cestu, kde jsou umístěny instalační soubory serveru SQL Server (setup.exe):
C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\SQLServer2016
- Proveďte níže uvedený příkaz a nahraďte všechny parametry platnými hodnotami. Hodnota ACTION =REBUILDDATABASE označuje, že všechny systémové databáze mají být po provedení tohoto příkazu znovu vytvořeny.
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName]
Mezi parametry, které se mají změnit, patří:
- Název instance – Název instance SQL Serveru, v našem případě je to RRJ
- Účty – název účtu sysadmin, v našem případě je to sa
- Silné heslo – silné heslo pro sa účet správce systému.
- CollationName – Collation Name databáze SQL Server, pokud je třeba jej změnit.
Závěr
Naučili jsme se zálohovat a obnovovat uživatelské a systémové databáze a porozuměli dalším opatřením potřebným k obnovení systémových databází, jako jsou systémové databáze master a msdb. V případě chybějících úplných záloh systémových databází jsme se také naučili, jak znovu sestavit systémové databáze z instalačního média SQL Server, a pochopili jsme ztráty dat související s konfigurací při přestavbě systémových databází. Abychom to shrnuli, nepřímo jsme pochopili důležitost plánování úplných záloh pro systémové databáze kromě databází uživatelů.
Děkujeme za váš čas a brzy se opět setkáme s dalším zajímavým článkem.