Подтвердить что ты не робот

Как восстановить резервную копию базы данных SQL Server без знания пути назначения или имени файла?

Мне нужно программно (T-SQL) восстановить резервную копию базы данных в SQL Server 2008. Эта резервная копия поступает с другого сервера, и исходное имя базы данных может быть и другим. (Фактически, я копирую базу данных с некоторого сервера в новую базу данных на другом сервере.)

По-видимому, я должен использовать RESTORE DATABASE ... WITH MOVE, который работает, но мне нужно знать, где должны быть восстановлены файлы и как их следует назвать. Несмотря на поиск, я не нашел то, что казалось бы самой основной задачей: просто используйте путь по умолчанию и имена файлов, т.е. Делайте то, что делает SQL Server при выпуске CREATE DATABASE - вам не нужно указывать путь для этой команды, так почему это необходимо для RESTORE?

Неужели я забыл какое-то тривиальное решение, или мне действительно нужно будет перечислить файлы, как-нибудь найти каталог базы данных из конфигурации SQL Server и использовать эту информацию для создания команды RESTORE? Спасибо.

(Сравнивая с PostgreSQL, где при использовании pg_restore вы указываете уже созданную базу данных назначения, а когда вы ее создавали, у вас была опция - не обязательно - указать нестандартное табличное пространство, но если вы не сделали этого, t, вам все равно, где файлы физически сохранены.)

4b9b3361

Ответ 1

Для будущих гуглеров; от SQL Server 2012 и далее вы можете использовать:

SELECT ServerProperty(N'InstanceDefaultDataPath') AS default_file
     , ServerProperty(N'InstanceDefaultLogPath') AS default_log
;

Это читает пути к папкам, которые отображаются в разделе "Свойства сервера" > "Параметры базы данных" > "Расположение базы данных по умолчанию"

Свойства сервера и параметры базы данных

Ответ 2

Команда CREATE DATABASE создаст базу данных с путями по умолчанию, поэтому вы можете создать базу данных, а затем восстановить ее, используя синтаксис replace (режим sqlcmd):

:setvar DatabaseName MyDatabase
declare @fileName varchar(255)
set @fileName = 'c:\backup\mybackup.bak'

if db_id('$(DatabaseName)') is null
            CREATE DATABASE [$(DatabaseName)]

RESTORE DATABASE [$(DatabaseName)]
FROM DISK = @fileName
WITH REPLACE

Ответ 3

Вам нужно прочитать регистр, например

DECLARE @Result NVARCHAR(4000) 
EXECUTE [master].[dbo].xp_instance_regread 
N'HKEY_LOCAL_MACHINE', 
N'Software\Microsoft\MSSQLServer\MSSQLServer',N'BackupDirectory', 
@Result OUTPUT,  
'NO_OUTPUT' 
SELECT @Result

Ответ 4

Я написал функцию некоторое время назад, которая делает это для вас. Он поддерживает все версии SQL Server, включая установки с экземплярами экземпляра по умолчанию и именами. См. здесь код и пример

Чтобы выполнить восстановление, вы вызовете функцию, как показано ниже.

declare @sql nvarchar(2000), 
        @data varchar(260), 
        @log varchar(260); 

select @data = dbo.fn_get_default_path(0),
       @log = dbo.fn_get_default_path(1)

SELECT @sql= 'RESTORE DATABASE DefaultLocationDB 
FROM  DISK = N''c:\backups\DemoDB.bak'' WITH  FILE = 1,  
MOVE N''demo_data_device'' TO N''' + @data + '\DemoDb.ldf'',  
MOVE N''demo_log_device'' TO N''' +  @log + '\DemoDb.ldf'',  
NOUNLOAD, REPLACE'

exec (@sql)

Ответ 5

Я должен был сделать это сам, и в итоге я собрал несколько ответов, чтобы создать единственный script, который восстанавливает базу данных (любую базу данных) и перенастраивает файлы. Все, что вам нужно знать, это путь к файлу резервной копии и новое имя базы данных. К сожалению, не похоже, что есть какие-то краткие решения этой проблемы.

DECLARE @Source nvarchar(max) = 'C:\backup.bak'
DECLARE @RestoreDestination nvarchar(max) = 'NewDatabaseName'

--https://stackoverflow.com/a/27893494/5734516
--https://stackoverflow.com/a/4018782/5734516
DECLARE @fileListTable TABLE (
    [LogicalName]           NVARCHAR(128),
    [PhysicalName]          NVARCHAR(260),
    [Type]                  CHAR(1),
    [FileGroupName]         NVARCHAR(128),
    [Size]                  NUMERIC(20,0),
    [MaxSize]               NUMERIC(20,0),
    [FileID]                BIGINT,
    [CreateLSN]             NUMERIC(25,0),
    [DropLSN]               NUMERIC(25,0),
    [UniqueID]              UNIQUEIDENTIFIER,
    [ReadOnlyLSN]           NUMERIC(25,0),
    [ReadWriteLSN]          NUMERIC(25,0),
    [BackupSizeInBytes]     BIGINT,
    [SourceBlockSize]       INT,
    [FileGroupID]           INT,
    [LogGroupGUID]          UNIQUEIDENTIFIER,
    [DifferentialBaseLSN]   NUMERIC(25,0),
    [DifferentialBaseGUID]  UNIQUEIDENTIFIER,
    [IsReadOnly]            BIT,
    [IsPresent]             BIT,
    [TDEThumbprint]         VARBINARY(32) -- remove this column if using SQL 2005
)

DECLARE @QueryCommand nvarchar(max) =
 'RESTORE FILELISTONLY FROM DISK = N''' + REPLACE(@Source, '''', '''''') + ''' WITH NOUNLOAD'

INSERT INTO @fileListTable 
EXEC(@QueryCommand)


--https://stackoverflow.com/a/2014673/5734516
DECLARE @filepath NVARCHAR(260)
EXEC master.dbo.xp_instance_regread 
        N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', 
        N'DefaultData', 
        @filepath output, 'no_output'


DECLARE @Command nvarchar(max) 
SET @Command = 'RESTORE DATABASE ' + QUOTENAME(@RestoreDestination)  + ' '
                + ' FROM DISK=N''' + REPLACE(@Source, '''', '''''') + ''' '
                + 'WITH FILE=1 '
SELECT 
    @Command = @Command + ',MOVE N''' + REPLACE(LogicalName, '''', '''''') + '''' 
    + ' TO N'''  
        + REPLACE(@filepath + '\' + @RestoreDestination + case when FileID = 1 then '.mdf' when Type = 'L' then '_' + CAST(FileID as varchar(max)) + '.ldf' else '_' + CAST(FileID as varchar(max)) + '.ndf' end, '''', '''''')
    + '''' 
FROM @fileListTable 

SELECT @Command
EXEC(@Command)

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

Ответ 6

Если вы имеете в виду использование параметра "Новая база данных" в Studio Management Studio, то он по умолчанию выполняет некоторые значения. Но T-SQL для CREATE DATABASE по-прежнему требует путей. Вы можете увидеть это, перейдя в студию управления, выберите "Новая база данных", введите новое имя и нажмите кнопку Script. Эта кнопка предоставит вам T-SQL, который будет запускаться SQL Server. Этот процесс фактически не запускается, поэтому вы можете отказаться от мастера создания новой базы данных.

При восстановлении есть аналогичная кнопка. Поэтому, если у вас уже есть вся информация и вам нужен только T-SQL, перейдите в студию управления, чтобы выполнить восстановление, но вместо нажатия OK, чтобы запустить процесс, нажмите кнопку Script, которая будет генерировать T-SQL с помощью значения по умолчанию.

Надеюсь, что это поможет.

Ответ 7

Как уже упоминалось, CREATE DATABASE создает файлы по умолчанию. Затем вы можете найти пути этих файлов и использовать их в RESTORE part

-- Database will be created in default location
CREATE DATABASE [MyRestoredDatabase] 

DECLARE @mdfFile VARCHAR(MAX)
DECLARE @ldfFile VARCHAR(MAX)

SELECT @mdfFile = physical_name
FROM sys.master_files
WHERE database_id = DB_ID('MyRestoredDatabase')
AND file_id = 1

SELECT @ldfFile = physical_name
FROM sys.master_files
WHERE database_id = DB_ID('MyRestoredDatabase')
AND file_id = 2

-- Overwrite known files of the new database from restore 
RESTORE DATABASE [MyRestoredDatabase] 
FROM DISK='C:\Path\To\OriginalDatabase.bak'
WITH REPLACE,
    MOVE 'OriginalDatabase' TO @mdfFile,
    MOVE 'OriginalDatabase_Log' TO @ldfFile

Если вам нужно найти логические имена, используйте следующий SQL

RESTORE FILELISTONLY
FROM DISK='C:\Path\To\MyRestoredDatabase.bak'

Полностью автоматизированный script можно найти здесь