SqlServer重新生成系统数据库

系统数据库

SQL Server包含以下系统数据库

系统数据库说明
master数据库记录 SQL Server实例的所有系统级信息。
msdb 数据库用于 SQL Server 代理计划警报和作业。
model 数据库用作 SQL Server实例上创建的所有数据库的模板。 对 model 数据库进行的修改(如数据库大小、排序规则、恢复模式和其他数据库选项)将应用于以后创建的所有数据库。
Resource 数据库一个只读数据库,包含 SQL Server包括的系统对象。 系统对象在物理上保留在 Resource 数据库中,但在逻辑上显示在每个数据库的 sys 架构中。
tempdb 数据库一个工作空间,用于保存临时对象或中间结果集。

master数据库

master 数据库记录 SQL Server 系统的所有系统级信息。 这包括实例范围的元数据(例如登录帐户)、端点、链接服务器和系统配置设置。 在 SQL Server中,系统对象不再存储在 master 数据库中,而是存储在 Resource 数据库中。 此外, master 数据库还记录了所有其他数据库的存在、数据库文件的位置以及 SQL Server的初始化信息。 因此,如果 SQL Server master 数据库不可用,则 无法启动。

限制

不能在 master 数据库中执行下列操作:

  • 添加文件或文件组。
  • 备份,主数据库上只能执行完整的数据库备份。
  • 更改排序规则。 默认排序规则为服务器排序规则。
  • 更改数据库所有者。 master 的所有者是 sa
  • 创建全文目录或全文索引。
  • 在数据库的系统表上创建触发器。
  • 删除数据库。
  • 从数据库中删除 guest 用户。
  • 启用变更数据捕获。
  • 参与数据库镜像。
  • 删除主文件组、主数据文件或日志文件。
  • 重命名数据库或主文件组。
  • 将数据库设置为 OFFLINE。
  • 将数据库或主文件组设置为 READ_ONLY。

model 数据库

model 数据库用于在 SQL Server 实例上创建所有数据库的模板。 因为每次启动 时都会创建 tempdb SQL Server ,所以 model 数据库必须始终存在于 SQL Server 系统中。 model 数据库的全部内容(包括数据库选项)都会被复制到新的数据库。 启动期间,也可使用 model 数据库的某些设置创建新的 tempdb ,因此 model 数据库必须始终存在于 SQL Server 系统中。

model 的用法

当发出 CREATE DATABASE 语句时,将通过复制 model 数据库中的内容来创建数据库的第一部分, 然后用空页填充新数据库的剩余部分。

如果修改 model 数据库,之后创建的所有数据库都将继承这些修改。 例如,可以设置权限或数据库选项或者添加对象,例如,表、函数或存储过程。 model 数据库的文件属性是一个例外且会被忽略(数据文件的初始大小除外)。 模型数据库数据和日志文件的默认初始大小为 8 MB。

限制

不能在 model 数据库中执行下列操作:

  • 添加文件或文件组。
  • 更改排序规则。 默认排序规则为服务器排序规则。
  • 更改数据库所有者。 模型 的所有者是 sa
  • 删除数据库。
  • 从数据库中删除 guest 用户。
  • 启用变更数据捕获。
  • 参与数据库镜像。
  • 删除主文件组、主数据文件或日志文件。
  • 重命名数据库或主文件组。
  • 将数据库设置为 OFFLINE。
  • 将主文件组设置为 READ_ONLY。
  • 使用 WITH ENCRYPTION 选项创建过程、视图或触发器。 加密密钥与在其中创建对象的数据库绑定在一起。 在 model 数据库中创建的加密对象只能用于 model 中。

msdb 数据库

代理使用 msdb SQL Server 数据库来计划警报和作业, SQL Server Management Studio、 Service Broker 和数据库邮件等其他功能也使用该数据库。

例如, SQL Server 在 msdb 中的表中自动保留一份完整的联机备份和还原历史记录。 这些信息包括执行备份一方的名称、备份时间和用来存储备份的设备或文件。 SQL Server Management Studio 使用这些信息来提出计划,还原数据库和应用任何事务日志备份。 将会记录有关所有数据库的备份事件,即使它们是由自定义应用程序或第三方工具创建的。 例如,如果使用调用 SQL Server 管理对象 (SMO) 对象的 Microsoft Visual Basic 应用程序执行备份操作,则事件将记录在 msdb 系统表、Microsoft Windows 应用程序日志和 SQL Server 错误日志中。 为了帮助您保护存储在 msdb 中的信息,我们建议您考虑将 msdb 事务日志放在容错存储区中。

限制

不能在 msdb 数据库中执行下列操作:

  • 更改排序规则。 默认排序规则为服务器排序规则。
  • 删除数据库。
  • 从数据库中删除 guest 用户。
  • 启用变更数据捕获。
  • 参与数据库镜像。
  • 删除主文件组、主数据文件或日志文件。
  • 重命名数据库或主文件组。
  • 将数据库设置为 OFFLINE。
  • 将主文件组设置为 READ_ONLY。

Resource 数据库

Resource 数据库为只读数据库,它包含了 SQL Server中的所有系统对象。 SQL Server 系统对象(如 sys.objects)在物理上保留在 Resource 数据库中,但在逻辑上却显示在每个数据库的 sys 架构中。 Resource 数据库不包含用户数据或用户元数据。

tempdb 数据库

tempdb 系统数据库是一个全局资源,可供连接到 SQL Server 实例或 Azure SQL 数据库的所有用户使用。 tempdb 保留:

  • 显式创建的临时用户对象。 它们包括全局或局部临时表及索引、临时存储过程、表变量、表值函数返回的表或游标。

  • 数据库引擎创建的内部对象。 它们包括:

    • 用于储存假脱机、游标、排序和临时大型对象 (LOB) 存储的中间结果的工作表。
    • 用于哈希联接或哈希聚合操作的工作文件。
    • 用于创建或重新生成索引等操作(如果指定了 SORT_IN_TEMPDB)的中间排序结果,或者某些 GROUP BY、ORDER BY 或 UNION 查询的中间排序结果。

    每个内部对象至少使用九页:一个 IAM 页,一个八页的盘区。

  • 版本存储区是数据页的集合,它包含支持用于行版本控制的功能的数据行。 有两种类型:公用版本存储区和联机索引生成版本存储区。 版本存储区包含:

    • 由通过行版本控制隔离或快照隔离事务使用 READ COMMITTED 的数据库中的数据修改事务生成的行版本。
    • 由数据修改事务为实现联机索引操作、多重活动结果集 (MARS) 以及 AFTER 触发器等功能而生成的行版本。

tempdb 中的操作是最小日志记录操作,以便回滚事务。 每次启动 SQL Server 时都会重新创建 tempdb,从而在系统启动时总是具有一个干净的数据库副本。 在断开联接时会自动删除临时表和存储过程,并且在系统关闭后没有活动连接。

tempdb 不会有什么内容从 SQL Server 的一个会话保存到另一个会话。 不允许对 tempdb 执行备份和还原操作。

限制

不能在 tempdb 数据库中执行下列操作:

  • 添加文件组。
  • 备份或还原数据库。
  • 更改排序规则。 默认排序规则为服务器排序规则。
  • 更改数据库所有者。 tempdb 的所有者是 sa。
  • 创建数据库快照。
  • 删除数据库。
  • 从数据库中删除 guest 用户。
  • 启用变更数据捕获。
  • 参与数据库镜像。
  • 删除主文件组、主数据文件或日志文件。
  • 重命名数据库或主文件组。
  • 正在运行 DBCC CHECKALLOC
  • 正在运行 DBCC CHECKCATALOG
  • 将数据库设置为 OFFLINE
  • 将数据库或主文件组设置为 READ_ONLY

重新生成系统数据库

resource 数据库需要单独重新生成。

限制

重新生成 master、model、msdb 和 tempdb 系统数据库时,将删除这些数据库,然后在其原位置重新创建它们。 如果在重新生成语句中指定了新排序规则,则将使用该排序规则设置创建系统数据库。 用户对这些数据库所做的所有修改都会丢失。 例如,您在 master 数据库中的用户定义对象、msdb 中的预定作业或 model 数据库中对默认数据库设置的更改都会丢失。

先决条件

在重新生成系统数据库之前执行下列任务,以确保可以将系统数据库还原至它们的当前设置。

  1. 记录所有服务器范围的配置值。

    SQL复制

    SELECT * FROM sys.configurations;  
    
  2. 记录所有应用到 SQL Server 实例和当前排序规则的修补程序。 重新生成系统数据库后必须重新应用这些修补程序。

    SQL复制

    SELECT  
    SERVERPROPERTY('ProductVersion ') AS ProductVersion,  
    SERVERPROPERTY('ProductLevel') AS ProductLevel,  
    SERVERPROPERTY('ResourceVersion') AS ResourceVersion,  
    SERVERPROPERTY('ResourceLastUpdateDateTime') AS ResourceLastUpdateDateTime,  
    SERVERPROPERTY('Collation') AS Collation;  
    
  3. 记录系统数据库的所有数据文件和日志文件的当前位置。 重新生成系统数据库会将所有系统数据库安装到其原位置。 如果已将系统数据库数据文件或日志文件移动到其他位置,则必须再次移动这些文件。

    SQL复制

    SELECT name, physical_name AS current_file_location  
    FROM sys.master_files  
    WHERE database_id IN (DB_ID('master'), DB_ID('model'), DB_ID('msdb'), DB_ID('tempdb'));  
    
  4. 找到 master、model 和 msdb 数据库的当前备份。

  5. 如果将 SQL Server 的实例配置为复制分发服务器,请找到该分发数据库的当前备份。

  6. 确保您有重新生成系统数据库的相应权限。 必须是 sysadmin 固定服务器角色的成员才能执行此操作。

  7. 请验证本地服务器上是否有 master、model、msdb 数据模板文件和日志模板文件的副本。 模板文件的默认位置是 C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\Templates。 在重新生成过程中要用到这些文件,而且若想让安装成功这些文件必须存在。 如果缺少这些文件,请运行安装程序的“修复”功能或者手动从安装介质中复制这些文件。 若要在安装介质上查找这些文件,请导航到相应的平台目录(x86 或 x64),然后导航到 setup\sql_engine_core_inst_msi\Pfiles\SqlServr\MSSQL.X\MSSQL\Binn\Templates。

重新生成系统数据库

此过程不重新生成 resource 数据库。

  1. 将 SQL Server 安装介质插入到磁盘驱动器中,或者在本地服务器上,从命令提示符处将目录更改为 setup.exe 文件的位置。 在服务器上的默认位置为 C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\SQLServer2016。

  2. 在命令提示符窗口中,输入以下命令。 方括号用来指示可选参数。 不要输入括号。 在使用 Windows 操作系统且启用了用户帐户控制 (UAC) 时,运行安装程序需要提升特权。 必须以管理员身份运行命令提示符。

    Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName]
    
    参数名称说明
    /QUIET 或 /Q指定在没有任何用户界面的情况下运行安装程序。
    /ACTION=REBUILDDATABASE指定安装程序将重新创建系统数据库。
    /INSTANCENAME=InstanceNameSQL Server实例的名称。 对于默认实例,请输入 MSSQLSERVER。
    /SQLSYSADMINACCOUNTS=accounts指定要添加到 sysadmin 固定服务器角色中的 Windows 组或单个帐户。 指定多个帐户时,请用空格将帐户隔开。 例如,输入 BUILTIN\Administrators MyDomain\MyUser。 当您在帐户名称内指定包含空格的帐户时,用双引号将该帐户引起来。 例如,输入 NT AUTHORITY\SYSTEM。
    [ /SAPWD=StrongPassword ]指定 SQL Server SA 帐户的密码。 如果实例使用混合身份验证(SQL Server 和 Windows 身份验证)模式,则此参数是必需的。

    * 安全说明 * sa 帐户是广为人知的 SQL Server 帐户,并且经常成为恶意用户的攻击目标。 因此,为 sa 登录名使用强密码非常重要。

    不要为 Windows 身份验证模式指定此参数。
    [ /SQLCOLLATION=CollationName ]指定新的服务器级排序规则。 此参数是可选的。 如果没有指定,则使用服务器的当前排序规则。

    * 重要事项 * 更改服务器级排序规则不会更改现有用户数据库的排序。 默认情况下,所有新创建的用户数据库都将使用新排序规则。
    [ /SQLTEMPDBFILECOUNT=NumberOfFiles ]指定 tempdb 数据文件的数目。 此值可以增加至 8 或内核数,以较大者为准。

    默认值:8 或内核数量,以较低者为准。
    [ /SQLTEMPDBFILESIZE=FileSizeInMB ]指定每个 tempdb 数据文件的初始大小 (MB)。 安装程序允许的大小最大为 1024 MB。

    默认值:8
    [ /SQLTEMPDBFILEGROWTH=FileSizeInMB ]指定每个 tempdb 数据文件的文件增长增量 (MB)。 值为 0 时表明自动增长被设置为关闭,不允许增加空间。 安装程序允许的大小最大为 1024 MB。

    默认值:64
    [ /SQLTEMPDBLOGFILESIZE=FileSizeInMB ]指定 tempdb 日志文件的初始大小 (MB)。 安装程序允许的大小最大为 1024 MB。

    默认值:8. 允许的范围:最小值 = 8,最大值 = 1024。
    [ /SQLTEMPDBLOGFILEGROWTH=FileSizeInMB ]指定 tempdb 日志文件的文件增长增量 (MB)。 值为 0 时表明自动增长被设置为关闭,不允许增加空间。 安装程序允许的大小最大为 1024 MB。

    默认值:64 允许的范围:最小值 = 8,最大值 = 1024。
    [ /SQLTEMPDBDIR=Directories ]指定 tempdb 数据文件的目录。 指定多个目录时,请用空格将目录隔开。 如果指定了多个目录,则 tempdb 数据文件将以轮循机制的方式分布在目录中。

    默认值:系统数据目录
    [ /SQLTEMPDBLOGDIR=Directory ]指定 tempdb 日志文件的目录。

    默认值:系统数据目录
  3. 在安装程序完成系统数据库重新生成后,它将返回到命令提示符,而且不显示任何消息。 请检查 Summary.txt 日志文件以验证重新生成过程是否成功完成。 此文件位于 C:\Program Files\Microsoft SQL Server\130\Setup Bootstrap\Logs。

  4. RebuildDatabase 方案会删除系统数据库,并再次以干净状态对其进行安装。 由于不会保留 tempdb 文件数的设置,并且在安装过程中也无法知道 tempdb 文件数的值。 因此,RebuildDatabase 方案不知道要重新添加的 tempdb 文件数。 你可以使用 SQLTEMPDBFILECOUNT 参数再次提供 tempdb 文件数的值。 如果未提供该参数,RebuildDatabase 将添加默认的 tempdb 文件数,默认的 tempdb 文件数与 CPU 计数一样多或为 8,以较小者为准。

生成后的步骤

重新生成数据库后,您可能需要执行以下额外任务:

  • 还原 master、model 和 msdb 数据库的最新完整备份。

    如果没有备份或者还原的备份不是最新的,请重新创建所有缺失的条目。 例如,重新创建用户数据库、备份设备、 SQL Server 登录名、端点等缺少的所有条目。 重新创建这些条目的最佳方法是运行创建它们的原始脚本。

  • 如果将 SQL Server 实例配置为复制分发服务器,则必须还原分发数据库。

  • 将系统数据库移到您以前记录的位置。

  • 验证服务器范围的配置值是否与您以前记录的值相符。

resource 数据库重新生成

重新生成 resource 系统数据库时,所有的热修补程序都将丢失,因此必须重新应用。

  1. 从分发介质中启动 SQL Server 安装程序 (setup.exe)。
  2. 在左侧导航区域中单击 “维护” ,然后单击 “修复” 。
  3. 安装程序支持规则和文件例程将运行,以确保您的系统上安装了必备组件,并且计算机能够通过安装程序验证规则。 单击 “确定” 或 “安装” 以继续操作。
  4. 在“选择实例”页上,选择要修复的实例,然后单击 “下一步” 。
  5. 将运行修复规则以验证修复操作。 若要继续,请单击 “下一步” 。
  6. 在 “准备修复” 页上,单击 “修复” 。 “完成”页指示修复操作已完成。

创建新的 msdb 数据库

  1. 停止与 数据库引擎连接的所有服务,包括 SQL Server 代理、 SSRS、 SSIS以及将 SQL Server 用作数据存储区的所有应用程序。

  2. 使用以下命令从命令行启动 SQL Server : `NET START MSSQLSERVER /T3608

  3. 在另一个命令行窗口中,通过执行以下命令(并用 SQL Server: SQLCMD -E -S<servername> -dmaster -Q"EXEC sp_detach_db msdb" 的实例替换 )来断开 msdb 数据库的连接

  4. 使用 Windows 资源管理器,重命名 msdb 数据库文件。 默认情况下,这些文件位于 SQL Server 实例的 DATA 子文件夹中。

  5. 使用 SQL Server 配置管理器,停止然后正常重新启动 数据库引擎 服务。

  6. 在命令行窗口中,连接到 SQL Server 并执行以下命令: SQLCMD -E -S<servername> -i"C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Install\instmsdb.sql" -o"C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Install\instmsdb.out"

    使用 数据库引擎 的实例替换 。 使用 SQL Server实例的文件系统路径。

  7. 使用 Windows 记事本,打开 instmsdb.out 文件,然后检查输出中是否存在任何错误。

  8. 重新应用在该实例上安装的任何修补程序。

  9. 重新创建在 msdb 数据库中存储的用户内容,例如作业、警报等。

  10. 备份 msdb 数据库。

重新生成 tempdb 数据库

  1. 重命名当前的 tempdb.mdf 和 templog.ldf 文件(如果未缺失)。

  2. 使用以下命令从命令提示符处启动 SQL Server。

    sqlservr -c -f -T3608 -T4022 -s <instance> -mSQLCMD
    

    对于默认实例名称,请使用“MSSQLSERVER”,对于命名实例,请使用“MSSQL$<instance_name>”。 跟踪标志 4022 会禁用启动存储过程的执行。 -MSQLCMD 仅允许 sqlcmd.exe连接到服务器

  3. 使用 sqlcmd 连接到服务器,然后使用以下存储过程重置 tempdb 数据库的状态。

    exec master..sp_resetstatus tempdb
    
  4. 通过在命令提示符窗口中按 CTRL+C 来关闭服务器

  5. 重新启动 SQL Server 服务。 这会创建一组新的 tempdb 数据库文件,同时恢复 tempdb 数据库。

本文参考并整理于微软官方文档重新生成系统数据库,仅用于个人记录

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值