如何还原系统数据库
关于系统数据库的说明,可参考下表:
| 数据库名称 | 作用 | 保存的对象 | 备注 |
|---|---|---|---|
| master | 记录所有系统级信息的数据库 | db清单,login,Linked Server | 不用担心遗忘login及linkedserver密码 |
| msdb | 用来安排警报和作业的数据库 | 代理、日志传送、SSIS、备份还原信息等 | 关注是否有复制、ssis包、日志传送 |
| model | 为所有数据库创建的模板 | 新建db会包含该库的table,sp,login | 仅在业务需要的时候备份 |
| tempdb | 保存临时表或中间结果集的工作空间 | 无需关注 | 每次重启会重置,无需备份和恢复 |
| distribution | 存储复制分发相关的元数据 | - | 配置了发布及订阅才会有此库 |
准备工作
- 第1步,准备一些测试数据,以 SQL Server 2019 为例:
--.创建 database
USE master
GO
CREATE DATABASE abc_2025
CREATE LOGIN user_2025 WITH PASSWORD = 'Admin_20250708',CHECK_POLICY=ON
--.创建 login
USE abc_2025
GO
CREATE USER user_2025 FOR LOGIN user_2025
EXEC sp_addrolemember N'db_datawriter', N'user_2025'
EXEC sp_addrolemember N'db_datareader', N'user_2025'
--.创建 linked server
EXEC master.dbo.sp_addlinkedserver @server='local_linksrv', @srvproduct='', @provider='SQLOLEDB', @datasrc='127.0.0.1,1433'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname='local_linksrv', @useself='false', @locallogin=null, @rmtuser='user_2025', @rmtpassword='Admin_20250708'
GO
EXEC master.dbo.sp_serveroption @server='local_linksrv', @optname='rpc', @optvalue='true'
EXEC master.dbo.sp_serveroption @server='local_linksrv', @optname='rpc out', @optvalue='true'
--.手动创建 job
- 第2步,备份一下数据库,用于后续的测试
--.备份系统数据库
backup database master to disk = 'd:\master.bak' with compression,stats=1
backup database msdb to disk = 'd:\msdb.bak' with compression,stats=1
backup database model to disk = 'd:\model.bak' with compression,stats=1
--.备份用户数据库
backup database abc_2025 to disk = 'd:\abc_2025.bak' with compression,stats=1
- 第3步,清理掉测试数据
USE master;
ALTER DATABASE abc_2025 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE abc_2025
DROP LOGIN user_2025
EXEC master.dbo.sp_dropserver @server=N'local_linksrv', @droplogins='droplogins'
还原master数据库
- 第1步,停掉 SQL Server 服务
C:\Windows\system32>net stop mssqlserver
下面的服务依赖于 SQL Server (MSSQLSERVER) 服务。
停止 SQL Server (MSSQLSERVER) 服务也会停止这些服务。
SQL Server 代理 (MSSQLSERVER)
你想继续此操作吗? (Y/N) [N]: Y
SQL Server 代理 (MSSQLSERVER) 服务正在停止.
SQL Server 代理 (MSSQLSERVER) 服务已成功停止。
SQL Server (MSSQLSERVER) 服务正在停止.
SQL Server (MSSQLSERVER) 服务已成功停止。
- 第2步,运行单人使用者模式
C:\Windows\system32>net start mssqlserver /m
SQL Server (MSSQLSERVER) 服务正在启动 .
SQL Server (MSSQLSERVER) 服务已经启动成功。
- 第3步,利用 sqlcmd 登录实例,还原 master(记得每一步之后加上go)
C:\Windows\system32>sqlcmd -S localhost
1> restore database master from disk = 'd:\master.bak' with replace
2> go
已为数据库 'master',文件 'master' (位于文件 1 上)处理了 512 页。
已为数据库 'master',文件 'mastlog' (位于文件 1 上)处理了 2 页。
已成功地还原了 master 数据库。正在关闭 SQL Server。
SQL Server 正在终止此进程。
- 第4步,重新启动 SQL Server 服务(不是单人使用者模式)
C:\Windows\system32>net start mssqlserver
SQL Server (MSSQLSERVER) 服务正在启动 .
SQL Server (MSSQLSERVER) 服务已经启动成功。
- 第5步,打开 Management Studio,使用老实例的 sa 及密码登录 SQL Server 实例(新机器使用 Windows 身份验证 会失败,因为凭据变了)
注1:恢复master库之后,会恢复出所有的用户数据库(若恢复到新机器则db状态为恢复挂起)、用户账号、链接服务器。
注2:如果更换了机器,则迁移之后还需要先删除老的Windows账号,再将本机的Windows管理员账号添加sa权限。
- 第6步,若更换了机器,则需要修复 @@SERVICENAME 与 @@SERVERNAME 不一致的问题。注意,必须重启 SQL Server 服务才会生效。
SELECT @@ServerName,SERVERPROPERTY('ServerName')
IF @@SERVERNAME <> SERVERPROPERTY('ServerName')
BEGIN
DECLARE @srvname sysname
SET @srvname = @@SERVERNAME
EXEC sp_dropserver @server = @srvname
SET @srvname = CAST( SERVERPROPERTY('ServerName') as sysname)
EXEC sp_addserver @server = @srvname , @local = 'LOCAL'
END
- 第7步,恢复用户数据库
use master;
restore database abc_2025 from disk = 'd:\abc_2025.bak' with replace
- 第8步,使用老实例的普通账号及密码登录 SQL Server 实例,确认用户权限是否正常
还原msdb、model、tempdb数据库
- 如果 SQL Server 代理正在运行,它可以访问 msdb 数据库。因此,在还原 msdb 之前,请先停止 SQL Server 代理
USE master;
GO
--.恢复 msdb 需要在单用户模式下进行还原
ALTER DATABASE msdb SET SINGLE_USER WITH NO_WAIT
RESTORE DATABASE msdb FROM DISK = 'd:\msdb.bak' WITH REPLACE;
ALTER DATABASE msdb SET MULTI_USER WITH NO_WAIT
- 还原model数据库与还原用户数据库的方法一样
--.恢复 model 与还原用户数据库一样
RESTORE DATABASE model FROM DISK = 'd:\model.bak' WITH REPLACE;
- 复制支持将复制的数据库还原到从中创建备份的同一服务器和数据库。如果将复制数据库的备份还原到其他服务器或数据库,则无法保留复制设置。 在这种情况下,您必须在还原备份后重新创建所有发布和订阅(如果正在使用日志传送,则可以将复制数据库还原到备用服务器)。
