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

Откуда:
Сообщений: 1833
вообще что-то ваши показания расходятся с тем, что в бэкапах.
сервер-исходник 2005, хотя и в совместимости 80 (2000).
откуда бы ему взять, что исходный сервер 2000?
12 ноя 19, 18:56    [22014759]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
PavelPN
Блин, жестяк. Походу реально под каждую территорию физически создана одна база. Это нормальная вообще практика?
Бывает. Особенно раньше. Гениальные программисты, дрожа от предвкушения гигантских объёмов данных (у нас таблицы до МИЛЛИОНА строк, представляете!!!), часто разбивали базу на несколько вот таким образом.

Yasha123
может, вы каждой территории высылаете ее собственную базу раз в неделю,
тогда нормально.
Нет, это такая оптимизация, "что бы быстро работало".


Владислав Колосов,
Да там объёмы мизерные, базы по 300 мегабайт. Не терабайт, и даже не гигабайт.
12 ноя 19, 19:07    [22014766]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
Yasha123
вообще что-то ваши показания расходятся с тем, что в бэкапах.
сервер-исходник 2005, хотя и в совместимости 80 (2000).
откуда бы ему взять, что исходный сервер 2000?
А что не сходится? Да, базы работают(-ли) на 2005, в режиме совместимости с 2000м
12 ноя 19, 19:10    [22014768]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
alexeyvg
Yasha123
вообще что-то ваши показания расходятся с тем, что в бэкапах.
сервер-исходник 2005, хотя и в совместимости 80 (2000).
откуда бы ему взять, что исходный сервер 2000?
А что не сходится? Да, базы работают(-ли) на 2005, в режиме совместимости с 2000м


не сходится с вот этим:
автор
Создание резервной копии баз данных производилось на сервере, на котором работала версия 8.00.2055...

бэкапилось на 2005-ом, а не на 2000-ом.
и наплевал он на совместимость базы
12 ноя 19, 19:13    [22014771]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
Yasha123
alexeyvg
А что не сходится? Да, базы работают(-ли) на 2005, в режиме совместимости с 2000м
не сходится с вот этим:
автор
Создание резервной копии баз данных производилось на сервере, на котором работала версия 8.00.2055...
бэкапилось на 2005-ом, а не на 2000-ом.
и наплевал он на совместимость базы
Непонятно, что не сходится.

Да, работал много лет на 2005, базы были при этом в режиме совместимости с 2000-м.
При этом базы переходили с сервера на сервер (минимум 2 раза), и всё это были 2005-е серверы.
А когда то, в 2000-м году (или позже), их создали на 2000-м (и тоже неизвестно сколько раз переносили с одного 2000-го на другой).
12 ноя 19, 19:26    [22014780]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
alexeyvg
Да, работал много лет на 2005, базы были при этом в режиме совместимости с 2000-м.
При этом базы переходили с сервера на сервер (минимум 2 раза), и всё это были 2005-е серверы.
И, само собой, много раз делали бакапы на 2005-м. Конкретно этот бакап в сентябре.
12 ноя 19, 19:27    [22014782]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
не понимаю, при чем тут история вашей жизни,
но бэкапивший сервер был 2005,
а ошибка говорит, что 2000.

и наплевать, на каком сервере база родилась, важно, каков формат данного бэкапа. те. версия бэкапившего сервера. и это 2005, а не 2000
12 ноя 19, 19:35    [22014790]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
Yasha123
не понимаю, при чем тут история вашей жизни,
Это была история обсуждаемой базы, если вы не поняли.
Yasha123
но бэкапивший сервер был 2005,
а ошибка говорит, что 2000.
А, на ошибку в первом посте я не посмотрел, благо к теме она не относится.

Делов то, пробовал человек разные бакапы, пытался разобраться...
А может, действительно 2005м там и не пахло, был только 2000-й
Это же не имеет отношения к проблеме автора.
12 ноя 19, 22:06    [22014850]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
еще как относится.
ТС, у вас базы минимум с двух разных серверов.
сделайте restore headeronly и бэкапу "главной базы" тоже.
проверьте колонку server name,
там будет другой сервер.
не знаю, что это означает в вашем случае,
но, например, может оказаться, что из одной базы в другую обращаются через linked server
13 ноя 19, 07:42    [22014952]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
Yasha123
Member

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

А может, действительно 2005м там и не пахло, был только 2000-й.

как же не пахло, если restore headeronly показывает версию базы 611.
вам говорю, там минимум 2 сервера, но вы меня упорно не слышите

Сообщение было отредактировано: 13 ноя 19, 07:46
13 ноя 19, 07:45    [22014955]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
Yasha123
еще как относится.
может оказаться, что из одной базы в другую обращаются через linked server
Да, тут вы правы, для восстановления баз может оказаться недостаточно просто их все восстановить.
13 ноя 19, 08:37    [22014973]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
Yasha123
вам говорю, там минимум 2 сервера, но вы меня упорно не слышите
Да, про 2 сервера теперь понял :-)
Скорее, так и есть (хотя всё таки ТС мог для главной базы достать какой то старый бакап, а то делать систему на многих серверах как то совсем усложнение, для таких небольших объёмов)
13 ноя 19, 08:43    [22014975]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
PsyMisha
Member

Откуда: другая столица
Сообщений: 765
PavelPN
Критик, так было заявлено админом, когда он покидал нас

Уверен, - сейчас этот админ сидит в темноте и хохочет гомерическим смехом, запрокинув голову :)

Ну прикольнулся человек перед уходом, ну потроллил, ну что уж тут такого :)
13 ноя 19, 08:54    [22014981]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
PavelPN
Member

Откуда:
Сообщений: 15
Добрый день. Спасибо большое за помощь, хотя бы представление получили общее о том, как утроено всё.
Получилось посмотреть как это на рабочем сервере лежит.
Вы оказались полностью правы, под каждую территорию отдельно создана БД и похоже эта DBName на 11 гб выступает как агрегатор сведений и содержит всевозможные представления из всех этих 100 баз.
Каким образом они связаны я не знаю. Тут уж просто будем искать специалиста, чтобы всё это поднимал оперативно.
А пока я хочу у себя развернуть территориальные базы, хотя бы для локального доступа к ним. Можете подсказать скрипт как их в автоматическом режиме восстановить? При условии, что некоторые номера почему-то пропущены. Т.е. есть m07.bak, а после него m09.bak
А то все руками поднимать это трата времени, а его не хватает сейчас крайне.
14 ноя 19, 10:45    [22015937]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
PavelPN
похоже эта DBName на 11 гб выступает как агрегатор сведений и содержит всевозможные представления из всех этих 100 баз.

были бы там одни представления, была бы база размером в мегабайт.
у вас же как раз наоборот, все гигабайты там,
а остальные базы - крошки какие-то.
так что в этой базе своего добра хватает.
14 ноя 19, 11:01    [22015963]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
PavelPN, писал я такой скрипт, найти не могу, не сохранил, видимо.

1) включаете xp_cmdshell через sp_configure
2) Читаете список файлов во временную таблицу:
declare @files table (ID int IDENTITY, FileName varchar(100))

insert into @files execute xp_cmdshell 'dir c:\ /b'

select * from @files


Далее в курсоре по каждому файлу:
3) Через динамический SQL формируете команду на restore headeronly, чтобы получить название базы.
4) Аналогично - restore filelistonly, для получения списка файлов для базы.
5) Динамическим SQL генерируете команду на восстановление базы, выполняете.

В принципе, все, что нужно.
14 ноя 19, 11:05    [22015966]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
PavelPN
Member

Откуда:
Сообщений: 15
Yasha123, согласен с вами. Учитывая увиденные таблицы и их содержимое, я вообще не понимаю что там хранится.

Minamoto, прошу прощения, но мои знания в t-sql ограничиваются пользовательскими селектами.
И используемые вами понятия "курсора" и "динамического sql" мне, к сожалению, даже не говорят ни о чем.

Если вам не будет напряжно и есть время, могу я попросить вас помочь со скриптом. Понять написанный код я более менее смогу, но написать самому, я думаю у меня займет пару дней.
14 ноя 19, 11:33    [22016009]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5230
Minamoto
PavelPN, писал я такой скрипт, найти не могу, не сохранил, видимо.

1) включаете xp_cmdshell через sp_configure
2) Читаете список файлов во временную таблицу:
declare @files table (ID int IDENTITY, FileName varchar(100))

insert into @files execute xp_cmdshell 'dir c:\ /b'

select * from @files



включать xp_cmdshell не обязательно
то же самое можно получить процедурой xp_dirtree
например,
exec xp_dirtree 'c:\temp',1,1
14 ноя 19, 11:46    [22016031]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
komrad

включать xp_cmdshell не обязательно
то же самое можно получить процедурой xp_dirtree
например,
exec xp_dirtree 'c:\temp',1,1

