使用T-SQL备份/恢复数据库(MSSQL2005,2008)

时间:2011-07-24 15:27:29

标签: tsql

我需要能够使用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服务器,这不是问题,但如果我远程连接到服务器该怎么办?任何摆脱这一要求的解决方案?

对我来说,这个文件的名称和路径是什么并不重要,我只需要确保如果我的alter脚本出错就能恢复数据库。

感谢。


更新 问题是某些版本的Windows禁止在c:\的根目录下创建文件。使用C:\1\很好。

2 个答案:

答案 0 :(得分:9)

您需要同时创建新的媒体集。

改编自此MSDN页面:

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

并确保您有权在根c:\文件夹

中创建文件

答案 1 :(得分:3)

为了补充使用TSQL恢复SQL Server数据库的知识库 - 下面有一个脚本处理可以阻止恢复的进程问题,从远程备份文件恢复数据库,最后为某些用户授予访问权限。可以在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