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

Откуда:
Сообщений: 29
Добрый день !

Возникла необходимость перенести БД MSSQL 2008 , которая находится в состоянии emergency на другой сервер, чтобы разобраться в чем проблема и вытащить данные. До этого база находилась в состоянии SUSPECT из которого ее перевели в EMERGENCY скриптом(в этом режиме можно хотя бы доступ к данным и структуре получить).

Предварительные проверки DBCC CHECKDB выполнялись - в логе писалось типа ошибок не найдено , но когда ее переводишь в рабочий режим пишет ошибку целостности структуры и пр.

Базу отмонтировали - перенесли на другой сервер - пытаемся примонтировать через мастер и командой CREATE DATABASE...FOR ATTACH - выдает ошибку о невозможности примонтирования из-за ошибки целостности и пр. В инструкции необходимые ключи не нашел.

Базу уже ни на старый , ни на новый сервер не удается примонтировать :( . Про бэкапы не спрашивайте - нужны последние данные

Жду предложений.
18 сен 15, 11:53    [18164723]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
Glory
Member

Откуда:
Сообщений: 104760
rusrussia
Жду предложений.

Причина уже была в логе вашего сервера.
Нужно было выгружать те данные, которые можно было выгрузить.
18 сен 15, 11:59    [18164753]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
http://www.sqlskills.com/blogs/paul/creating-detaching-re-attaching-and-fixing-a-suspect-database/
18 сен 15, 12:16    [18164842]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
rusrussia
Member

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

Попробовал способ . Без положительного результата.

В статье использовал рекомендации из после фразы "So, never detach a suspect database." :)

1. Перевел созданную пустую БД (идентичную по названиям БД,файлов, БД у меня с 2-файловыми группами) в оффлайн,
2. Заменил файлы своими,
3. Запустил команду на перевод в онлайн (именно на операции online) - выдает ошибку (см. файл)

. Физически указанные файлы находятся там, права на них полные для всех пользователей.
Состояние БД в списке БД меняется на ОНЛАЙН (не suspect !) , но при попытке посмотреть структуру - выдает ошибку о не возможности доступа к структуре.
4. Пытаюсь выполнить перевод в emergency
ALTER DATABASE MY_DB SET EMERGENCY
выдает ошибку (о невозможности подсоединения файла , относящегося к второй файловой группе)
Msg 5161, Level 16, State 1, Line 1
An unexpected file id was encountered. File id 3 was expected but 4 was read from "F:\bases\MY_DB_SEC.ndf". Verify that files are mapped correctly in sys.master_files. ALTER DATABASE can be used to correct the mappings.

5. Согласно ошибке - смотрю sys.master_files - здесь я пока ничего не понимаю - но вроде все корректно (см. файл)

К сообщению приложен файл (Desktop.zip - 46Kb) cкачать
19 сен 15, 13:33    [18169550]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
rusrussia
File id 3 was expected but 4 was read from "F:\bases\MY_DB_SEC.ndf".


создайте липовую базу так, чтобы file_id совпадали с тем, как в той что вы подсовываете.

только недавно тема была https://www.sql.ru/forum/1174641/ne-prisoedinyaetsya-bd-posle-udaleniya-fayla?hl=
19 сен 15, 13:40    [18169566]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
rusrussia
Member

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

Сейчас все операции происходят на резервном сервере .
Если я в этой таблице изменю file_id для этой БД на те, что в рабочем сервере - может проблема исправиться ?

Реально не получается создать ту структуру каталогов , как на рабочем сервере , т.к. там использовалось несколько дисков, а на резервном все БД на одном хранятся.
19 сен 15, 14:22    [18169641]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
rusrussia
Member

Откуда:
Сообщений: 29
churupaha
rusrussia
File id 3 was expected but 4 was read from "F:\bases\MY_DB_SEC.ndf".


создайте липовую базу так, чтобы file_id совпадали с тем, как в той что вы подсовываете.

только недавно тема была https://www.sql.ru/forum/1174641/ne-prisoedinyaetsya-bd-posle-udaleniya-fayla?hl=



Сделал так , чтобы file_id соответствовал 4 (так на рабочем сервере) следующим образом : создал сначала БД с 2 файлами (mdf ldf), потом добавил 3 файл (с отличным названием от MY_DB_SEC.ndf) , потом добавил еще один файл MY_DB_SEC.ndf . получилось для него file_id =4. Потом удалил 3 файл.