Да, но я помню, что перешел именно на xp_cmdshell для большего удобства - в утилите dir там можно более гибко управлять набором возвращаемых файлов, использовать маски, фильтровать и т.п.
14 ноя 19, 11:51    [22016036]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
PavelPN
мои знания в t-sql ограничиваются пользовательскими селектами.
И используемые вами понятия "курсора" и "динамического sql" мне, к сожалению, даже не говорят ни о чем.

Если вам не будет напряжно и есть время, могу я попросить вас помочь со скриптом. Понять написанный код я более менее смогу, но написать самому, я думаю у меня займет пару дней.

вот именно.
вам проще скидать результаты restore filelistonly в одну таблицу
и копипастом сделать скрипт для всех баз.
на все про все макс. 10 минут на все 100 баз.

у вас же все пути, куда будете складывать файлы баз, одни и те же.
остается размножить 1 скрипт 100 раз и позаменять имя базы и имена файлов
14 ноя 19, 12:11    [22016062]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
PavelPN
Member

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

USE [master];
go

RESTORE DATABASE [flnst01] FROM  DISK = N'E:\BackUp\m01.bak' WITH  FILE = 1,  MOVE N'flnst_Data' TO N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\flnst01.mdf',  MOVE N'munst_Log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\flnst01_1.ldf',  NOUNLOAD,  STATS = 5
GO

RESTORE DATABASE [flnst02] FROM  DISK = N'E:\BackUp\m02.bak' WITH  FILE = 1,  MOVE N'flnst_Data' TO N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\flnst02.mdf',  MOVE N'munst_Log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\flnst02_1.ldf',  NOUNLOAD,  STATS = 5
GO


Таким образом вы имеете в виду?
14 ноя 19, 12:20    [22016070]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
PavelPN,
у вас снова что-то не то с версиями.
если вы на 2017-ый сервер восстанавливаете,
почему в путях MSSQL12.MSSQLSERVER?

да и не кладите файлы на системный диск,
на другой сложите.

так-то да, должно быть типа такого:

restore database [flnst01] 
from disk = N'E:\BackUp\m01.bak' with
move N'flnst_Data' to N'F:\DATA\flnst01.mdf',  
move N'munst_Log'  to N'F:\DATA\flnst01_log.ldf'
14 ноя 19, 12:29    [22016086]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5230
PavelPN,

а какая версия сервера куда базы надо восстановить?
покажите
select @@version

К сообщению приложен файл (get_restorescript_2005.txt - 8Kb) cкачать

Сообщение было отредактировано: 14 ноя 19, 12:31
14 ноя 19, 12:29    [22016087]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
PavelPN, типа того...

Только я таки не поленился, написал скрипт.

Используйте на свой страх и риск :)

ЗЫ: Не забудьте правильные директории указать, для отладки замените последний "EXEC sp_executesql @sql" на "PRINT @sql"
Если не будет выполняться с ошибкой, что возвращаемый набор данных не соответствует описанному в таблицах @header и @filelist - приведите их описание к тому набору полей, которое возвращается вашими командами.

+
SET NOCOUNT on
DECLARE 
    @cmd varchar(8000), 
    @sql nvarchar(MAX), 
    @folder_bak varchar(max) = 'D:\Backups', 
    @folder_files varchar(max)= 'D:\SQLData', 
    @bak_name nvarchar(max);

declare @files table (ID int IDENTITY, FileName nvarchar(max) NULL)

declare @header table (
	BackupName nvarchar(128),
	BackupDescription nvarchar(255),
	BackupType tinyint,
	ExpirationDate datetime,
	Compressed tinyint,
	Position smallint,
	DeviceType tinyint,
	UserName nvarchar(128),
	ServerName nvarchar(128),
	DatabaseName nvarchar(128),
	DatabaseVersion int,
	DatabaseCreationDate datetime,
	BackupSize bigint,
	FirstLSN decimal(25,0),
	LastLSN decimal(25,0),
	CheckpointLSN decimal(25,0),
	DatabaseBackupLSN decimal(25,0),
	BackupStartDate datetime,
	BackupFinishDate datetime,
	SortOrder smallint,
	CodePage smallint,
	UnicodeLocaleId int,
	UnicodeComparisonStyle int,
	CompatibilityLevel tinyint,
	SoftwareVendorId int,
	SoftwareVersionMajor int,
	SoftwareVersionMinor int,
	SoftwareVersionBuild int,
	MachineName nvarchar(128),
	Flags int,
	BindingID uniqueidentifier,
	RecoveryForkID uniqueidentifier,
	Collation nvarchar(128),
	FamilyGUID uniqueidentifier,
	HasBulkLoggedData bit,
	IsSnapshot bit,
	IsReadOnly bit,
	IsSingleUser bit,
	HasBackupChecksums bit,
	IsDamaged bit,
	BeginsLogChain bit,
	HasIncompleteMetaData bit,
	IsForceOffline bit,
	IsCopyOnly bit,
	FirstRecoveryForkID uniqueidentifier,
	ForkPointLSN decimal(25,0),
	RecoveryModel nvarchar(60),
	DifferentialBaseLSN decimal(25,0),
	DifferentialBaseGUID uniqueidentifier,
	BackupTypeDescription nvarchar(128),
	BackupSetGUID uniqueidentifier,
	CompressedBackupSize bigint,
	Containment tinyint)

