powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Восстановление БД с потерянной файловой группой
25 сообщений из 35, страница 1 из 2
Восстановление БД с потерянной файловой группой
    #39582814
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переносил базу с одного сервера на другой при помощи Detach-> перенос файлов БД на другой сервер-> Attach, но во время перемещения файлов произошел сбой и один из файлов в файловой группе испортился и теперь при Attach SSMS пишет что не может присоединить БД так как отсутствует файл.

Если это важно то в БД использовалось секционирование и каждой секции соответствует файловая группа и 1 файл, вот одного из таких файлов и не хватает. Возможно ли присоединить базу с отсутствующим файлом?
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39582919
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, не возможно. Бэкап вам в помощь.
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39587879
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

И вообще нет никаких вариантов, хотя бы частично восстановить данные. Бэкапа нет, а данных очень много.
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39587895
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452Гавриленко Сергей Алексеевич,

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

Только если пытаться читать данные напрямую из файлов БД какими то сторонними тулзами, типа SQL Server Repair Toolbox
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39588116
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452Гавриленко Сергей Алексеевич,

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

http://www.sql.ru/forum/1174641-2/ne-prisoedinyaetsya-bd-posle-udaleniya-fayla
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39588119
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MinamotoПоделюсь с вами секретной ссылкой, только имейте в виду, что это не способ восстановления базы в работоспособное состояние, а способ получить хоть какие-то данные из имеющегося набора файлов:

http://www.sql.ru/forum/1174641-2/ne-prisoedinyaetsya-bd-posle-udaleniya-fayla
Случайно линк на вторую страницу дал, читайте с первой.
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39588180
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452,

начать играться с базой и не сделать бэкапа??? "королева в всохищении!" (С)
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39602323
Vpsem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если еще актуально, то всё возможно: http://www.sqlnotes.info/2013/05/07/attach-database-with-missing-ndf-file/
Проверял, работает, только есть не описанный в статье нюанс: если база имеет больше двух файлов (а у вас явно больше), то файлы пустышки нужно делать с теми же file_id как и в оригинале.
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39602649
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vpsem,

Спасибо, я натыкался на эту ссылку, только вот как мне узнать какие File_id были у потерянных файлов. Я пробовал подобным способом, но сервер все равно ругается и не видит файлов, но нужно еще раз попробовать и потестить с разными File_id
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39604102
Vpsem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как мне узнать какие File_id были у потерянных файлов
об этом помнит старый master, он ведь бекапился:)?
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39604463
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vpsem,

Даже если бы и бэкапился то уже перезатерся(( Других вариантов нет?
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39604588
sfyj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
DBCC CheckPrimaryFile(N'C:\Users\My\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\v11.0\mydb.mdf',3)
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39605822
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sfyj,

Check primary file помогло определить fileid. По при попытке сделать онлайн пишет: one or more files not match the primary file of the database. Как я понимаю указывает что есть еще битые файлы, но не пишет какие((( буду пробовать делать все их оффлайн, а потом по одному добавлять. Но файлов больше 100 (
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39605967
sfyj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lex452,

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

Можете выполнить ?
Код: sql
1.
2.
ALTER DATABASE [dbName] SET EMERGENCY;
GO
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39605968
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sfyj,

Прицепилась как recovery pendind, в emergency не дает уйти
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39605973
sfyj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lex452,

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

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

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


И затем перевести базу в ONLINE
Код: sql
1.
ALTER DATABASE [dbName] SET ONLINE;
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39605977
sfyj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lex452,

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

То, что команда
Код: sql
1.
ALTER DATABASE [dbName] SET EMERGENCY;

выдаёт ошибку "Unable to open the physical file" ещё ни о чём не говорит.
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39605991
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452sfyj,

Прицепилась как recovery pendind, в emergency не дает уйти
пойдите в еррорлог и прочтите, почему это recovery pending.
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39605994
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sfyjможно попробовать отцепить базу, убрать куда-нибудь ldf, и попробовать прицепить с FOR ATTACH_REBUILD_LOG.

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

кстати, FOR ATTACH_REBUILD_LOG не нужен, если файл лога один,
это надо для нескольких файлов лога.
при наличии всего одного лога + database was cleanly shutdown
FOR ATTACH без лога уже лог пересоздаст
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39606005
sfyj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yasha123,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
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
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39606033
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sfyj,
у него в recovery pending не когда не хватает одного файла данных,
а когда он файлы подменил и тот, от которого нет оригинала,
в офлайн отправил.
так что репро не катит, ибо в вашем репро он лезет в недостающий файл,
а в случае ТС тот файл в офлайне и recovery pending не из-за него
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39606035
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39606080
sfyj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lex452,

EMERGENCY не нужен

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
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
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39606166
lex452
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sfyj,

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


База уходит в RECOVERY PENDING, и не на какие манипуляции больше не отвечает
...
Рейтинг: 0 / 0
Восстановление БД с потерянной файловой группой
    #39606206
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lex452sfyj,

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


База уходит в RECOVERY PENDING, и не на какие манипуляции больше не отвечает
почему не посмотреть в еррорлоге, какого файла ему не хватает?
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Восстановление БД с потерянной файловой группой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]