假设现在管理员遇到了下面的这些挑战:
1. 原先的服务器出现了硬件故障,已经无法启动。需要将整个SQL Server系统紧急迁移到一台备用的服务器上。(备用服务器名称叫sql2005pc,SQL Server是默认实例。)
2. 备用服务器和原服务器不同名,SQL Server安装的路径也不一样。(备用服务器安装的路径为C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL)。
3. 因为良好的备份策略,现在手头有最新的maste,msdb,model数据库备份文件,以及其他所有用户数据库备份文件。
4. 现在需要及昂系统数据库恢复,以及还原所有数据库系统信息(用户,密码,任务等)。然后才能恢复用户数据库。
在这种情况下,回复系统数据库需要修改系统数据库路径,还要修改SQL Server记录下的自己的服务器名称。步骤有些复杂,某些步骤需要用特定的参数启动SQL Server。请注意,在命令行运行的指令,是大小写敏感的。
参考解决方案:
1. 确定备份服务器的SQL Server版本和原服务器一致。
因为我们要恢复系统数据库,要保证我们恢复的master和msdb数据库和备用机的Resource数据库一致。否则SQL Server将不能正常工作。所谓版本一致,指的是”select @@version“返回的号码必须完全一样。
2. 在备份服务器的命令行窗口,用指令以单用户模式启动SQL Server服务。
net start mssqlserver /m |
命令如果成功执行,应该返回如下信息:
The SQL Server (DR) service is starting.. The SQL Server (DR) service was started successfully. |
3. 在命令行窗口,用sqlcmd这个命令行工具连接SQL Server。
sqlcmd -E -S sql2005pc |
如果连接成功建立,应该返回下面的信息。
1> |
4. 首先恢复master数据库。
(1)在sqlcmd的那个连接里,运行下面的恢复语句(假设备份文件为c:\lab\master.bak)。
restore database master from disk = 'c:\lab\master.bak' go |
它应该返回类似下面的信息:
Processed 360 pages for databse 'master' ,file 'master' on file 1. Processed 4 pages for database 'master' file 'mastlog' on file 1. The master database has been successfully restored. Shutting down SQL Server. SQL Server is Terminating this process. |
SQL Server服务自动停止。
(2)由于恢复的master数据库里记载的其他数据库的路径和现在的路径不一致,这个时候重新启动SQL Server会失败。必须要用跟踪标志3608来启动。
net start mssqlserver /f /m /T3068 |
如果正常,应该返回下面的信息。
The SQL Server (DR) service is starting.. The SQL Server (DR) service was started successfully. |
(3)用sqlcmd连接修改其他数据库的文件路径到现有的正确路径(C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\)。
在命令行窗口,用sqlcmd 再次做连接。
sqlcmd -E -S sql2005pc |
用下面的语句修改各个系统数据库的文件路径。
alter databse mssqlsystemresource modify file (name=data, filename='C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\mssqlsystemresource.mdf'); go |
如果正常,应该返回下面的信息。
The file "data" has been modified in the system catalog. The new path will be used the next time the database is started. |
alter databse mssqlsystemresource modify file (name=log, filename='C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\mssqlsystemresource.ldf'); go |
如果正常,应该返回下面的信息。
The file "log" has been modified in the system catalog. The new path will be used the next time the database is started. |
alter databse msdb modify file (name=MSDBData, filename='C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\msdbdata.mdf'); go |
如果正常,应该返回下面的信息。
The file "MSDBData" has been modified in the system catalog. The new path will be used the next time the database is started. |
alter databse msdb modify file (name=MSDBLog, filename='C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\msdblog.ldf'); go |
如果正常,应该返回下面的信息。
The file "MSDBLog" has been modified in the system catalog. The new path will be used the next time the database is started. |
alter databse model modify file (name=modeldev, filename='C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\model.mdf'); go |
如果正常,应该返回下面的信息。
The file "modeldev" has been modified in the system catalog. The new path will be used the next time the database is started. |
alter databse model modify file (name=modellog, filename='C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\modellog.ldf'); go |
如果正常,应该返回下面的信息。
The file "modellog" has been modified in the system catalog. The new path will be used the next time the database is started. |
alter databse tempdb modify file (name=tempdev, filename='C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\tempdb.mdf'); go |
如果正常,应该返回下面的信息。
The file "tempdev" has been modified in the system catalog. The new path will be used the next time the database is started. |
alter databse tempdb modify file (name=templog, filename='C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\modellog.ldf'); go |
如果正常,应该返回下面的信息。
The file "templog" has been modified in the system catalog. The new path will be used the next time the database is started. |
全部修改完毕后,运行”Exit“命令退出sqlcmd连接。
(4)关闭SQL Server。
net stop mssqlserver |
如果正常,应该返回下面的信息:
The SQL Server (DR) service is stopping.. The SQL Server (DR) service was stopped successfully. |
(5)用正常模式启动SQL Server。(如果启动不了可直接打开SQL Server Management Studio用sa登录进去执行下面的步骤)
net start mssqlserver |
这时,SQL Server可以正常启动。但是它使用的系统数据库除了master以外,都是原先备用服务器上的自己的。我们要用生产服务器上的备份来替换它们。
5.恢复msdb数据库。
在运行下面的命令之前,要先关闭SQL Server Agent服务。然后用Restore命令恢复msdb数据库,将其指向新的文件路径。
restore databse msdb from disk ='c:\lab\msdb.bak' with move 'MSDBData' to 'C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\msdbdata.mdf', move 'MSDBLog' to 'C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\msdblog.ldf ',replace |
如果正常,应该返回类似下面的信息。
Processed 600 pages for databse 'msdb' ,file 'MSDBData' on file 1. Processed 7 pages for database 'msdb' file 'MSDBLog' on file 1. RESTORE DATABASE successfully processed 607 pages in 0.841 seconds (5.907MB/sec). |
6.恢复model数据库。
在运行下面的命令之前,要先关闭SQL Server Agent服务。然后用Restore命令恢复msdb数据库,将其指向新的文件路径。
restore databse model from disk ='c:\lab\model.bak' with move 'modeldev' to 'C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\model.mdf', move 'modellog' to 'C:\Program File\Microsoft SQL Server\MSSQL.4\MSSQL\Data\modellog.ldf ',replace |
如果正常,应该返回类似下面的信息。
Processed 152 pages for databse 'msdb' ,file 'MSDBData' on file 1. Processed 3 pages for database 'msdb' file 'MSDBLog' on file 1. RESTORE DATABASE successfully processed 155 pages in 0.174 seconds (7.273MB/sec). |
7.修改服务器名称。
(1)运行下面的语句你会发现,返回的还是原先的服务器名字。这是因为master数据库是从那台机器来的。
select @@servername |
(2)运行下面的语句修改服务器名。
sp_dropserver '<原先服务器名>' go sp_addserver '<现服务器名>','local' go |
注意:如果运行sp_dropserver '<原先服务器名>' 报错:
消息 15190,级别 16,状态 1,过程 sp_dropserver,第 56 行 仍有对服务器 '<原先服务器名>' 的远程登录或链接登录。 |
则执行下面的语句:
select * from msdb.dbo.MSdistpublishers exec sp_droplinkedsrvlogin '<原先服务器名> ',null exec sp_dropserver '<原先服务器名>','droplogins' exec sp_addserver '<现服务器名>' , 'LOCAL' exec sp_setnetname 'repl_distributor','<现服务器名>' |
(3)重启SQL Server服务,再运行下面的语句,就可以看到返回的是现在的服务器名字了。
select @@servername |
做完这些操作后,原先的SQL Server的所有配置都能够恢复到新的服务器上。只是用户数据库都是可疑状态,因为新服务器上没有它们的文件。接下来就可以使用Restore将用户数据库依次恢复。