Резервное копирование/восстановление базы данных с использованием T-SQL (MSSQL2005, 2008)

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

-- backup
backup database testdb1 to disk='c:\testdb1.bak'

-- restore
alter database testdb1 set single_user with rollback immediate
drop database testdb1
restore database testdb1 from disk='c:\testdb1.bak'

Это отлично работает, но требует наличия существующего файла в c:\testdb1.bak. Это не проблема, если у меня установлен SQL-сервер локально, но что мне делать, если я подключаюсь к серверу удаленно? Любые решения для избавления от этого требования?

Для меня не имеет значения, каково имя и путь к этому файлу, мне просто нужно быть уверенным, что я смогу восстановить БД, если мои скрипты с неправильной версией ошибося.

Спасибо.


Обновление Проблема заключалась в том, что создание файлов в корне c:\ запрещено некоторыми версиями Windows. Использование C:\1\ в порядке.

Ответ 1

Вам необходимо создать новый мультимедийный набор одновременно.

Адаптировано из этой страницы MSDN:

BACKUP DATABASE testdb1
TO DISK = 'c:\testdb1.bak'
  WITH FORMAT,
    MEDIANAME = 'MyBackups',
    NAME = 'Full backup of my database'
GO

И убедитесь, что у вас есть разрешения на создание файла в корневом каталоге c:\folder

Ответ 2

Просто чтобы дополнить базу знаний для восстановления базы данных SQL Server с помощью TSQL, ниже приведена script обработка проблем, которые могут предотвратить восстановление, восстановить базу данных из удаленного файла резервной копии и, наконец, предоставить доступ для некоторых пользователей, Ссылка на некоторые используемые опции можно найти на MSDN.

/************** Restore SQL Server database with TSQL **************/

DECLARE @SQL AS VARCHAR(20), @spid AS INT     
SELECT @spid = MIN(spid) FROM master..sysprocesses WHERE dbid = db_id('YourDbName') AND spid != @@spid    

-- Kill processes that currently use the database and could block the restoration     
while (@spid IS NOT NULL)
BEGIN
    print 'Killing process ' + CAST(@spid AS VARCHAR) + ' ...'
    SET @SQL = 'kill ' + CAST(@spid AS VARCHAR)
    EXEC (@SQL)

    SELECT @spid = MIN(spid) FROM master..sysprocesses WHERE dbid = db_id('YourDbName') AND spid != @@spid
END 
GO

-- Restore the database and bring it back online, so it can be accessed
RESTORE DATABASE YourDbName FROM DISK = '\\path\to\backup.bak' WITH REPLACE, RECOVERY;
GO   

-- Restore the user
USE YourDbName;
DROP USER YourUserName;
GO

ALTER authorization ON DATABASE::YourDbName TO YourUserName;
GO

В качестве альтернативы, если такой script используется довольно часто, может быть создана хранимая процедура:

CREATE PROCEDURE RestoreFromSomewhere
AS
BEGIN
    -- The script above
END
GO