SQL Server 2000中msdbdata.mdf 很大

本文介绍了解决SQL Server 2000中msdbdata.mdf文件迅速增长的问题。通过对restorefile和restorefilegroup表创建聚集索引,并使用sp_delete_backuphistory删除备份历史记录,实现了msdb数据库的有效收缩。

问题描述

==========

SQL Server 2000中msdbdata.mdf文件迅速增长到20G

故障排查

========

MSDB数据库中restorefile和restorefilegroup表占用了较大空间(共约19G),存放在restorefile和resotrefilegroup的记录主要是对于该服务器所发生过的所有backup和restore操作的历史记录,可能原因如下:

1.可能是由于您之前发生过较多的备份和还原的操作

2.创建过备份和还原的维护计划

3.由于该SQL Server实例使用了较旧的时间,备份还原历史堆积导致

我们通过调用sp_delete_backuphistory来删除较早的备份和还原历史记录,但是发现经过长时间的进行都无法成功。

您通过对bakcupset,restorefile和restorefilegroup创建索引,试图能够成功调用sp_delete_backuphistory,但仍旧失败。

经过使用一下语句查询,发现resotrefile和restorefilegroup创建的是非聚集索引:

Select * from sysdindexes where id=OBJECT_ID(‘restorefile’)

Select * from sysdindexes where id=OBJECT_ID(‘restorefilegroup’)

返回结果indid=0,这说明创建的非聚集索引。

我们通过CREATE CLUSTERED INDEX语句为这两张大表创建聚集索引(聚集索引指索引中存放真实的数据,非聚集索引的索引中只存放索引键,不存放数据)。

创建成功后,再次执行sp_delete_backuphistory,可以成功执行,MSDB也可以成功收缩。

解决办法:

==========

1.使用一下语句为MSDB的几张大表创建聚集索引

USE msdb;

GO

CREATE CLUSTERED INDEX [backupset_s01] ON [dbo].[backupset] ([media_set_id])
CREATE CLUSTERED INDEX [restorefile_s01] ON [dbo].[restorefile] ([restore_history_id])
CREATE CLUSTERED INDEX [restorefilegroup_s01] ON [dbo].[restorefilegroup] ([restore_history_id])

2.执行一下语句删除备份和还原的历史记录

USE msdb;

GO

EXEC sp_delete_backuphistory '01/01/11';

3.建议定期执行sp_delete_backuphistory

附加

==========

参考链接:http://msdn.microsoft.com/zh-cn/library/ms188328(v=SQL.90).aspx

### 修复或恢复SQL Server中丢失或损坏的msdbdata.mdf文件 当SQL Server中的`msdbdata.mdf`文件丢失或损坏时,可以按照以下方法进行修复或恢复。这些方法基于系统数据库的特性以及SQL Server的恢复机制。 #### 方法一:从备份中恢复msdb数据库 如果存在完整的`msdb`数据库备份,可以通过以下步骤恢复: 1. 使用`RESTORE DATABASE`命令从备份中恢复`msdb`数据库。确保指定新的数据文件和日志文件路径,以避免覆盖现有文件。 ```sql RESTORE DATABASE msdb FROM DISK = 'C:\lab\msdb.bak' WITH MOVE 'MSDBData' TO '备用服务器数据msdb数据文件', MOVE 'MSDBLog' TO '备用服务器数据msdb日志文件', REPLACE; ``` 这段代码将从指定的备份文件中恢复`msdb`数据库,并将数据文件和日志文件移动到新位置[^1]。 2. 确保在执行恢复操作之前停止SQL Server实例: ```cmd NET STOP MSSQLSERVER ``` 然后启动SQL Server实例以完成恢复过程[^2]。 #### 方法二:重新生成msdb数据库 如果没有可用的备份,可以通过以下步骤重新生成`msdb`数据库: 1. 停止SQL Server实例: ```cmd NET STOP MSSQLSERVER ``` 2. 删除损坏的`msdbdata.mdf`和`msdblog.ldf`文件。 3. 启动SQL Server实例时使用`/T3608`参数,该参数仅允许访问`master`数据库: ```cmd NET START MSSQLSERVER /f /T3608 ``` 4.SQL Server Management Studio (SSMS)中连接到`master`数据库,并运行以下命令重新生成`msdb`数据库: ```sql EXEC sp_msforeachdb 'DROP DATABASE ?' ``` 注意:此命令会删除所有非系统数据库,请谨慎操作。 5. 重启SQL Server实例以应用更改并重新生成`msdb`数据库。 #### 方法三:使用数据修复工具 如果上述方法无法解决问题,可以尝试使用第三方数据修复工具来修复损坏的`msdbdata.mdf`文件。这些工具通常能够扫描并修复损坏的数据库文件[^3]。 #### 方法四:手动重建msdb数据库 作为最后的手段,可以手动重建`msdb`数据库。具体步骤如下: 1. 停止SQL Server实例。 2. 删除现有的`msdbdata.mdf`和`msdblog.ldf`文件。 3. 启动SQL Server实例时使用`/T3608`参数。 4. 在SSMS中运行以下命令重新创建`msdb`数据库: ```sql CREATE DATABASE msdb ON PRIMARY ( NAME = MSDBData, FILENAME = '备用服务器数据msdb数据文件' ) LOG ON ( NAME = MSDBLog, FILENAME = '备用服务器数据msdb日志文件' ); ``` 确保指定正确的文件路径[^4]。 ### 注意事项 - 在执行任何恢复或修复操作之前,建议备份现有文件以防进一步的数据丢失。 - 如果可能,尽量从备份中恢复`msdb`数据库,因为这可以保留所有历史数据和配置信息。 - 如果需要手动重建`msdb`数据库,请确保了解其结构和功能,以免影响系统的正常运行。 ```sql -- 示例代码:检查数据库完整性 DBCC CHECKDB('msdb', REPAIR_ALLOW_DATA_LOSS); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值