Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос по восстановлению БД в MSSQL.  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Дрюкаю теорию дампами, наткнулся на вопрос. В общем есть БД с несколькими файловыми группами и файлами, один файл испорчен, какое восстановление нужно сделать
- из полного бэкапа
- еще чота
- из бэкапа файла

И правильный ответ 3. Ок. Хочу воспроизвести это на практике - и чота не получается. Подскажите что не так делаю:
+ создаем БД и бэкапы
CREATE DATABASE [sales]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'sales', FILENAME = N'D:\MSSQL\Data\sales.mdf' , SIZE = 8192KB , FILEGROWTH = 65536KB ), 
 FILEGROUP [archives] 
( NAME = N'SalesArch_1', FILENAME = N'D:\MSSQL\Data\SalesArch_1.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ),
( NAME = N'SalesArch_2', FILENAME = N'D:\MSSQL\Data\SalesArch_2.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ), 
 FILEGROUP [xactions] 
( NAME = N'sales_1', FILENAME = N'D:\MSSQL\Data\sales_1.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ),
( NAME = N'sales_2', FILENAME = N'D:\MSSQL\Data\sales_2.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ),
( NAME = N'sales_3', FILENAME = N'D:\MSSQL\Data\sales_3.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'sales_log', FILENAME = N'D:\MSSQL\Data\sales_log.ldf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
GO


create table sales.dbo.t1 (id int identity primary key) on [xactions]
go
insert sales.dbo.t1 default values
go 10

backup database sales file = 'sales' to disk = 'D:\MSSQL\backup\sales.bak' with format, init
backup database sales file = 'SalesArch_1' to disk = 'D:\MSSQL\backup\SalesArch_1.bak' with format, init
backup database sales file = 'SalesArch_2' to disk = 'D:\MSSQL\backup\SalesArch_2.bak' with format, init
backup database sales file = 'sales_1' to disk = 'D:\MSSQL\backup\sales_1.bak' with format, init
backup database sales file = 'sales_2' to disk = 'D:\MSSQL\backup\sales_2.bak' with format, init
backup database sales file = 'sales_3' to disk = 'D:\MSSQL\backup\sales_3.bak' with format, init
backup log sales to disk = 'D:\MSSQL\backup\sales.trn' with format, init
go
insert sales.dbo.t1 default values
go 10
backup log sales to disk = 'D:\MSSQL\backup\sales.trn'
go

А теперь хочу восстановить:
+ пробую так
restore database sales file = 'sales_1' from disk = 'D:\MSSQL\backup\sales_1.bak' with norecovery
restore log sales from disk = 'D:\MSSQL\backup\sales.trn' with norecovery

Все проходит, но вот таблица созданная не селектится
Msg 8653, Level 16, State 1, Line 58
The query processor is unable to produce a plan for the table or view 't1' because the table resides in a filegroup that is not online.
Все файлы в файловой группе [XACTIONS] в состоянии RESTORING
select name,state_desc from sales.sys.database_files


И вопрос - каким образом мне их вывести из этого состояния в онлайн?
11 апр 18, 10:41    [21328700]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
With norecovery ?
11 апр 18, 10:49    [21328732]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Дедушка
With norecovery ?

Всяко пробовал стопицот вариантов - пока не нашел ни одного рабочего

К сообщению приложен файл. Размер - 53Kb
11 апр 18, 10:53    [21328759]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Eleanor
Member

Откуда:
Сообщений: 2859
Дед-Папыхтет,

Вам в сообщении пишут, в чем ошибка - нужно снять еще один бэкап и накатить его:
RESTORE DATABASE [sales] FILE = N'sales_1' FROM  DISK = N'D:\MSSQL\backup\sales_1.bak' WITH  FILE = 1,  NORECOVERY
GO
RESTORE LOG [sales] FROM  DISK = N'D:\MSSQL\backup\sales.trn' WITH  FILE = 1,  NORECOVERY
GO
RESTORE LOG [sales] FROM  DISK = N'D:\MSSQL\backup\sales.trn' WITH  FILE = 2
GO
---
BACKUP LOG sales TO DISK = 'D:\MSSQL\backup\sales.trn'
go
RESTORE LOG [sales] FROM  DISK = N'D:\MSSQL\backup\sales.trn' WITH  FILE = 3
GO
11 апр 18, 11:08    [21328812]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Eleanor
Дед-Папыхтет,

Вам в сообщении пишут, в чем ошибка - нужно снять еще один бэкап и накатить его:
RESTORE DATABASE [sales] FILE = N'sales_1' FROM  DISK = N'D:\MSSQL\backup\sales_1.bak' WITH  FILE = 1,  NORECOVERY
GO
RESTORE LOG [sales] FROM  DISK = N'D:\MSSQL\backup\sales.trn' WITH  FILE = 1,  NORECOVERY
GO
RESTORE LOG [sales] FROM  DISK = N'D:\MSSQL\backup\sales.trn' WITH  FILE = 2
GO
---
BACKUP LOG sales TO DISK = 'D:\MSSQL\backup\sales.trn'
go
RESTORE LOG [sales] FROM  DISK = N'D:\MSSQL\backup\sales.trn' WITH  FILE = 3
GO

Получилось, спасибо большое Запомню как делать нужно. Не совсем понятен смысл бэкапа и восстановления лога... последнего
11 апр 18, 12:05    [21329033]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Eleanor
Member

Откуда:
Сообщений: 2859
Дед-Папыхтет
Не совсем понятен смысл бэкапа и восстановления лога... последнего

Sql Server не знает, были ли изменения в файле sales_1 между последним бэкапом лога и моментом начала восстановления.
А когда уже начато восстановление, и файл перешел в состояние recovering, изменения принципиально невозможны.
Поэтому приходится снимать дополнительный бэкап лога уже в recovering состоянии.
11 апр 18, 12:47    [21329217]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Eleanor,

Его можно снимать сразу после того как файл ушел в offline, в него уже и так ничего не запишется, не обязательно в процессе.
Поэтому Backup Log можно было в самом начале поставить.
11 апр 18, 12:50    [21329234]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Eleanor
Member

Откуда:
Сообщений: 2859
aleksrov,

Но ТС в своем тесте файл не испортил, он оставался online, поэтому ему пришлось дожидаться состояния recovering.
11 апр 18, 12:57    [21329264]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Eleanor,

Я думал он у него битый.
Но тогда можно было бы как раз таки отправить его в Offline и дальше его мучать.
11 апр 18, 13:01    [21329283]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Eleanor
Member

Откуда:
Сообщений: 2859
aleksrov,

Попробуйте сами. Переводим файл в offline и снимаем бэкап лога:
...
insert sales.dbo.t1 default values
go 10
alter database sales modify file (name = 'sales_1', offline)
go
select name,state_desc from sales.sys.database_files --дает offline
go
backup log sales to disk = 'C:\MSSQL\backup\sales.trn'
go

Выполняем команды ТС на восстановление и получаем то же самое сообщение
"Additional roll forward is required to complete the restore sequence", и файл остается в состоянии restoring
11 апр 18, 13:21    [21329376]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Eleanor
Member

Откуда:
Сообщений: 2859
aleksrov,

На имя диска в командах не обращайте внимания - у меня только C есть, забыла на D изменить.
11 апр 18, 13:23    [21329393]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Eleanor,

CREATE DATABASE [Tes] 
 CONTAINMENT = NONE 
 ON  PRIMARY  
( NAME = N'Tes', FILENAME = N'C:\Data\Tes.mdf' , SIZE = 5120KB , FILEGROWTH = 5120KB ), 
Filegroup T_Off 
( NAME = N'Tes_Off', FILENAME = N'C:\Data\Tes_off.ndf' , SIZE = 5120KB , FILEGROWTH = 5120KB ) 
 LOG ON  
( NAME = N'Tes_log', FILENAME = N'C:\Data\Tes_log.ldf' , SIZE = 5120KB , FILEGROWTH = 10240KB ) 
GO 
Use [Tes] 
Create Table T  
(id int null) 
on T_Off 
go 
insert into [T] 
values (1) 
go 
Backup database [Tes] to disk = 'C:\Data\Backup\Full_Tes.bak' 
insert into [T] 
values (2) 
go  
Backup Log [Tes] to disk = 'C:\Data\Backup\Log1_Tes.bak' 
go 
insert into [T] 
values (3) 
go 
Alter Database [Tes] modify file (name = 'Tes_Off', offline) 
--Файл в offline 
go 
Backup Log [Tes] to disk = 'C:\Data\Backup\Log2_Tes.bak'  
go 
use [master] 
restore database [Tes] File  = N'Tes_Off' from disk = 'C:\Data\Backup\Full_Tes.bak' with norecovery 
restore log [Tes] from disk =  'C:\Data\Backup\Log1_Tes.bak' with norecovery 
restore log [Tes] from disk =  'C:\Data\Backup\Log2_Tes.bak' 


Все прекрасно работает.
11 апр 18, 13:59    [21329500]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Eleanor
Member

Откуда:
Сообщений: 2859
aleksrov,

Поправьте свой код, чтобы он соответствовал примеру ТС-а:
Filegroup T_Off 
( NAME = N'Tes_Off', FILENAME = N'C:\MSSQL\Data\Tes_off.ndf' , SIZE = 5120KB , FILEGROWTH = 5120KB)
, (NAME = N'Tes_Off2', FILENAME = N'C:\MSSQL\Data\Tes_off2.ndf' , SIZE = 5120KB , FILEGROWTH = 5120KB )

И теперь у вас все прекрасно не работает.
11 апр 18, 14:42    [21329739]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Eleanor,

Оу, тут два файла. Тогда отправьте второй файл в Offline и все также заработает.
Я думаю дело в том что второй файл остается онлайн. Да, мы ничего не можем делать с данными в этой FG, то sys.database_files и sys.master_files показывает что второй файл онлайн, видимо это и смущает SQL.
12 апр 18, 07:20    [21331737]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Eleanor
Member

Откуда:
Сообщений: 2859
aleksrov,

Какими командами потом переводить второй файл в online?
Сейчас вы придете к тому, что все файлы из файловой группы придется в итоге восстановить из бэкапа.

На самом деле если хоть один файл в группе переведен в offline, вся файловая группа становятся недоступна для доступа пользователей (BOL: OFFLINE Sets the file offline and makes all objects in the filegroup inaccessible).
Но Sql Server при восстановлении бэкапа этим фактом не пользуется.
12 апр 18, 10:39    [21332351]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Eleanor,

Я знаю, я об этом писал выше. Также естетсвенно второй файл придется восстанавливать из Backup после перевода в offline. Но я не об этом говорю, а о том что Backup лога можно сделать сразу, тогда уточню, при определенных ситуациях.
12 апр 18, 11:12    [21332477]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Eleanor
Member

Откуда:
Сообщений: 2859
Резюмирую:

Если нужно восстановить только один файл, то придется дожидаться состояния recovering и снимать доп. бэкап лога.
Или можно вместо одного файла восстановить целую файловую группу, предварительно переведя все файлы в ней в offline. Зато не придется снимать доп. бэкап лога.
12 апр 18, 11:45    [21332609]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Дед-Папыхтет
Member [заблокирован]

Откуда:
Сообщений: 2808
Eleanor,

Спасибо большое ещё раз за примеры - подтянул пробелы )))
12 апр 18, 12:02    [21332676]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
Jasonclark03
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 17
Прежде чем приступить к восстановлению базы данных, проверьте и проверьте носитель. Если ваш файл базы данных поврежден, вы можете восстановить его с помощью SQL Backup Recovery Tool.
25 апр 18, 09:14    [21366673]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по восстановлению БД в MSSQL.  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Jasonclark03,

Вы считай в каждом сообщении ее рекламируете. За 150$ неудивительно что такая хрень плохо продается и надо в каждой более или менее связанной теме орать какая класная штука.
25 апр 18, 09:30    [21366708]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить