我目前拥有三个网站副本(实时、暂存和开发),每个副本的数据库位于三台独立的服务器上。通常情况下,会出现需要最新数据库的错误,因此我将通过 RDP 进入实时数据库,进入 SQL Server Management Studio 并备份数据库。然后,我将使用 RDP 将 .bak 文件复制到暂存数据库和开发数据库服务器,并手动覆盖每个数据库。
它确实有效,但这是一个非常手动的过程。显然,我使用 UI 执行的操作可以使用如下命令完成:
BACKUP DATABASE MySiteDB
TO DISK = 'c:\MySiteDB.bak'
WITH FORMAT,
MEDIANAME = 'MySiteDB',
NAME = 'Live backup'
GO
我也可以使用如下命令来恢复它:
RESTORE DATABASE MySiteDB
FROM DISK = 'X:\MySiteDB.bak'
WITH
REPLACE,
STATS = 10, -- Show progress (every 10%)
MOVE 'MySiteDB_Data' TO 'C:\MSSQL\DATA\MySiteDB.mdf',
MOVE 'MySiteDB_Log' TO 'C:\MSSQL\DATA\MySiteDB.ldf'
GO
但是,这仍然需要我登录到每个服务器,并手动复制文件。
理想情况下,我希望能够在我的开发服务器上运行一个批处理文件,该文件将在我的实时数据库服务器上创建备份,将其复制到暂存数据库服务器上的网络驱动器(我们称之为X:\
),然后进行完整备份并覆盖暂存上的现有 MySiteDB 数据库(然后可能恢复到开发服务器)。这样,将暂存数据库同步到实时数据库就是一个一步到位的过程。
我尝试研究如何做到这一点,我能找到的最接近的方法是在数据库之间创建链接。但是,我还找到了命令EXEC AT
。我不确定它们是否相同,但看起来我也可以在这里做我想做的事情,根据本文。
话虽如此,我仍然不明白如何将所有这些查询合并为可以从单个服务器运行的单个查询。这只是使用EXEC AT
这些命令链接在一起的问题吗?此外,服务器链接如何工作?我可以使用命令创建临时链接吗?
任何帮助,将不胜感激。
答案1
您应该能够使用批处理和 sqlcmd 执行此操作。假设您有写入服务器上共享的备份和恢复脚本:
@ECHO ON
set backupscript=c:\path\backup.sql
set restorescript=c:\path\restore.sql
set livestore=\\server\share
set stagestore=\\server\share
set devstore=\\server\share
set liveserver=server\inst
set stageserver=server\inst
set devserver=server\inst
sqlcmd -E -S%liveserver% -i "%backupscript%"
copy "%livestore%\*" %stagestore%
copy "%livestore%\*" %devstore%
sqlcmd -E -S%stageserver% -i "%restorescript%"
sqlcmd -E -S%devserver% -i "%restorescript%"