我需要能够使用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\
很好。
答案 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