Нужна помощь для восстановления нескольких баз данных / файлов bak из одной папки. Восстановление базы данных ms sql из bak


sql server - Как восстановить БД MS SQL из битого ldf и full backup?

Если восстановление журнала с CONTINUE_AFTER_ERROR (либо со STOP_ON_ERROR)

RESTORE LOG [ka] FROM DISK = N'D:\Tail.bak' WITH FILE = 1, CONTINUE_AFTER_ERROR, NORECOVERY GO

завершается с ошибкой, после которой невозможно выполнить

RESTORE DATABASE [ka] WITH RECOVERY GO

то можно попытаться восстановиться до какого-то LSN в журнале (максимально возможного), при котором RESTORE LOG ещё не вызывает ошибок.

Для этого читаем заголовки бэкапов БД и журнала

RESTORE HEADERONLY FROM DISK = N'C:\2016.Bak' RESTORE HEADERONLY FROM DISK = N'D:\Tail.bak'

в которых сверяем значения столбцов FirstLSN и LastLSN (убеждаемся, что цепочка LSN не разорвана, и в журнале действительно есть дополнительная информация).

Допустим, получили:

C:\2016.Bak FirstLSN LastLSN ----------------- ----------------- 64000000005600195 64000000017600001 D:\Tail.bak FirstLSN LastLSN ----------------- ----------------- 64000000005600195 66000000025600001

сравниваем LSN: 64000000005600195 <= 64000000017600001 < 66000000025600001 - OK.

Значение LastLSN из заголовка БД (равное 64000000017600001) переводим из десятичного представления в двоичное (см. здесь, функция fn_convertnumericlsntobinary), получаем 00000040:000000B0:0001.

Теперь с помощью sys.fn_dump_dblog читаем последовательность LSN из дампа лога (можно отфильтровать только операции завершения транзакций Operation = 'LOP_COMMIT_XACT'):

select [Current LSN] from sys.fn_dump_dblog( NULL, NULL, N'DISK', 1, N'D:\Tail.bak', default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default, default) where Operation = 'LOP_COMMIT_XACT';

Допустим, получили, следующий список:

Current LSN ----------------------- 00000040:000000a0:0002 00000040:000000b8:0001 <-- сначала восстанавливаем журнал к этой отметке 00000040:000000c8:000b <-- потом к этой 00000040:000000d0:000a <-- ... 00000040:000000d8:000a <-- ... 00000040:000000e0:000a <-- ... 00000040:000000e8:000a <-- ... 00000040:000000f0:000b <-- ... 00000040:000000f8:0010 <-- ... 00000040:000000f8:0021 <-- и т.д, пока не встретим ошибку 00000040:000000f8:0027 <-- ERROR 00000040:00000110:0017 00000040:00000130:001b 00000040:00000130:001d 00000040:00000140:000a

Заново инициализируем восстановление:

RESTORE DATABASE [ka] FROM DISK = N'D:\2016.bak' WITH NORECOVERY, REPLACE GO

Теперь берём из списка первое значение LSN, которое следует позднее, чем LastLSN в бэкапе БД (позднее чем 00000040:000000B0:0001) и делаем RESTORE LOG к этой отметке:

RESTORE LOG [ka] FROM DISK = N'D:\Tail.bak' WITH FILE = 1, STOPATMARK = 'lsn:0x00000040:000000b8:0001', NORECOVERY GO

Если операция прошла без ошибок, повторяем то же самое для следующей отметки, и т.д., пока не дойдём до отметки, восстановление к которой будет вызывать ошибку.

Если отметок много, то можно применить дихотомический поиск, учитывая, однако, что при движении вперёд достаточно выполнять лишь RESTORE LOG к новой отметке, но если необходимо вернуться назад, то цепочку восстановления нужно выполнять заново (RESTORE DATABASE ... WITH REPLACE ..., затем RESTORE LOG ... к нужной отметке).

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

RESTORE DATABASE [ka] FROM DISK = N'D:\2016.bak' WITH NORECOVERY, REPLACE GO RESTORE LOG [ka] FROM DISK = N'D:\Tail.bak' WITH STOPATMARK = 'lsn:0x00000040:000000f8:0021', NORECOVERY GO

После чего завершаем восстановление:

RESTORE DATABASE [ka] WITH RECOVERY GO

ru.stackoverflow.com

Не удается восстановить базу данных с помощью .bak-файла из-за другой версии SQL-сервера

Я установил SQL Server 2008 R2, и я пытаюсь восстановить базу данных, отправленную мной коллегой в файл .bak.

К сожалению, я не могу восстановить базу данных, так как база данных была сохранена на сервере с версии 10.50.1600, а версия моего SQL-сервера – 10.00.1600.

Я попытался обновить свой SQL-сервер пакетами SP1 и SP2, но ничего не изменил.

В противном случае я заметил, нажав на свойство сервера, что строка «продукт» отображает версию Microsoft SQL Server Express, даже если я установил SQL Server 2008 R2. Это, по крайней мере, то, что отображается, когда я запускаю его …

Может кто-нибудь мне помочь ?

заранее спасибо

Solutions Collecting From Web of "Не удается восстановить базу данных с помощью .bak-файла из-за другой версии SQL-сервера"

Вы НЕ МОЖЕТЕ сделать это: вы не можете присоединить / отсоединить или создать резервную копию / восстановить базу данных из более новой версии (SQL Server 2008 R2 – 10.50.1600) SQL Server до более старой версии (2008 – v10.00.1600) – внутренние файловые структуры слишком отличаются друг от друга, чтобы поддерживать обратную совместимость.

Вы можете обойти эту проблему

  • используя ту же версию SQL Server на всех ваших компьютерах, – тогда вы можете легко создавать резервные копии / восстанавливать базы данных между экземплярами

  • в противном случае вы можете создавать сценарии базы данных как для структуры (таблицы, представления, хранимых процедур и т. д.), так и для содержимого (фактические данные, содержащиеся в таблицах) либо в SQL Server Management Studio ( Tasks > Generate Scripts ), либо используя сторонний инструмент

  • или вы можете использовать сторонний инструмент, такой как SQL-сравнить Red-Gate и SQL Data Compare, чтобы «различать» между вашим источником и целью, генерировать сценарии обновления из этих различий и затем выполнять эти сценарии на целевой платформе; это работает в разных версиях SQL Server.

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

sqlserver.bilee.com

sql-server - Восстановление баз данных SQL Server 2008 R2 *.bak на SQL Server 2014 Express

Недавно я изменил свой SQL Server 2008 R2 (10.50.1600.1) на SQL Server 2014 Express (12.0.4100.1 - с пакетом обновления 1). Теперь я хотел бы восстановить *.bak файлы, которые я создал на SQL Server 2008 R2.

Прежде всего, я не вижу файлы *.bak в каталоге Backup (C:\Program Files\Microsoft SQL Server\MSSQL12.RALTECH\MSSQL\Backup). Я скопировал все мои резервные файлы там.

Когда я пытаюсь ввести местоположение файла резервной копии с таким нажатием (один из моих файлов резервных копий называется RMP), я вижу, что Management Studio распознает файл:

Размер файла (резервный) составляет 2201 КБ, а файл базы данных - 2245632 (столбец "Размер" в Management Studio - я не знаю, какой единицей является MB или KB...) Однако он не превышает допустимый размер в выпуске SQL Server Express, Так что не проблема.

Когда я нажимаю ok для восстановления, я получаю эту ошибку:

TITLE: Microsoft SQL Server Management Studio

Не удалось восстановить базу данных "RMP". (Microsoft.SqlServer.Management.RelationalEngineTasks)

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

System.Data.SqlClient.SqlError: операционная система вернула ошибку "5 (Access denied.)" При попытке "RestoreContainer :: ValidateTargetForCreation" в "C:\Program Files\Microsoft SQL Server\MSSQL10_50.RALTECHSQL\MSSQL\DATA\RMP.mdf. (Microsoft.SqlServer.SmoExtended)

Что я могу с этим сделать? Как восстановить базы данных на SQL Server 2014 Express из файлов SQL Server 2008 R2 *.bak? Что для меня странно, мои резервные файлы (*.bak) имеют значок замка. Может быть, это проблема?

благодаря

qaru.site

Восстановление базы данных MS SQL Server из копии на сетевом диске

Здравствуйте, дорогие читатели.

