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

Откуда:
Сообщений: 534
Переносил базу с одного сервера на другой при помощи Detach-> перенос файлов БД на другой сервер-> Attach, но во время перемещения файлов произошел сбой и один из файлов в файловой группе испортился и теперь при Attach SSMS пишет что не может присоединить БД так как отсутствует файл.

Если это важно то в БД использовалось секционирование и каждой секции соответствует файловая группа и 1 файл, вот одного из таких файлов и не хватает. Возможно ли присоединить базу с отсутствующим файлом?
11 янв 18, 20:44    [21098991]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36691
Нет, не возможно. Бэкап вам в помощь.
12 янв 18, 00:33    [21099469]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
lex452
Member

Откуда:
Сообщений: 534
Гавриленко Сергей Алексеевич,

И вообще нет никаких вариантов, хотя бы частично восстановить данные. Бэкапа нет, а данных очень много.
21 янв 18, 18:08    [21124585]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30763
lex452
Гавриленко Сергей Алексеевич,

И вообще нет никаких вариантов, хотя бы частично восстановить данные. Бэкапа нет, а данных очень много.
Нет.

Только если пытаться читать данные напрямую из файлов БД какими то сторонними тулзами, типа SQL Server Repair Toolbox
21 янв 18, 19:09    [21124659]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
lex452
Гавриленко Сергей Алексеевич,

И вообще нет никаких вариантов, хотя бы частично восстановить данные. Бэкапа нет, а данных очень много.

Поделюсь с вами секретной ссылкой, только имейте в виду, что это не способ восстановления базы в работоспособное состояние, а способ получить хоть какие-то данные из имеющегося набора файлов:

https://www.sql.ru/forum/1174641-2/ne-prisoedinyaetsya-bd-posle-udaleniya-fayla
22 янв 18, 10:09    [21125509]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Minamoto
Поделюсь с вами секретной ссылкой, только имейте в виду, что это не способ восстановления базы в работоспособное состояние, а способ получить хоть какие-то данные из имеющегося набора файлов:

https://www.sql.ru/forum/1174641-2/ne-prisoedinyaetsya-bd-posle-udaleniya-fayla

Случайно линк на вторую страницу дал, читайте с первой.
22 янв 18, 10:10    [21125512]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2374
lex452,

начать играться с базой и не сделать бэкапа??? "королева в всохищении!" (С)
22 янв 18, 11:47    [21125907]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
Vpsem
Member

Откуда: Киев
Сообщений: 54
Если еще актуально, то всё возможно: http://www.sqlnotes.info/2013/05/07/attach-database-with-missing-ndf-file/
Проверял, работает, только есть не описанный в статье нюанс: если база имеет больше двух файлов (а у вас явно больше), то файлы пустышки нужно делать с теми же file_id как и в оригинале.
15 фев 18, 13:47    [21193794]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
lex452
Member

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

Спасибо, я натыкался на эту ссылку, только вот как мне узнать какие File_id были у потерянных файлов. Я пробовал подобным способом, но сервер все равно ругается и не видит файлов, но нужно еще раз попробовать и потестить с разными File_id
15 фев 18, 20:10    [21195066]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
Vpsem
Member

Откуда: Киев
Сообщений: 54
как мне узнать какие File_id были у потерянных файлов
об этом помнит старый master, он ведь бекапился:)?
19 фев 18, 12:48    [21201545]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
lex452
Member

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

