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

Мне нужно иметь возможность создавать резервные копии и восстанавливать мою базу данных, используя 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\ нормально.

Ответы [ 2 ]

10 голосов
/ 24 июля 2011

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

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

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

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

3 голосов
/ 16 октября 2012

Просто для дополнения базы знаний по восстановлению базы данных SQL Server с помощью TSQL - ниже представлен скрипт, обрабатывающий проблему процессов, которые могут помешать восстановлению, восстановить базу данных из файла удаленной резервной копии и, наконец, предоставить доступ для некоторого пользователя.Ссылку на некоторые используемые параметры можно найти на 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

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

CREATE PROCEDURE RestoreFromSomewhere
AS
BEGIN
    -- The script above
END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...