W moich poprzednich artykułach wyjaśniłem, jak stworzyć i skonfigurować funkcję FILESTREAM w instancji serwera SQL. Co więcej, zademonstrowałem, jak utworzyć tabelę, która ma kolumnę FILESTREAM i umożliwia wstawianie i usuwanie z niej danych.
W tym artykule wyjaśnię, jak wykonać kopię zapasową i przywrócić bazę danych z obsługą FILESTREAM. Co więcej, pokażę, jak przywrócić grupę plików FILESTREAM bez przełączania bazy danych w tryb offline.
Jak wyjaśniłem w moich poprzednich artykułach, gdy włączymy FILESTREAM w wystąpieniu SQL Server, musimy utworzyć kontener FILESTREAM, który ma grupę plików FILESTREAM. Podczas tworzenia kopii zapasowej bazy danych z włączoną funkcją FILESTREAM kopia zapasowa grupy plików FILESTREAM zostanie uwzględniona w zestawie kopii zapasowych. Kiedy przywracamy bazę danych, SQL Server przywróci bazę danych oraz kontener FILESTREAM i znajdujące się w nim pliki.
Kiedy tworzymy kopię zapasową bazy danych z obsługą FILESTREAM, to:
- Utwórz kopię zapasową wszystkich dostępnych plików danych w bazie danych.
- Utwórz kopię zapasową grupy plików FILESTREAM i zawartych w niej plików.
- Zapasowy dziennik T-Log.
SQL Server zapewnia elastyczność wykonywania kopii zapasowej tylko kontenera FILESTREAM. Jeśli pliki w kontenerze FILESTREAM ulegną uszkodzeniu, nie musimy odzyskiwać całej bazy danych. Możemy przywrócić tylko grupę plików FILESTREAM.
W tym demo zamierzam:
- Wyjaśnij, jak wykonać pełną kopię zapasową bazy danych FS i wykonać kopię zapasową tylko kontenera FILESTREAM.
- Wyjaśnij, jak przywrócić bazę danych z obsługą FILESTREAM.
- Jak przywrócić kontener FILESTREAM w trybie online i offline. Uwaga:edycja SQL Server Enterprise i wersja deweloperska obsługują przywracanie ONLINE.
Konfiguracja wersji demonstracyjnej:
W tym demo użyję:
- Baza danych :Serwer SQL 2017
- Oprogramowanie :Studio zarządzania SQL Server.
Tworzenie kopii zapasowej bazy danych z obsługą FILESTREAM
Aby zademonstrować proces tworzenia kopii zapasowej, utworzyłem bazę danych z obsługą FILESTREAM o nazwie FileStream_Demo . Ma tabelę FILESTREAM o nazwie Document_Content .
Pełna kopia zapasowa bazy danych
Tworzenie kopii zapasowej bazy danych obsługującej technologię FILESTREAM to prosty proces. Aby wygenerować pełną kopię zapasową, wykonaj następujący skrypt T-SQL.
BACKUP DATABASE [FileStream_Demo] TO DISK = N'E:\Backups\FileStream_Demo.bak' WITH NOFORMAT, NOINIT, NAME = N'FileStream_Demo-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10 GO
Poniżej znajduje się dziennik kopii zapasowej wygenerowany przez wykonanie powyższego polecenia kopii zapasowej:
/*Begin Backup DataFile*/ Processed 568 pages for database 'FileStream_Demo', file 'FileStream_Demo' on file 1. /*Begin backup of FILESTREAM container*/ 10 percent processed. 20 percent processed. 30 percent processed. 40 percent processed. 50 percent processed. 60 percent processed. 70 percent processed. 80 percent processed. 90 percent processed. Processed 111106 pages for database 'FileStream_Demo', file 'Dummy-Documents' on file 1. /*Begin backup of FILESTREAM container*/ Processed 4 pages for database 'FileStream_Demo', file 'FileStream_Demo_log' on file 1. 100 percent processed. BACKUP DATABASE successfully processed 111677 pages in 18.410 seconds (47.391 MB/sec).
Jak wspomniałem na początku artykułu, najpierw serwer SQL wykonuje kopię zapasową podstawowego pliku danych, następnie drugorzędnych plików danych i na końcu dzienników transakcji. Jak widać w dzienniku kopii zapasowej, najpierw wykonaj kopię zapasową podstawowego pliku danych serwera SQL, następnie grupę plików FILESTREAM i powiązane z nią dane, a na końcu dzienniki transakcji.
Kopia zapasowa kontenera FILESTREAM
Jak wspomniałem na początku artykułu, możemy również wygenerować kopię zapasową kontenera FILESTREAM. Aby utworzyć kopię zapasową kontenera FILESTREAM, wykonaj następujący skrypt T-SQL.
BACKUP DATABASE [FileStream_Demo] FILEGROUP = N'Dummy-Documents' TO DISK = N'E:\Backups\FS_Container.bak' WITH NOFORMAT, NOINIT, NAME = N'FileStream_Demo-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10 GO
Przywróć bazę danych z obsługą FILESTREAM
Kiedy przywracamy bazę danych FILESTREAM, SQL przywraca kontener FileStream wraz ze wszystkimi plikami w kontenerze FILESTREAM.
Aby przywrócić bazę danych, wykonaj następujące czynności:
- W programie SSMS kliknij prawym przyciskiem myszy bazę danych i wybierz Przywróć bazę danych .
- W oknie dialogowym Przywróć wybierz Urządzenie i kliknij Przeglądaj . Otworzy się kolejne okno dialogowe. W oknie dialogowym kliknij Dodaj .
- W Zlokalizuj plik kopii zapasowej w oknie dialogowym, przejdź przez strukturę katalogów, kliknij odpowiednią kopię zapasową i kliknij OK .
- Gdy informacje o kopii zapasowej zostaną załadowane w Zestawach kopii zapasowych do przywrócenia widok siatki, kliknij OK aby rozpocząć przywracanie procesu.
Alternatywnie możesz przywrócić bazę danych, wykonując następujące polecenie:
USE [master] RESTORE DATABASE [FileStream_Demo] FROM DISK = N'E:\Backups\FileStream_Demo.bak' WITH FILE = 1, NOUNLOAD, STATS = 5 GO
Scenariusz odzyskiwania bazy danych z obsługą FILESTREAM
Grupa plików FILESTREAM przywraca proces podobnie jak proces przywracania grup plików.
Aby wygenerować scenariusz przywracania, utwórz bazę danych z obsługą FILESTREAM o nazwie FileStream-Demo . Baza danych zawiera tabelę FILESTREAM o nazwie Document_Content . Wstaw losowe dane i pliki w Document_Content tabela.
Wykonaj następujące zapytanie, aby wypełnić szczegóły plików wstawionych do tabeli.
SELECT RootDirectory, FileName, FileAttribute, FileCreateDate, FileSize, FileStreamCol.PathName() AS FilePath FROM Document_Content order by filesize desc
Dane wyjściowe są następujące:
Poniżej znajduje się zrzut ekranu kontenera FILESTREAM:
Najpierw wygeneruj pełną kopię zapasową bazy danych. W tym celu wykonaj następujące polecenie.
BACKUP DATABASE [FileStream_Demo] TO DISK = N'E:\Backups\Full_FileStream_Demo_20180810.bak' WITH NOFORMAT, NOINIT,NAME = N'FileStream_Demo-Full Database Backup'
Po drugie, wygeneruj kopię zapasową FILEGROUP grupy plików FILESTREAM o nazwie Dummy-Document wykonując następujące polecenie:
BACKUP DATABASE [FileStream_Demo] FILEGROUP = N'Dummy-Documents' TO DISK = N'E:\Backups\FileStream_Filegroup_Demo.bak' WITH NOFORMAT, NOINIT, NAME = N'FileStream_Demo-Full FILEGROUP Backup'
Aby wygenerować uszkodzenie FILESTREAM, usuń niektóre pliki z kontenera FILESTREAM. Po usunięciu tych plików spróbuj pobrać dane z „Document_Content”, wykonując następujące polecenie:
Use FileStream_Demo Go select * from Document_Content
Otrzymasz następujący błąd:
Msg 233, Level 20, State 0, Line 122 A transport-level error has occurred when receiving results from the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)
Zobacz następujący zrzut ekranu:
Teraz musimy przywrócić kontener FILESTREAM, aby naprawić ten błąd. Wygenerowaliśmy pełną kopię zapasową i kopię zapasową dokumentu fikcyjnego grupa plików.
Możemy przywrócić cały kontener FILESTREAM, przywracając grupę plików FILESTREAM. Pokażę:
- Przywracanie offline grupy plików FILESTREAM.
- Przywracanie online grupy plików FILESTREAM.
Przywracanie offline grupy plików kontenera FILESTREAM
Ponieważ usunąłem pliki z kontenera FILESTREAM, nie musimy przywracać całej bazy danych. Dlatego zamiast przywracać całą bazę danych, przywrócimy jedyną grupę plików. Aby to zrobić, najpierw wygeneruj kopię zapasową Tail-Log, aby przechwycić zmiany danych, które nie zostały zarchiwizowane. Kopia zapasowa dziennika końcowego musi być wykonana przy użyciu opcji NORECOVERY, aby przywrócić bazę danych w stan przywracania, co daje możliwość zastosowania kopii zapasowych w bazie danych. Aby to zrobić, wykonaj następujące zapytanie:
backup log [FileStream_Demo] to disk ='E:\Backups\FileStream_Filegroup_Demo_Log_1.trn' With NORECOVERY
Po wygenerowaniu kopii zapasowej Tail-log baza danych będzie w trybie przywracania. Teraz możemy zastosować kopię zapasową FILEGROUP na bazie danych z opcją NORECOVERY. W tym celu wykonaj następujące polecenie:
use master go RESTORE DATABASE [FileStream_Demo] FILE='Dummy-Documents' FROM DISK = N'E:\Backups\FileStream_Filegroup_Demo.bak' WITH NORECOVERY,REPLACE;
Teraz zastosuj kopię zapasową Tail-log z opcją RECOVERY. W tym celu wykonaj następujące polecenie:
RESTORE LOG [FileStream_Demo] FROM DISK = N'E:\Backups\FileStream_Filegroup_Demo_Log_1.trn'
Po przywróceniu kopii zapasowej baza danych będzie w trybie online, a wszystkie pliki zostaną przywrócone w kontenerze FILESTREAM. Aby to sprawdzić, wykonaj następujące polecenie:
SELECT RootDirectory, FileName, FileAttribute, FileCreateDate, FileSize, FileStreamCol.PathName() AS FilePath FROM Document_Content order by filesize desc
Wynik powyższego zapytania jest następujący:
Przywracanie online grupy plików FILESTREAM
Korzystając z SQL Server Enterprise Edition, możemy przywrócić kopię zapasową, gdy baza danych jest w trybie online. Na przykład, jeśli plik F1 drugorzędnej grupy plików FG-1 jest uszkodzony, możemy przywrócić plik F1, gdy baza danych pozostaje online. Sekwencja przywracania przywracania offline i przywracania online są takie same.
Jak wspomniano powyżej, aby wykonać przywracanie online grupy plików FILESTREAM, wykonaj Dummy-Document plik danych w trybie offline. W tym celu wykonaj następujące polecenie.
use master go Alter database [FileStream_Demo] MODIFY FILE (NAME='Dummy-Documents',OFFLINE)
Aby zweryfikować stan pliku, wykonaj następujące zapytanie:
Use [FileStream_Demo] Go select File_id, type_desc,name, physical_name,state_desc,size from FileStream_Demo.sys.database_files
Dane wyjściowe są następujące:
Utworzyliśmy już kopię zapasową dokumentu fikcyjnego grupa plików. W związku z tym, gdy plik danych jest w trybie offline, przywróć kopię zapasową FILEGROUP w bazie danych z opcją NORECOVERY. W tym celu wykonaj następujące polecenie:
use master go RESTORE DATABASE [FileStream_Demo] FILE='Dummy-Documents' FROM DISK = N'E:\Backups\FileStream_Filegroup_Demo.bak' WITH NORECOVERY, REPLACE;
Teraz wykonaj kopię zapasową dziennika bazy danych, aby upewnić się, że punkt, w którym plik danych przeszedł w tryb offline, został przechwycony. W tym celu wykonaj następujące polecenie:
backup log [FileStream_Demo] to disk ='E:\Backups\FileStream_Filegroup_Demo_Log1.trn'
Wykonaj następujące polecenie, aby przywrócić ostatnią kopię zapasową T-Log.
use master go RESTORE LOG [FileStream_Demo] FROM DISK = N'E:\Backups\FileStream_Filegroup_Demo_Log1.trn'
Po przywróceniu kopii zapasowej dziennika wszystkie pliki w kontenerze FILESTREAM zostaną przywrócone, a grupa plików będzie w trybie online. Aby to sprawdzić, wykonaj następujące zapytanie:
Use [FileStream_Demo] Go select File_id, type_desc,name, physical_name,state_desc,size from FileStream_Demo.sys.database_files
Dane wyjściowe są następujące:
Po przywróceniu kopii zapasowej baza danych będzie w trybie online, a wszystkie pliki zostaną przywrócone w kontenerze FILESTREAM. Aby to sprawdzić, wykonaj następujące polecenie:
SELECT RootDirectory, FileName, FileAttribute, FileCreateDate, FileSize, FileStreamCol.PathName() AS FilePath FROM Document_Content order by filesize desc
Dane wyjściowe są następujące:
Podsumowanie
W tym artykule wyjaśniłem:
- Jak wykonać kopię zapasową i przywrócić bazę danych z obsługą FILESTREAM i grupę plików FILESTREAM.
- Jak przywrócić grupę plików FILESTREAM online i offline.