Даже если бы и бэкапился то уже перезатерся(( Других вариантов нет?
19 фев 18, 21:59    [21203327]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
sfyj
Guest
DBCC CheckPrimaryFile(N'C:\Users\My\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\v11.0\mydb.mdf',3)
20 фев 18, 10:01    [21203831]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
lex452
Member

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

Check primary file помогло определить fileid. По при попытке сделать онлайн пишет: one or more files not match the primary file of the database. Как я понимаю указывает что есть еще битые файлы, но не пишет какие((( буду пробовать делать все их оффлайн, а потом по одному добавлять. Но файлов больше 100 (
21 фев 18, 21:28    [21209800]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
sfyj
Guest
lex452,

так база прицепилась хоть в каком-нибудь виде ? Например, SUSPECT

Можете выполнить ?
ALTER DATABASE [dbName] SET EMERGENCY;
GO
22 фев 18, 09:40    [21210296]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
lex452
Member

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

Прицепилась как recovery pendind, в emergency не дает уйти
22 фев 18, 09:51    [21210318]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
sfyj
Guest
lex452,

можно попробовать отцепить базу, убрать куда-нибудь ldf, и попробовать прицепить с FOR ATTACH_REBUILD_LOG.

Возможно, после этого получится перейти в EMERGENCY.

Тогда можно будет для потерянного файла выполнить
ALTER DATABASE [dbName] MODIFY FILE (NAME = 'dbName_dat13' , OFFLINE)

И затем перевести базу в ONLINE
ALTER DATABASE [dbName] SET ONLINE;
22 фев 18, 10:02    [21210339]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
sfyj
Guest
lex452,

а как вы увидели, что база не перевелась в EMERGENCY ?

То, что команда
ALTER DATABASE [dbName] SET EMERGENCY;
выдаёт ошибку "Unable to open the physical file" ещё ни о чём не говорит.
22 фев 18, 10:10    [21210353]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
lex452
sfyj,

Прицепилась как recovery pendind, в emergency не дает уйти

пойдите в еррорлог и прочтите, почему это recovery pending.
22 фев 18, 10:32    [21210398]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
sfyj
можно попробовать отцепить базу, убрать куда-нибудь ldf, и попробовать прицепить с FOR ATTACH_REBUILD_LOG.

а вы знаете, что есть recovery pending?
это значит, что база не была cleanly shutdown.
т.е. надо делать redo и undo, из лога.
и если даже вы будете цеплять базу без лога,
она(база) все равно знает, что имеются незавершенные транзакции,
так что никакой лог она ребилдить не будет.

кстати, FOR ATTACH_REBUILD_LOG не нужен, если файл лога один,
это надо для нескольких файлов лога.
при наличии всего одного лога + database was cleanly shutdown
FOR ATTACH без лога уже лог пересоздаст
22 фев 18, 10:38    [21210411]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
sfyj
Guest
Yasha123,

set nocount on;

use [master]
go
if exists (select 1 from sys.databases where name = 'test')
	DROP DATABASE [test];
GO

CREATE DATABASE [test]
ON  PRIMARY
	( NAME = N'test'	, FILENAME = N'C:\TEMP\test.mdf'	, SIZE = 64MB , MAXSIZE = UNLIMITED, FILEGROWTH = 5MB ),
FILEGROUP [SECONDARY] DEFAULT
	( NAME = N'test_dat'	, FILENAME = N'C:\TEMP\test_dat.ndf'	, SIZE = 64MB , MAXSIZE = UNLIMITED, FILEGROWTH = 5MB )
LOG ON
	( NAME = N'test_log'	, FILENAME = N'C:\TEMP\test_log.ldf'	, SIZE = 64MB , MAXSIZE = UNLIMITED, FILEGROWTH = 5MB )
GO

use [test]
GO
CREATE PARTITION FUNCTION [PF](int) AS RANGE RIGHT FOR VALUES ( 100 )
GO
CREATE PARTITION SCHEME [PS] AS PARTITION [PF] TO ([PRIMARY], [SECONDARY])
GO
CREATE TABLE [dbo].[PT] ( [ID] [INT] NOT NULL ) ON [PS]([ID])
GO
CREATE UNIQUE CLUSTERED INDEX [IDC_PT] ON [dbo].[PT] ( [ID] ) ON [PS]([ID])
GO
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (1);
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (2);
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (3);
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (99);
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (100);
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (101);
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (102);
GO
SELECT * FROM [test].[dbo].[PT]
GO

use [master]
GO
ALTER DATABASE [test] SET OFFLINE;
GO

exec xp_cmdshell 'del "C:\TEMP\test_dat.ndf"', no_output
GO

begin try
	ALTER DATABASE [test] SET ONLINE;
end try
begin catch
	select [name], [state_desc] from sys.databases where [name] = N'test';
end catch
GO

begin try
	ALTER DATABASE [test] SET EMERGENCY;
end try
begin catch
end catch
GO
select [name], [state_desc] from sys.databases where [name] = N'test';
GO

ALTER DATABASE [test] MODIFY FILE (NAME = 'test_dat' , OFFLINE)
GO

ALTER DATABASE [test] SET ONLINE;
GO

begin try
	SELECT * FROM [test].[dbo].[PT]
end try
begin catch
	SELECT 'This may limit the query result.'
end catch
GO
22 фев 18, 11:06    [21210506]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
sfyj,
у него в recovery pending не когда не хватает одного файла данных,
а когда он файлы подменил и тот, от которого нет оригинала,
в офлайн отправил.
так что репро не катит, ибо в вашем репро он лезет в недостающий файл,
а в случае ТС тот файл в офлайне и recovery pending не из-за него
22 фев 18, 11:38    [21210629]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
lex452,
еще раз, откройте еррорлог и прочтите, чего ему для recovery не хватает.
в репро sfyj, например, пишут:
автор
FileMgr::StartSecondaryDataFiles: Operating system error 2(The system cannot find the file specified.) occurred while creating or opening file 'C:\TEMP\test_dat.ndf'. Diagnose and correct the operating system error, and retry the operation.


т.е. конкретно пишет, что нужен ему C:\TEMP\test_dat.ndf, и что The system cannot find the file specified
22 фев 18, 11:41    [21210645]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
sfyj
Guest
lex452,

EMERGENCY не нужен

set nocount on;

use [master]
go
if exists (select 1 from sys.databases where name = 'test')
	DROP DATABASE [test];
GO

exec xp_cmdshell 'del "C:\TEMP\test_pri.mdf"', no_output
exec xp_cmdshell 'del "C:\TEMP\test_pri.mdf.safe"', no_output
exec xp_cmdshell 'del "C:\TEMP\test_sec.ndf"', no_output
exec xp_cmdshell 'del "C:\TEMP\test_log.ldf"', no_output
exec xp_cmdshell 'del "C:\TEMP\test_log.ldf.safe"', no_output
GO

CREATE DATABASE [test]
ON  PRIMARY
	( NAME = N'test_pri'	, FILENAME = N'C:\TEMP\test_pri.mdf'	, SIZE = 64MB , MAXSIZE = UNLIMITED, FILEGROWTH = 5MB ),
FILEGROUP [SECONDARY] DEFAULT
	( NAME = N'test_sec'	, FILENAME = N'C:\TEMP\test_sec.ndf'	, SIZE = 64MB , MAXSIZE = UNLIMITED, FILEGROWTH = 5MB )
LOG ON
	( NAME = N'test_log'	, FILENAME = N'C:\TEMP\test_log.ldf'	, SIZE = 64MB , MAXSIZE = UNLIMITED, FILEGROWTH = 5MB )
GO

use [test]
GO
CREATE PARTITION FUNCTION [PF](int) AS RANGE RIGHT FOR VALUES ( 100 )
GO
CREATE PARTITION SCHEME [PS] AS PARTITION [PF] TO ([PRIMARY], [SECONDARY])
GO
CREATE TABLE [dbo].[PT]( [ID] [INT] NOT NULL ) ON [PS]([ID])
GO
CREATE UNIQUE CLUSTERED INDEX [IDC_PT] ON [dbo].[PT] ( [ID] ) ON [PS]([ID])
GO
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (1);
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (2);
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (3);
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (99);
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (100);
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (101);
INSERT INTO [dbo].[PT] ( [ID] ) VALUES (102);
GO
SELECT * FROM [test].[dbo].[PT]
GO


use [master];
GO
ALTER DATABASE [test] SET OFFLINE WITH ROLLBACK IMMEDIATE;
GO
exec xp_cmdshell 'del "C:\TEMP\test_sec.ndf"', no_output
GO
DBCC CheckPrimaryFile ( N'C:\TEMP\test_pri.mdf' , 3 )
GO
-- Это будет база с потерянным NDF
exec xp_cmdshell 'rename "C:\TEMP\test_pri.mdf" "test_pri.mdf.safe"', no_output
exec xp_cmdshell 'rename "C:\TEMP\test_log.ldf" "test_log.ldf.safe"', no_output
GO
DROP DATABASE [test];
GO


CREATE DATABASE [test]
ON  PRIMARY
	( NAME = N'test_pri'	, FILENAME = N'C:\TEMP\test_pri.mdf'	, SIZE = 64MB , MAXSIZE = UNLIMITED, FILEGROWTH = 5MB ),
FILEGROUP [SECONDARY] DEFAULT
	( NAME = N'test_sec'	, FILENAME = N'C:\TEMP\test_sec.ndf'	, SIZE = 64MB , MAXSIZE = UNLIMITED, FILEGROWTH = 5MB )
LOG ON
	( NAME = N'test_log'	, FILENAME = N'C:\TEMP\test_log.ldf'	, SIZE = 64MB , MAXSIZE = UNLIMITED, FILEGROWTH = 5MB )
GO

-- Это потерянный файл NDF
ALTER DATABASE [test] MODIFY FILE ( NAME = 'test_sec' , OFFLINE );
GO
ALTER DATABASE [test] SET OFFLINE WITH ROLLBACK IMMEDIATE;
GO
exec xp_cmdshell 'del "C:\TEMP\test_pri.mdf"', no_output
exec xp_cmdshell 'del "C:\TEMP\test_log.ldf"', no_output
exec xp_cmdshell 'rename "C:\TEMP\test_pri.mdf.safe" test_pri.mdf', no_output
exec xp_cmdshell 'rename "C:\TEMP\test_log.ldf.safe" test_log.ldf', no_output
GO

ALTER DATABASE [test] SET ONLINE;
GO

--ALTER DATABASE [test] SET NEW_BROKER;
GO

select name ,user_access_desc ,state_desc ,service_broker_guid ,is_broker_enabled
from sys.databases where name = N'test'

begin try
	SELECT * FROM [test].[dbo].[PT];
end try
begin catch
	select 'This may limit the query result.'
end catch
GO
22 фев 18, 12:41    [21210844]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
lex452
Member

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

В принципе по данному алгоритму я и проводим манипуляции, но на этапе
ALTER DATABASE [test] SET ONLINE;

База уходит в RECOVERY PENDING, и не на какие манипуляции больше не отвечает
22 фев 18, 14:45    [21211387]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД с потерянной файловой группой  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
lex452
sfyj,

В принципе по данному алгоритму я и проводим манипуляции, но на этапе
ALTER DATABASE [test] SET ONLINE;

База уходит в RECOVERY PENDING, и не на какие манипуляции больше не отвечает

почему не посмотреть в еррорлоге, какого файла ему не хватает?
22 фев 18, 15:28    [21211550]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить