Ако използвате SQL Server Management Studio (SSMS) или някакъв друг GUI за управление на вашите бази данни, може да сте свикнали да архивирате и възстановявате бази данни с помощта на „насочете и щракнете“.
Обикновено това включва щракване с десния бутон върху базата данни и избор на Възстановяване или подобен, след което следвайте подканите (например при възстановяване на база данни в Azure Data Studio).
Но ако някога ви се наложи да го направите с T-SQL, можете да използвате RESTORE DATABASE
изявление.
Пример
Ето един основен пример:
RESTORE DATABASE World
FROM DISK = N'/var/opt/mssql/Bak/World.bak'
WITH FILE = 1;
Това е почти толкова просто, колкото може да стане. RESTORE DATABASE
изразът има доста сложен синтаксис (както при повечето неща в T-SQL), но този израз е достатъчен за основна операция за възстановяване по подразбиране.
В този случай възстанових база данни, наречена World от .bak файл. Използвах FROM DISK
за да уточним, че е от .bak файл и предоставих пълния път до този файл. Други опции тук включват FROM TAPE
и FROM URL
.
Включих и WITH FILE = 1
тук, но това все пак е стойността по подразбиране. Тази клауза определя номера на файла за архивиране, който да се използва. Тоест кой резервен набор да се използва във файла (файлът може да има няколко набора за архивиране).
Вземете списък с резервни комплекти
Можете да използвате RESTORE HEADERONLY
за да получите списък с резервни комплекти във файла. По-конкретно, той връща набор от резултати от информация за резервни заглавки за всички резервни набори.
Пример:
RESTORE HEADERONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';
Това връща много колони, така че няма да ги представя всички тук.
Една от колоните се нарича Позиция . Това трябва да се използва с FILE =
опция при възстановяване на базата данни.
Пример с още опции
Ето пример с повече опции:
RESTORE DATABASE [WideWorldImporters]
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak'
WITH FILE = 1,
MOVE N'WWI_Primary' TO N'/var/opt/mssql/data/WideWorldImporters.mdf',
MOVE N'WWI_UserData' TO N'/var/opt/mssql/data/WideWorldImporters_UserData.ndf',
MOVE N'WWI_Log' TO N'/var/opt/mssql/data/WideWorldImporters.ldf',
MOVE N'WWI_InMemory_Data_1' TO N'/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1',
NOUNLOAD,
STATS = 5;
Това всъщност е скриптът, който Azure Data Studio генерира за мен, когато използвах GUI интерфейса, за да инициирам операция за възстановяване. Когато направите това, Azure Data Studio ви дава възможност да стартирате възстановяването незабавно или да генерирате скрипт с T-SQL кода, който можете да стартирате по-късно.
В този случай скриптът използва MOVE
аргумент за преместване на всяко име на логически файл в архивния файл до определеното физическо местоположение на файла в операционната система. В този случай файлът .bak използва различно физическо местоположение на файла (и използва пътеки за файлове на Windows) и така това трябваше да се промени, за да отговаря на моята система. Вижте по-долу за обяснение как да получите тази информация.
NOUNLOAD
всъщност е опция за лента. Той гарантира, че лентата не се разтоварва от устройството, след като възстановяването приключи. Като се има предвид, че не възстановявах от лента, тази опция беше игнорирана.
STATS
аргумент ви позволява да прецените напредъка на операцията по възстановяване. Той указва, че съобщение ще се показва всеки път, когато завършва друг процент. Ако не включите тук процентна стойност, SQL Server ще покаже съобщение след завършване на всеки 10%.
ВЪЗСТАНОВЯВАНЕ САМО НА ФАЙЛОВИЯ ЛИСТ
Ако искате да създадете израз като предишния, който използва MOVE
аргумент за преместване на всяко име на логически файл в архивния файл до определено физическо местоположение на файла в операционната система, можете да използвате RESTORE FILELISTONLY
за да върнете имената на логическите файлове (и повече).
RESTORE FILELISTONLY
връща набор от резултати, съдържащ списък на базата данни и регистрационните файлове, съдържащи се в резервния набор.
Ето пример, използващ същия WideWorldImporters .bak файл от предишния пример:
RESTORE FILELISTONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';
Резултат (с помощта на вертикален изход):
-[ RECORD 1 ]------------------------- LogicalName | WWI_Primary PhysicalName | D:\Data\WideWorldImporters.mdf Type | D FileGroupName | PRIMARY Size | 1073741824 MaxSize | 35184372080640 FileId | 1 CreateLSN | 0 DropLSN | 0 UniqueId | 8d30f4f9-a463-404f-805a-9bd1c634b66b ReadOnlyLSN | 0 ReadWriteLSN | 0 BackupSizeInBytes | 11993088 SourceBlockSize | 512 FileGroupId | 1 LogGroupGUID | NULL DifferentialBaseLSN | 626000002440500037 DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065 IsReadOnly | 0 IsPresent | 1 TDEThumbprint | NULL SnapshotUrl | NULL -[ RECORD 2 ]------------------------- LogicalName | WWI_UserData PhysicalName | D:\Data\WideWorldImporters_UserData.ndf Type | D FileGroupName | USERDATA Size | 2147483648 MaxSize | 35184372080640 FileId | 3 CreateLSN | 37000000095200001 DropLSN | 0 UniqueId | 28d406e0-78ff-4400-9a4b-3a05d136b1f3 ReadOnlyLSN | 0 ReadWriteLSN | 0 BackupSizeInBytes | 434962432 SourceBlockSize | 512 FileGroupId | 2 LogGroupGUID | NULL DifferentialBaseLSN | 626000002440500037 DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065 IsReadOnly | 0 IsPresent | 1 TDEThumbprint | NULL SnapshotUrl | NULL -[ RECORD 3 ]------------------------- LogicalName | WWI_Log PhysicalName | E:\Log\WideWorldImporters.ldf Type | L FileGroupName | NULL Size | 104857600 MaxSize | 2199023255552 FileId | 2 CreateLSN | 0 DropLSN | 0 UniqueId | 6ac6807e-8774-415b-8efc-e8c569b0855e ReadOnlyLSN | 0 ReadWriteLSN | 0 BackupSizeInBytes | 0 SourceBlockSize | 512 FileGroupId | 0 LogGroupGUID | NULL DifferentialBaseLSN | 0 DifferentialBaseGUID | 00000000-0000-0000-0000-000000000000 IsReadOnly | 0 IsPresent | 1 TDEThumbprint | NULL SnapshotUrl | NULL -[ RECORD 4 ]------------------------- LogicalName | WWI_InMemory_Data_1 PhysicalName | D:\Data\WideWorldImporters_InMemory_Data_1 Type | S FileGroupName | WWI_InMemory_Data Size | 0 MaxSize | 0 FileId | 65537 CreateLSN | 624000000336200003 DropLSN | 0 UniqueId | f65663c8-a250-433e-bbe6-e13a5599a607 ReadOnlyLSN | 0 ReadWriteLSN | 0 BackupSizeInBytes | 980090880 SourceBlockSize | 512 FileGroupId | 3 LogGroupGUID | NULL DifferentialBaseLSN | 626000002440500037 DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065 IsReadOnly | 0 IsPresent | 1 TDEThumbprint | NULL SnapshotUrl | NULL
Така можем да видим, че физическите местоположения на този файл използват пътеки на файлове на Windows. Например първият (с логическо име WWI_Primary ) има физическо местоположение D:\Data\WideWorldImporters.mdf .
В моя случай възстанових базата данни в SQL Server за Linux (работи в Docker контейнер на моя Mac), така че когато възстанових този .bak файл в моята система, трябваше да променя физическите пътища, за да отговарят на моята система.
Разбира се, можете също да промените пътеките на файла, когато го възстановявате на машина с Windows, ако е необходимо.
Пълният синтаксис
Архивирането и възстановяването на бази данни може да бъде доста ангажирано, в зависимост от вашите изисквания. RESTORE
изявлението е предназначено да обхваща много различни сценарии. По-специално, той обхваща следните сценарии за възстановяване:
- Възстановяване на цяла база данни от пълно архивиране на база данни (пълно възстановяване).
- Възстановяване на част от база данни (частично възстановяване).
- Възстановяване на конкретни файлове или файлови групи в база данни (възстановяване на файл).
- Възстановяване на конкретни страници в база данни (възстановяване на страница).
- Възстановяване на регистър на транзакции в база данни (възстановяване на регистрационен файл на транзакции).
- Върнете база данни до момента във времето, заснет от моментна снимка на базата данни.
Пълният синтаксис съдържа много опции, така че ако вашите изисквания надхвърлят обхвата на тази статия, вижте документацията на Microsoft за официалния RESTORE
синтаксис и обяснение.
Прочетете също прегледа на възстановяването и възстановяването на Microsoft за преглед на различните съображения и подходи за възстановяване на бази данни.