摘要:
一台SQL SERVER的系统数据库突然坏掉了(例如master),在有备份的情况下可以参考下文还原,无备份就只能重建了。
如果一台旧的实例需要搬迁到新的一台,这种整实例搬迁可以参考下文。
系统数据库介绍
master 记录实例的系统信息(login,linkserver...),SQL SERVER启动时打开的第一个数据库。
model SQL SERVER启动时需要用它创建tempDB,无tempDB不能启动。还原方式与用户DB一样。
msdb 保存代理,备份等信息。(默认该DB是简单恢复模式,如果要对其备份计划,则建议改为完整恢复模式)还原方式与用户DB一样。
tempdb
Resource 一个只读的数据库,不会写入数据。相同版本的sql server他们的resource数据库是一样的(可以手动备份文件),还原时停掉实例,手动放到相应路径。
默认位置:C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn
还原数据库SQL
--参数recovery意思是回滚未提交的事务好让DB可用,norecovery意思不回滚未提交事务这样还原完DB是不可用的。 restore database database_name from backup_device with recovery --发生错误继续还原,还原完查看错误日志看遇到了哪些错误 restore database database_name from backup_device with continue_after_error,recovery
还原系统数据库
还原master
1.要确保新的SQL SERVER和旧的版本一致。
--查询的版本号要一致 select @@version
2.在备用服务器上停止所有SQL SERVER服务,以单用户启动SQL SERVER实例(我这里指定用sqlcmd登陆)。
net start mssqlserver /m"SQLCMD"
3.sqlcmd连接
4.还原master
还原完成后,实例自动停止
restore database master from disk=\'E:\master\master_backup_2020_03_27_114340_1691283.bak\' with replace
新实例也有master所以要采用覆盖(with replace)不然会报错
The backup set holds a backup of a database other than the existing \'master\' database.
5.由于master记录的是旧的系统DB路径,如果和现在的不同的话,直接启动会失败,所以要加个跟踪标志3608来启动,然后修改路径不同的系统DB的路径。
如果2台系统DB路径是相同的则可直接正常启动。
net start MSSQLSERVER /f /m /T3608
--mssqlsystemresource alter database mssqlsystemresource modify file(name=data,file=\'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\mssqlsystemresource.mdf\') alter database mssqlsystemresource modify file(name=log,file=\'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\mssqlsystemresource.ldf\') --msdb alter database msdb modify file(name=MSDBData,file=\'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\msdbdata.mdf\') alter database msdb modify file(name=MSDBLog,file=\'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\msdblog.ldf\') --model alter database model modify file(name=modeldev,file=\'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\model.mdf\') alter database model modify file(name=modellog,file=\'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\modellog.ldf\') --tempdb alter database tempdb modify file(name=tempdev,file=\'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\tempdb.mdf\') alter database tempdb modify file(name=tempdev,file=\'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\tempdb.ldf\')
6.我这次2台系统DB的路径是相同的,所以就直接启动了,
还原msdb
restore database msdb from disk=\'E:\msdb\msdb_backup_2020_03_27_114340_3878743.bak\'
with move \'MSDBData\' to \'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\msdbdata.mdf\',
move \'MSDBLog\' to \'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\msdblog.ldf\',
replace
还原model
restore database model from disk=\'E:\model\model_backup_2020_03_27_114340_2316265.bak\'
with move \'modeldev\' to \'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\model.mdf\',
move \'modellog\' to \'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\modellog.ldf\',
replace
7.修改服务器名
因为master是旧的那台的,所以他保存的是旧的服务器名
--查询服务器名 select @@servername --删除旧的,添加当前的 sp_dropserver\'oldservername\' go sp_addserver \'newservername\',\'local\' go
实例重启后即生效。
8.这时实例级的job.linkserver,login等都已配置到了新的一台,但是用户数据是怀疑状态,因为还没有还原用户DB,还原即可。