Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Възстановяване на база данни на SQL Server (T-SQL)

Ако използвате 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 за преглед на различните съображения и подходи за възстановяване на бази данни.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Въведение в идентичността на SQL Server

  2. Как да избера последните 5 реда в таблица без сортиране?

  3. Най-добрият начин за раздробяване на XML данни в колони на база данни на SQL Server

  4. Как да се покаже дата в британски формат в SQL Server (T-SQL)

  5. Нови функции на SQL Server 2019