DECLARE @filelist table (
	LogicalName nvarchar(128),
	PhysicalName nvarchar(260),
	Type nchar(1),
	FileGroupName nvarchar(128),
	Size bigint,
	MaxSize bigint,
	FileId bigint,
	CreateLSN decimal(25,0),
	DropLSN decimal(25,0),
	UniqueId uniqueidentifier,
	ReadOnlyLSN decimal(25,0),
	ReadWriteLSN decimal(25,0),
	BackupSizeInBytes bigint,
	SourceBlockSize int,
	FileGroupId int,
	LogGroupGUID uniqueidentifier,
	DifferentialBaseLSN decimal(25,0),
	DifferentialBaseGUID uniqueidentifier,
	IsReadOnly bit,
	IsPresent bit,
	TDEThumbprint varbinary(20))

SET @cmd = 'dir ' + @folder_bak + ' /b | findstr /i "\.bak$"'

insert into @files execute xp_cmdshell @command_string = @cmd

DECLARE cur CURSOR FOR
SELECT FileName
FROM @files
WHERE FileName IS NOT NULL

OPEN cur
FETCH FROM cur INTO @bak_name
        
WHILE @@FETCH_STATUS = 0
BEGIN

    DELETE FROM @header;
    DELETE FROM @filelist;

    BEGIN TRY
        SET @sql = 'RESTORE HEADERONLY FROM DISK=''' + @folder_bak + '\' + @bak_name + ''';'
        INSERT INTO @header EXEC sp_executesql @sql
        SET @sql = 'RESTORE FILELISTONLY FROM DISK=''' + @folder_bak + '\' + @bak_name + ''';'
        INSERT INTO @filelist EXEC sp_executesql @sql
    END TRY
    BEGIN CATCH

        
        PRINT 'Backup ' + @bak_name + ' cannot be restored'

    END CATCH

    IF EXISTS (SELECT * FROM @header) AND EXISTS (SELECT * FROM @filelist)
    BEGIN
    
        SELECT @sql = 'RESTORE DATABASE ' + QUOTENAME(DatabaseName) + ' FROM  DISK = N''' +  @folder_bak + '\' + @bak_name + 
                ''' WITH FILE = 1, NOUNLOAD,  STATS = 5' + 
                (SELECT ', MOVE N''' + QUOTENAME(LogicalName) + 
                        ''' TO N''' + @folder_files + '\' + 
                        SUBSTRING(PhysicalName, LEN(PhysicalName) - CHARINDEX('\', REVERSE(PhysicalName)) + 2, LEN(PhysicalName)) + 
                        '' AS 'data()'
                FROM @filelist
                FOR XML PATH ('')
                )
        FROM @header

        EXEC sp_executesql @sql

    END


    FETCH FROM cur INTO @bak_name
END

CLOSE cur
DEALLOCATE cur


Сообщение было отредактировано: 14 ноя 19, 12:34
14 ноя 19, 12:30    [22016089]     Ответить | Цитировать Сообщить модератору
 Re: Восстановление БД из нескольких .bak  [new]
PavelPN
Member

Откуда:
Сообщений: 15
Yasha123
PavelPN,
у вас снова что-то не то с версиями.
если вы на 2017-ый сервер восстанавливаете,
почему в путях MSSQL12.MSSQLSERVER?


Блин, это я дурак. Версию SSMS вместо версии sql server вам назвал.
Версия sql server: Microsoft SQL Server 2014 - 12.0.4100.1 (X64) Apr 20 2015 17:29:27 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
14 ноя 19, 12:43    [22016105]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить