教你恢复SQLSERVER的master系统库的方法

目录
  • 一、问题描述
  • 二、解决方案
    • 2.1 什么时候必须恢复 SQL Server 主数据库?
    • 2.2 恢复SQLSERVER的master库的两种方法
      • 2.2.1 方法一:SQLSERVER实例能正常启动
      • 2.2.2 方法二:SQLSERVER实例无法启动
  • 三、还原 SQL Server master数据库时会丢失哪些数据?

一、问题描述

SQL Server 的master数据库不能像其他用户或 系统数据库一样恢复, 因为没有活动的master数据库 SQL Server 无法执行。虽然很少需要恢复 SQL Server master数据库,但如果需要,DBA 必须为这种情况做好准备。本文介绍可能需要恢复master数据库的情况以及如何正确完成这些步骤。

二、解决方案

2.1 什么时候必须恢复 SQL Server 主数据库?

情景一:

master库损坏,如果master库被损坏,最好的做法通常是从备份中恢复。master中的数据是相对静态的,因此在大多数情况 下,丢失几个小时的历史记录也没有什么问题。

情景二:

恢复master的其他原因可能是恢复丢失的登录名且由于某种原因无法重置密码。如果需要恢复master库以恢复用户数据或对象,那么这将是一个将他们移出master库并移入用户数据库的机会。

2.2 恢复SQLSERVER的master库的两种方法

有 2 种可用的方法来恢复主数据库。第一个只能用于恢复正在运行的 SQL Server 上的主数据库。如果问题是主数据库损坏并且此损坏导致 SQL Server 无法启动,则必须使用第二种方法。如果 SQL Server 正在运行,则可以选择使用第二种方法。

前提条件:

恢复最基本的前提是有master备份副本。如果没有,首先让我们备份master库

backup database master to disk = 'c:\master.bak' with compression;

2.2.1 方法一:SQLSERVER实例能正常启动

1、将 SQL Server 实例置于单用户模式

使用传统的数据库还原命令,需要将服务器启动到单用户模式,否则将会有如下错误

Msg 3108, Level 16, State 1, Line 2
要恢复主数据库,服务器必须在单用户模式下运行。有关以单用户模式启动的信息,请参阅联机丛书中的“如何:启动 SQL Server 实例 (sqlservr.exe)”。
消息 3013,级别 16,状态 1,第 2 行
RESTORE DATABASE 异常终止。

要在单用户模式下启动 SQL Server,我们使用“SQL Server 配置管理器”添加相应的启动参数-m 。

为此,请打开“SQL Server 配置管理器”,选择“SQL Server 服务”,然后选择相应的 SQL Server 实例,右键单击它并选择“启动参数”。作为启动参数,我们指定“-m”,表示服务将以单用户模式启动。

单击“添加”,然后单击“应用”,将出现以下消息。

修改服务参数,需要重启SQL SERVER服务才能生效。

2、在单用户模式下使用 SSMS 还原master数据库

为避免多个连接,我们将打开“SQL Server Management Studio”,但不连接到服务器。换句话说,我们将关闭“连接到服务器”窗口,同时关闭“对象资源管理器”。然后我们将点击“新建查询”。

在这个新的查询窗口中,我们将连接到数据库。

此时连接成功。这意味着我们设法避免了与服务器的多个连接,并为我们的查询窗口保留了单个连接。

现在,我们可以在查询窗口中执行我们的 T-SQL 恢复命令并恢复主数据库。

只有在没有其他连接到服务器的情况下,才能以单用户模式连接到 SQL Server。因此,确保所有可以连接到 SQL Server 的服务(例如 SQL Server 代理)都已停止。此外,在从 SSMS 连接的情况下,必须消除来自 SSMS 的所有其他连接。关闭“对象资源管理器”并通过仅打开一个查询窗口进行连接可能是一种解决方案。在此之后,您可以删除启动参数并以多用户模式重新启动 SQL Server。

2.2.2 方法二:SQLSERVER实例无法启动

如果服务无法启动,如何执行恢复命令?

这是一个棘手的问题。小编也不希望任何读者都能体验到这一点,但如果确实发生了,这些是完成恢复所要遵循的步骤。

Step1

查找与 SQL Server 相同主要版本的另一个 SQL Server 实例。如果没有其他可用的,则可能需要快速安装 SQLSERVER实例。

Step2

将主数据库备份还原到运行正常的 SQL Server 实例,就像它是普通用户数据库一样。需要使用备用名称,例如 master_recovery。

restore database master_recovery from disk = 'c:\master.bak' with
move 'master' to 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\master_recovery.mdf',
move 'mastlog' to 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\mastlog_recovery.ldf';

step3

现在数据库已在线,步骤 3 是将该数据库与工作实例分离。

USE [master]
GO
EXEC master.dbo.sp_detach_db @dbname = N'master_recovery'
GO

step4

此时 2 个数据库文件不再附加到 SQL Server 的工作实例。第 4 步是将 2 个文件移动到有 master 问题的实例的服务器。

step5

接下来,对于第 5 步,必须告知遇到问题的 SQL Server 实例使用这些新文件,而不是失败的文件。这可以通过更改 SQL Server 的启动参数,以指向这些新文件或将 master.mdf 和 mastlog.ldf 重命名为新名称并重命名 _recovery文件以匹配默认文件名来完成。无论哪种方式,下一次服务启动都将使用新文件而不是坏文件。

下面的演示,是通过修改启动参数指向_recovery 文件而不是默认文件。接着重新启动服务(因为它正在运行)。现在该服务正在使用恢复的主数据库而不是失败的主数据库。

最后一步是 在这个 master 副本上运行 DBCC CHECKDB 。如果显示有损坏,请及时返回,直到找到正确的副本。CheckDB 不能在较早的步骤中运行,因为主数据库在作为用户数据库检查时会产生误报。

三、还原 SQL Server master数据库时会丢失哪些数据?

刚刚通过恢复较旧的主数据库或从另一个实例获取副本来及时回溯,在此转换中可能会丢失哪些数据?

  • 主数据库中的大多数数据都是静态的,但是几天后回溯,还是有一些事情需要检查。
  • 在备份和还原之间是否添加或删除了任何登录名?这些将需要重新创建或删除。
  • 是否有人在该窗口期间更改了密码?如果是这样,他们的旧密码将重新生效。

是否更改了任何服务器角色分配?这些将被还原。

如果在时间窗口内添加了任何数据库,则旧master数据库将无法识别它们。数据库文件本身不会被删除,因此只需附加数据库即可。如果在该窗口期间删除了任何数据库,那么它们将显示为可以再次删除的可疑数据库。任何像sp_configure中更改的设置都 将恢复。

到此这篇关于恢复SQLSERVER的master系统库的文章就介绍到这了,更多相关SQLSERVER的master系统库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SQLServer中master数据库分析

    表sysdatabases:保存DBMS中数据库信息 select [name] from [sysdatabases] order by [name] 就能得到该DBMS中的数据库信息 表sysobjects:保存数据库中数据表信息 con.ChangeDatabase(DBName) select [id],[name] from [sysobjects] where [type]='u',con 就能得到该数据库的表信息 表syscolumns:保存数据表的列信息 select [name

  • sqlserver2005 master与msdb数据库备份恢复过程

    由于系统数据库对Sql Server来说尤其重要,为了确保SQL SERVER系统的正常运行,除了日常备份用户的数据库之外,我们还需要备份系统数据库,如对Master,Model,Msdb(TempDB不需备份)进行完整备份 1.还原Master数据库 如果系统配置丢失或Master出现问题,可以进入单用户模式进行还原:如果出现下列情况,必须重新生成损坏的 master 数据库:A. master 数据库的当前备份不可用.B. 存在 master 数据库备份,但由于 Microsoft SQL

  • 教你恢复SQLSERVER的master系统库的方法

    目录 一.问题描述 二.解决方案 2.1 什么时候必须恢复 SQL Server 主数据库? 2.2 恢复SQLSERVER的master库的两种方法 2.2.1 方法一:SQLSERVER实例能正常启动 2.2.2 方法二:SQLSERVER实例无法启动 三.还原 SQL Server master数据库时会丢失哪些数据? 一.问题描述 SQL Server 的master数据库不能像其他用户或 系统数据库一样恢复, 因为没有活动的master数据库 SQL Server 无法执行.虽然很少需

  • Android开发教程之Fragment定义、创建与使用方法详解【包含Activity通讯,事务执行等】

    本文实例讲述了Android开发教程之Fragment定义.创建与使用方法.分享给大家供大家参考,具体如下: 概述 Fragment是activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一个Fragment.你可以把Fragment认为模块化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity运行时被添加或删除. Fragment不能独立存在,它必须嵌入到

  • Git恢复之前版本的两种方法reset、revert(图文详解)

    一.问题描述 在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset).反做(revert). 二.背景知识 git的版本管理,及HEAD的理解 使用git的每次提交,Git都会自动把它们串成一条时间线,这条时间线就是一个分支.如果没有新建分支,那么只有一条时间线,即只有一个分支,在Git里,这个分支叫主分支,即master分支.有一个HEAD指针指向当前分支(只有一个分支的情况下

  • C#访问SqlServer设置链接超时的方法

    本文实例讲述了C#访问SqlServer设置链接超时的方法.分享给大家供大家参考.具体实现方法如下: 下面这段代码设置超时时间为60秒,默认为30秒 using (connection) { SqlCommand sqlcommand = connection.CreateCommand(); sqlcommand.CommandTimeout = 60; //默认时间为 30 秒 sqlcommand.CommandText = sqlText; ... 希望本文所述对大家的C#程序设计有所帮

  • sqlserver进程死锁关闭的方法

    1.首先我们需要判断是哪个用户锁住了哪张表. --查询被锁表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' 查询后会返回一个包含spid和tableName列的表. 其中spid是进程名,tableName是表名. 2.了解到了究竟是哪个进程锁了哪张表后,需要通过进程找到锁

  • 手把手教你AspNetCore WebApi认证与授权的方法

    前言 这几天小明又有烦恼了,之前给小红的接口没有做认证授权,直接裸奔在线上,被马老板发现后狠狠的骂了一顿,赶紧让小明把授权加上.赶紧Baidu一下,发现大家都在用JWT认证授权,这个倒是挺适合自己的. 什么是Token Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码. 什么是JWT Json web token (JWT),是为了在网

  • 迁移sqlserver数据到MongoDb的方法

    前言 随着数据量的日积月累,数据库总有一天会不堪重负的,除了通过添加索引.分库分表,其实还可以考虑一下换个数据库.我强烈推荐使用MongoDb,我举例说一下我的经历:我的项目中有一张表的数据大概是3000万行数据,sqlserver查找的速度是16秒左右.我导入到MongoDb中后查询的速度大概能快一倍多,7秒左右,如果还是不能满足需求,MongoDb同样可以:索引,分库分表.那么下面就开干吧: 迁移方案:sqlserver和mongodb都支持导入导出csv格式,这肯定是比手动编码写个查询然后

  • 手把手教你用Django执行原生SQL的方法

    前言 Hey,各位小伙伴,这次怎么来玩一下,如何使用Django执行原生SQL. 我们都知道,Python在web界的扛把子--Django,可谓是集大成为统一,各种各样的插件.forms组件.model模型.Admin后台等等,后面我会专门出文章娓娓道来,反正就是一个字,NB. 本次就来学一下,如何在Django执行原生语句. 起因 在使用Django时,一般情况下,我们使用Django自带的model查询是没有问题的,基本能满足80%的问题 但是,但是,那20%就不要了吗???肯定不行哎,小

  • python之PyAutoGui教你做个自动脚本计算器的方法

    前提环境准备 python3+pillow+pyautogui 先提前安装好python3以及pillow和pyautogui模块 这里介绍一下模块安装方法 pip install pillow pip install pyautogui pip install opencv-python 最终效果是利用python脚本模拟电脑计算器进行自动计算,相当于模拟人去点击自带的计算器进行运算,想要做到这一点需要有两个条件: 1.模拟鼠标和键盘的输入工作 2.识别计算器按钮的位置 先来看一下win10电

  • Python GUI教程之在PyQt5中使用数据库的方法

    目录 PyQt5的SQL数据库支持 在PyQt5中简单使用数据库 创建一个UI界面 连接一个数据库 在UI界面查看和修改数据 添加和删除数据 在桌面图像化界面编程中,我们通常需要将一些数据或配置信息存储在本地.在本地进行数据的存储,我们可以直接使用文本文件,比如ini文件.csv文件.json文件等,或者是使用文件型的数据库(比如sqlit3)进行存储. PyQt5的SQL数据库支持 Qt平台对SQL编程有着良好的支持,PyQt5也一并继承了过来.在PyQt5中,QtSql子模块提供对SQL数据

随机推荐