В одной из своих заметок я рассказывал как сделать копию базы данных MS SQL на сетевой диск. Сегодня я хочу рассказать как восстановить базу из копии, которая находится на сетевом диске. Скрипты, приведенные ниже, актуальны для MS SQL 2008R2 и MS SQL 2012, также необходимым условием является запуск Microsoft SQL Server с использованием доменной учетной записи.

Пример.

Резервное копирование ведется по схеме: полная копия делается 1 раз в неделю и каждый день делается разностная копия. Необходимо восстановить базу данных  в новую базу и в текущую.

1. Восстановление в новую базу, т.е. базы еще нет и она будет создана из копии.

USE master

go

exec sp_addumpdevice ‘disk’, ‘BaseBackup1’ ,‘\\IP-Адрес или имя компьютера\папка с копией\TestFULL_backup_201310130530.bak’ ;

go

exec sp_addumpdevice ‘disk’, ‘BaseBackup2’ ,‘\\IP-Адрес или имя компьютера\папка с копией\TestDay_backup_201310160030.bak’ ;

go

RESTORE DATABASE [TestForTest]

FILE = N’Test’ —указывается логическое имя файла БД, из которой были созданы копии

FROM   BaseBackup1

WITH   FILE = 1 ,  

MOVE N’Test’ TO N’K:\DATA\TestForTest.mdf’ , —Первый параметр — это логическое имя файла БД из которой была создана копия, второй параметр — путь, где будет находиться файл БД на диске новой базы

MOVE N’Test_log’ TO N’M:\LOG\TestForTest_log.ldf’, —Первый параметр — это логическое имя файла лога БД из которой была создана копия, второй параметр — путь, где будет находиться файл лога на диске новой базы

NORECOVERY ,  NOUNLOAD ,  REPLACE , STATS = 10

GO

RESTORE DATABASE [TestForTest]

FILE = N’Test’ —указывается логическое имя файла БД, из которой были созданы копии

FROM   BaseBackup2

WITH   FILE = 1 ,   RECOVERY , NOUNLOAD ,   STATS = 10

GO

exec sp_dropdevice ‘BaseBackup1’

GO

exec sp_dropdevice ‘BaseBackup2’

GO

2. Восстановление в существующую базу.

 

USE master

go

exec sp_addumpdevice ‘disk’, ‘BaseBackup1’ ,‘\\IP-Адрес или имя компьютера\папка с копией\TestFULL_backup_201310130530.bak’ ;

go

exec sp_addumpdevice ‘disk’, ‘BaseBackup2’ ,‘\\IP-Адрес или имя компьютера\папка с копией\TestDay_backup_201310160030.bak’ ;

go

RESTORE DATABASE [TestForTest]

FILE = N’Test’ —указывается логическое имя файла БД, из которой были созданы копии

FROM   BaseBackup1

WITH   FILE = 1 ,  

NORECOVERY ,  NOUNLOAD ,  REPLACE , STATS = 10

GO

RESTORE DATABASE [TestForTest]

FILE = N’Test’ —указывается логическое имя файла БД, из которой были созданы копии

FROM   BaseBackup2

WITH   FILE = 1 ,   RECOVERY , NOUNLOAD ,   STATS = 10

GO

exec sp_dropdevice ‘BaseBackup1’

GO

exec sp_dropdevice ‘BaseBackup2’

GO

Сами скрипты можно скачать здесь.

Как посмотреть логические имена файлов БД и лога. Необходим в Management Studio открыть свойства БД из которой была сделана копия и перейти на вкладу File.

Популярность: 10%

help1c.by

Нужна помощь для восстановления нескольких баз данных / файлов bak из одной папки

В SQL Server 2008R2 я пытаюсь восстановить несколько баз данных / файлов BAK, расположенных только в одной папке, используя приведенный здесь SQL-запрос – http://www.karaszi.com/sqlserver/code/sp_RestoreFromAllFilesInDirectory_2008sp1.txt

Он использует хранимую процедуру, подобную этой, код для которой дается в конце –

exec sp_RestoreFromAllFilesInDirectory 'C:\Mybakfiles\', 'D:\Mydatabasesdirectory\' , 'C:\MylogDirectory\'

Папки invlosed – 'C: \ Mybakfiles \', 'D: \ Mydatabasesdirectory \', 'C: \ MylogDirectory \'

Вы должны знать путь к первой папке. Второй и третий можно найти с помощью запроса или SSMS. Для запроса см. Ответ alex aza в разделе «Что является наиболее эффективным способом восстановления нескольких баз данных в SQL 2008» . Я также дал его запрос в конце.

Я скопировал все мои файлы BAK в: C: \ Program Files \ Microsoft SQL Server \ MSSQL10_50.SS2008 \ MSSQL \ Backup \

Затем я ввел выполненный SP следующим образом:

exec sp_RestoreFromAllFilesInDirectory 'C:\Program Files\ Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\Backup\', 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL \DATA\' , 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\ MSSQL\DATA\'

и получил следующий результат выборки –

RESTORE DATABASE AdventureWorksDW FROM DISK = 'C:\Program Files\ Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\Backup\AdventureWorksDW.bak' WITH MOVE 'AdventureWorksDW_Data' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SS2008\MSSQL\DATA\AdventureWorksDW_Data.mdf', MOVE 'AdventureWorksDW_Log' TO 'C:\Program Files\Microsoft SQL Server\ MSSQL10_50.SS2008\MSSQL\DATA\AdventureWorksDW_Log.ldf'

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

PS – Стыдно, что MS не позволяет вам делать это легко.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ –

Здесь sp для восстановления нескольких баз данных –

CREATE PROC [dbo].[sp_RestoreFromAllFilesInDirectory] @SourceDirBackupFiles nvarchar(200), @DestDirDbFiles nvarchar(200),@DestDirLogFiles nvarchar(200) AS --Originally written by Tibor Karaszi 2004. Use at own risk. --Restores from all files in a certain directory. Assumes that: -- There's only one backup on each backup device. -- Each database uses only two database files and the mdf file is returned first from the RESTORE FILELISTONLY command. --Sample execution: -- EXEC sp_RestoreFromAllFilesInDirectory 'C:\Mybakfiles\', 'D:\Mydatabasesdirectory\' ,'C:\MylogDirectory\' SET NOCOUNT ON --Table to hold each backup file name in CREATE TABLE #files(fname varchar(200),depth int, file_ int) INSERT #files EXECUTE master.dbo.xp_dirtree @SourceDirBackupFiles, 1, 1 --Table to hold the result from RESTORE HEADERONLY. Needed to get the database name out from CREATE TABLE #bdev( BackupName nvarchar(128) ,BackupDescription nvarchar(255) ,BackupType smallint ,ExpirationDate datetime ,Compressed tinyint ,Position smallint ,DeviceType tinyint ,UserName nvarchar(128) ,ServerName nvarchar(128) ,DatabaseName nvarchar(128) ,DatabaseVersion int ,DatabaseCreationDate datetime ,BackupSize numeric(20,0) ,FirstLSN numeric(25,0) ,LastLSN numeric(25,0) ,CheckpointLSN numeric(25,0) ,DatabaseBackupLSN numeric(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 int ,IsSnapshot int ,IsReadOnly int ,IsSingleUser int ,HasBackupChecksums int ,IsDamaged int ,BegibsLogChain int ,HasIncompleteMetaData int ,IsForceOffline int ,IsCopyOnly int ,FirstRecoveryForkID uniqueidentifier ,ForkPointLSN numeric(25,0) ,RecoveryModel nvarchar(128) ,DifferentialBaseLSN numeric(25,0) ,DifferentialBaseGUID uniqueidentifier ,BackupTypeDescription nvarchar(128) ,BackupSetGUID uniqueidentifier ,CompressedBackupSize nvarchar(128) ) --Table to hold result from RESTORE FILELISTONLY. Need to generate the MOVE options to the RESTORE command CREATE TABLE #dbfiles( LogicalName nvarchar(128) ,PhysicalName nvarchar(260) ,Type char(1) ,FileGroupName nvarchar(128) ,Size numeric(20,0) ,MaxSize numeric(20,0) ,FileId int ,CreateLSN numeric(25,0) ,DropLSN numeric(25,0) ,UniqueId uniqueidentifier ,ReadOnlyLSN numeric(25,0) ,ReadWriteLSN numeric(25,0) ,BackupSizeInBytes int ,SourceBlockSize int ,FilegroupId int ,LogGroupGUID uniqueidentifier ,DifferentialBaseLSN numeric(25) ,DifferentialBaseGUID uniqueidentifier ,IsReadOnly int ,IsPresent int ,TDEThumbprint nvarchar(128) ) DECLARE @fname varchar(200) DECLARE @dirfile varchar(300) DECLARE @LogicalName nvarchar(128) DECLARE @PhysicalName nvarchar(260) DECLARE @type char(1) DECLARE @DbName sysname DECLARE @sql nvarchar(1000) DECLARE files CURSOR FOR SELECT fname FROM #files DECLARE dbfiles CURSOR FOR SELECT LogicalName, PhysicalName, Type FROM #dbfiles OPEN files FETCH NEXT FROM files INTO @fname WHILE @@FETCH_STATUS = 0 BEGIN SET @dirfile = @SourceDirBackupFiles + @fname --Get database name from RESTORE HEADERONLY, assumes there's only one backup on each backup file. TRUNCATE TABLE #bdev INSERT #bdev EXEC('RESTORE HEADERONLY FROM DISK = ''' + @dirfile + '''') SET @DbName = (SELECT DatabaseName FROM #bdev) --Construct the beginning for the RESTORE DATABASE command SET @sql = 'RESTORE DATABASE ' + @DbName + ' FROM DISK = ''' + @dirfile + ''' WITH MOVE ' --Get information about database files from backup device into temp table TRUNCATE TABLE #dbfiles INSERT #dbfiles EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @dirfile + '''') OPEN dbfiles FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type --For each database file that the database uses WHILE @@FETCH_STATUS = 0 BEGIN IF @type = 'D' SET @sql = @sql + '''' + @LogicalName + ''' TO ''' + @DestDirDbFiles + @LogicalName + '.mdf'', MOVE ' ELSE IF @type = 'L' SET @sql = @sql + '''' + @LogicalName + ''' TO ''' + @DestDirLogFiles + @LogicalName + '.ldf''' FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type END --Here's the actual RESTORE command PRINT @sql --Remove the comment below if you want the procedure to actually execute the restore command. --EXEC(@sql) CLOSE dbfiles FETCH NEXT FROM files INTO @fname END CLOSE files DEALLOCATE dbfiles DEALLOCATE files

Запрос, чтобы получить папки для файлов DATA и LOG –

declare @DefaultData nvarchar(512) exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', @DefaultData output declare @DefaultLog nvarchar(512) exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', @DefaultLog output declare @MasterData nvarchar(512) exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\ Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg0', @MasterData output select @MasterData=substring(@MasterData, 3, 255) select @MasterData=substring(@MasterData, 1, len(@MasterData) - charindex('\', reverse(@MasterData))) declare @MasterLog nvarchar(512) exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\ Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg2', @MasterLog output select @MasterLog=substring(@MasterLog, 3, 255) select @MasterLog=substring(@MasterLog, 1, len(@MasterLog) - charindex('\', reverse(@MasterLog))) select isnull(@DefaultData, @MasterData) DefaultData, isnull(@DefaultLog, @MasterLog) DefaultLog

Используйте SSMS для поиска папок DATA и LOG –

SSMS> Сервер> Щелкните правой кнопкой мыши> Свойства> узел базы данных.

Solutions Collecting From Web of "Нужна помощь для восстановления нескольких баз данных / файлов bak из одной папки"

Сначала спасибо за предоставление скрипта sp_RestoreFromAllFilesInDirectory поскольку домашняя страница создателя больше не доступна.

Сценарий, который вы предоставили, только распечатывает сгенерированный sql, поэтому все, что вам нужно, чтобы раскомментировать строку:

EXEC(@sql)

Я знаю, что вопрос слишком старый, но что я спасаю кого-то еще

Чтобы заставить скрипт работать на MS SQL Server 2012, добавьте еще один столбец в таблицу #bdev:

Containment int

Кроме того, мне пришлось изменить несколько столбцов в таблице #dbfiles, чтобы быть bigint.

first thanx для скрипта 🙂 любезно проверьте столбцы RESTOREHEADERONLY и FILELISTONLY . Вам нужно добавить несколько столбцов. По крайней мере моя работала при добавлении новых столбцов.

sqlserver.bilee.com