получили БД с 3 файлами и file_id =4 для MY_DB_SEC.ndf

Потом по накатанной схема :
1. БД в оффлайн,
2.Заменяем нужными файлами
3. БД в онлайн - потом она сначала In Recovery - потом SUSPECT
4. Потом БД в EMERGENCY - и вот вроде бы наша цель достигнута , но
все равно структуру просмотреть не получается :(

Попытался сделать
DBCC CHECKDB (N'AT', REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS;
В ответ получаю

Msg 946, Level 14, State 1, Line 1
Cannot open database 'MY_BD' version 655. Upgrade the database to the latest version.

Печаль
19 сен 15, 15:28    [18169745]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
rusrussia,

+ портим, отсоединяем

:setvar DbPath "c:\temp\prod"
go

create database db on
primary 
(name = 'db', filename = '$(DbPath)\db.mdf'),

filegroup fg1 
(name = 'db_fg1_f1', filename = '$(DbPath)\db_fg1_f1.ndf'),
(name = 'db_fg1_f2', filename = '$(DbPath)\db_fg1_f2.ndf'),
(name = 'db_fg1_f3', filename = '$(DbPath)\db_fg1_f3.ndf'),
filegroup fg2
(name = 'db_fg2_f1', filename = '$(DbPath)\db_fg2_f1.ndf'),
(name = 'db_fg2_f2', filename = '$(DbPath)\db_fg2_f2.ndf'),
(name = 'db_fg2_f3', filename = '$(DbPath)\db_fg2_f3.ndf'),
filegroup fg3
(name = 'db_fg3_f1', filename = '$(DbPath)\db_fg3_f1.ndf'),
(name = 'db_fg3_f2', filename = '$(DbPath)\db_fg3_f2.ndf'),
(name = 'db_fg3_f3', filename = '$(DbPath)\db_fg3_f3.ndf')

log on 
(name = 'db_log', filename = '$(DbPath)\db_log.ldf');
go

use db;
go

create table fg1_t1(id int, data varchar(100)) on fg1;
go
create table fg2_t2(id int, data varchar(100)) on fg2;
go
create table fg3_t3(id int, data varchar(100)) on fg3;
go

insert into fg1_t1(id, data)
select column_id, name from sys.all_columns;

insert into fg2_t2(id, data)
select column_id, name from sys.all_columns;
go

select serverproperty('processid') as [sqlservr.exe PID];
go

insert into fg3_t3(id, data)
select column_id, name from sys.all_columns;
go 1000000


/* 
В другом окне shutdown with nowait;

Msg 109, Level 20, State 0, Line 43
A transport-level error has occurred when receiving results from the server. (provider: Shared Memory Provider, error: 0 - The pipe has been ended.)

Портим transaction log в hex редакторе.

Стартуем sqlserver.

*/

alter database db set online;
go
/*
File activation failure. The physical file name "c:\temp\prod\db_log.ldf" may be incorrect.
Msg 5181, Level 16, State 5, Line 62
Could not restart database "db". Reverting to the previous status.
Msg 5069, Level 16, State 1, Line 62
ALTER DATABASE statement failed.
Msg 5243, Level 22, State 8, Line 62
An inconsistency was detected during an internal operation. Please contact technical support.
*/

select state_desc from sys.databases where name = 'db'
/* RECOVERY_PENDING */

alter database db set emergency;
go

select state_desc from sys.databases where name = 'db'
/* EMERGENCY */

exec sp_detach_db 'db';
go

/*
Command(s) completed successfully.
*/



+ присоединяем

-- пути отличаются
:setvar ProdDbPath "c:\temp\prod"
:setvar DevDbPath "e:\dev"
go

-- Создаем базу той же структуры, с тем же порядком файлов (file_id),
-- с ДРУГИМИ ПУТЯМИ на другом сервере, с теми же name
create database db on
primary 
(name = 'db', filename = '$(DevDbPath)\db.mdf'),

filegroup fg1 
(name = 'db_fg1_f1', filename = '$(DevDbPath)\db_fg1_f1.ndf'),
(name = 'db_fg1_f2', filename = '$(DevDbPath)\db_fg1_f2.ndf'),
(name = 'db_fg1_f3', filename = '$(DevDbPath)\db_fg1_f3.ndf'),
filegroup fg2
(name = 'db_fg2_f1', filename = '$(DevDbPath)\db_fg2_f1.ndf'),
(name = 'db_fg2_f2', filename = '$(DevDbPath)\db_fg2_f2.ndf'),
(name = 'db_fg2_f3', filename = '$(DevDbPath)\db_fg2_f3.ndf'),
filegroup fg3
(name = 'db_fg3_f1', filename = '$(DevDbPath)\db_fg3_f1.ndf'),
(name = 'db_fg3_f2', filename = '$(DevDbPath)\db_fg3_f2.ndf'),
(name = 'db_fg3_f3', filename = '$(DevDbPath)\db_fg3_f3.ndf')

log on 
(name = 'db_log', filename = '$(DevDbPath)\db_log.ldf');
go

alter database db set offline with rollback immediate;
go

-- заменяем файлы липовой базы, файлами боевой
exec xp_cmdshell 'move /Y $(ProdDbPath)\*.* $(DevDbPath)\'
go

select physical_name from sys.master_files where database_id = db_id(N'db');
/*
e:\dev\db.mdf
e:\dev\db_log.ldf
e:\dev\db_fg1_f1.ndf
e:\dev\db_fg1_f2.ndf
e:\dev\db_fg1_f3.ndf
e:\dev\db_fg2_f1.ndf
e:\dev\db_fg2_f2.ndf
e:\dev\db_fg2_f3.ndf
e:\dev\db_fg3_f1.ndf
e:\dev\db_fg3_f2.ndf
e:\dev\db_fg3_f3.ndf
*/

alter database db set online;
go
/*
File activation failure. The physical file name "c:\temp\dev\db_log.ldf" may be incorrect.
Msg 5181, Level 16, State 5, Line 35
Could not restart database "db". Reverting to the previous status.
Msg 5069, Level 16, State 1, Line 35
ALTER DATABASE statement failed.
Msg 5243, Level 22, State 8, Line 35
An inconsistency was detected during an internal operation. Please contact technical support.
*/

select state_desc from sys.databases where name = 'db'
/* RECOVERY_PENDING */

alter database db set emergency;
go
/*
Command(s) completed successfully.
*/

select state_desc from sys.databases where name = 'db'
/* EMERGENCY */


select physical_name 
from 
	sys.master_files 
where 
	database_id = db_id(N'db');
/*
e:\dev\db.mdf
e:\dev\db_log.ldf
e:\dev\db_fg1_f1.ndf
e:\dev\db_fg1_f2.ndf
e:\dev\db_fg1_f3.ndf
e:\dev\db_fg2_f1.ndf
e:\dev\db_fg2_f2.ndf
e:\dev\db_fg2_f3.ndf
e:\dev\db_fg3_f1.ndf
e:\dev\db_fg3_f2.ndf
e:\dev\db_fg3_f3.ndf
*/

select 
	physical_name 
from 
	db.sys.database_files;
/*
c:\temp\prod\db.mdf
c:\temp\prod\db_log.ldf
c:\temp\prod\db_fg1_f1.ndf
c:\temp\prod\db_fg1_f2.ndf
c:\temp\prod\db_fg1_f3.ndf
c:\temp\prod\db_fg2_f1.ndf
c:\temp\prod\db_fg2_f2.ndf
c:\temp\prod\db_fg2_f3.ndf
c:\temp\prod\db_fg3_f1.ndf
c:\temp\prod\db_fg3_f2.ndf
c:\temp\prod\db_fg3_f3.ndf
*/

-- Получается, не важно, где они лежали на исходной.

select @@version;
go
/*
Microsoft SQL Server 2014 - 12.0.4100.1 (X64) 
	Apr 20 2015 17:29:27 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
*/

use db;
go

select top(1) * from [dbo].[fg1_t1];
go
/* (1 row(s) affected) */

select top(1) * from [dbo].[fg2_t2];
go
/* (1 row(s) affected) */

select top(1) * from [dbo].[fg3_t3];
go
/* (1 row(s) affected) */

19 сен 15, 15:44    [18169793]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
rusrussia
Msg 946, Level 14, State 1, Line 1
Cannot open database 'MY_BD' version 655. Upgrade the database to the latest version.


select @@version на обоих серверах что выдает? (откуда/куда притащили базу)
19 сен 15, 15:45    [18169796]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
rusrussia
Member

Откуда:
Сообщений: 29
churupaha
rusrussia
Msg 946, Level 14, State 1, Line 1
Cannot open database 'MY_BD' version 655. Upgrade the database to the latest version.


select @@version на обоих серверах что выдает? (откуда/куда притащили базу)



На исходном сервере уже не получится выяснить - там база отмонтированна и не монтируется (из-за чего вся петрушка)

Исходный сервер (рабочий) - на нем проблемы были - система минимум 3 года стоит + модификации БД 100% были.
Резервный сервер - на нем систему поставили неделю назад . Конфигурация ПО идентичная. Отмонтированную базу с рабочего сервера во всех предыдщуих сообщениях пытался примонтировать к резервному серверу.
20 сен 15, 03:22    [18171571]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
o-o
Guest
Каким местом детачнутая база к версии сервера? Выполните select @@version в мастере. То, что вам присоветовали, надо на идентичных серверах делать, а у вас они разных версий, иначе второй сервер не требовал бы апгрэйд базы. Но еще ладно исходный сервер, раз 655 это точно 2008-ой, а тот второй? Приведите полностью результат select @@version на нем
20 сен 15, 08:33    [18171646]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
rusrussia
Member

Откуда:
Сообщений: 29
o-o
Каким местом детачнутая база к версии сервера? Выполните select @@version в мастере. То, что вам присоветовали, надо на идентичных серверах делать, а у вас они разных версий, иначе второй сервер не требовал бы апгрэйд базы. Но еще ладно исходный сервер, раз 655 это точно 2008-ой, а тот второй? Приведите полностью результат select @@version на нем


База была деаттачнута через кнопки в студиоменеджере
Рабочий :
Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Резервный (Все правильно - на резервном СУБД развернута как пробная на 180 дней ):
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Enterprise Evaluation Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
20 сен 15, 12:10    [18171933]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
rusrussia
o-o
Каким местом детачнутая база к версии сервера? Выполните select @@version в мастере. То, что вам присоветовали, надо на идентичных серверах делать, а у вас они разных версий, иначе второй сервер не требовал бы апгрэйд базы. Но еще ладно исходный сервер, раз 655 это точно 2008-ой, а тот второй? Приведите полностью результат select @@version на нем


База была деаттачнута через кнопки в студиоменеджере
Рабочий :
Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Резервный (Все правильно - на резервном СУБД развернута как пробная на 180 дней ):
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Enterprise Evaluation Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)


db version у этих двух версий сервера разная. потому на резервный рядышком ставьте

автор
Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
20 сен 15, 12:38    [18171989]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
o-o
Guest
churupaha
db version у этих двух версий сервера разная. потому на резервный рядышком ставьте

Вот ТС считает, что они одной версии.
Предлагаю жирненько: 2008 R2, который на втором сервере,
это старшая версия против 2008, с которого базу детачнули.
Так что ищите 2008-ой сервер и на нем проделайте все то же самое
20 сен 15, 14:04    [18172147]     Ответить | Цитировать Сообщить модератору
 Re: Как примонтировать базу в состоянии emergency  [new]
rusrussia
Member

Откуда:
Сообщений: 29
o-o
churupaha
db version у этих двух версий сервера разная. потому на резервный рядышком ставьте

Вот ТС считает, что они одной версии.
Предлагаю жирненько: 2008 R2, который на втором сервере,
это старшая версия против 2008, с которого базу детачнули.
Так что ищите 2008-ой сервер и на нем проделайте все то же самое



Сделал тоже самое на рабочем сервере

**Сделал так , чтобы file_id соответствовал 4 (так на рабочем сервере) следующим образом : создал сначала БД с 2 файлами (mdf **ldf), потом добавил 3 файл (с отличным названием от MY_DB_SEC.ndf) , потом добавил еще один файл MY_DB_SEC.ndf . **получилось для него file_id =4. Потом удалил 3 файл.
**получили БД с 3 файлами и file_id =4 для MY_DB_SEC.ndf
**Потом по накатанной схема :
**1. БД в оффлайн,
**2.Заменяем нужными файлами
**3. БД в онлайн - потом она сначала In Recovery - потом SUSPECT
**4. Потом БД в EMERGENCY - таблицы открываются , данные выковыриваются :)

ЦЕЛЬ ДОСТИГНУТА !
ВСЕ БОЛЬШОЕ СПАСИБО !
20 сен 15, 16:19    [18172452]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить