SQL Server 的mdf文件过大如何处理?现在为22G

yangjinhui 2008-06-25 09:15:02
我们学校上了一套OA系统,经过长时间的使用,SQL Server的mdf的文件总是突飞增长,达到了22G,不知道如何为什么,使用了很多方法都处理不了,造成的后果是现在查询速度过慢,有时候甚至不能打开文件,请问大家如何处理?急需解决?
...全文
1948 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxmcxm 2008-06-25
  • 打赏
  • 举报
回复
1.笨方法,升级系统!单硬盘转为硬盘阵列。
2.看能不能将数据库分为多个,旧的不常用的一个数据库,新的数据一个数据库,或一年一数据库。
3.重新创建数据库,将数据库分为多个文件组,不同的表放于不同的文件组中,分别存于不同的磁盘中。
hery2002 2008-06-25
  • 打赏
  • 举报
回复
一般造成mdf文件过大的原因是:
1.索引碎片过多,
2.频繁的数据库操作,如临时表/存储过程等的占用大量的空间,而没有及时释放.
3.异常状况下占用的数据库空间没有释放掉.....
hery2002 2008-06-25
  • 打赏
  • 举报
回复
1.磁盘整理,
2.数据库碎片整理,
3.重建数据库索引.
4.收缩数据库文件
5.收缩日志文件.
-------------
如果以上方式不行的话,
建议重建数据库.
hery2002 2008-06-25
  • 打赏
  • 举报
回复
查看一下是否的确有这么多数据.
OA系统有这么大的数据量么?
关注......
oh_my_god 2008-06-25
  • 打赏
  • 举报
回复
可能是数据量过大造成的,也可能是磁盘使用时间太长,产生的磁盘脆片太多造成的。先整理磁盘碎片,然后 dbcc checkdb 修复一下数据库看看
yangjiexi 2008-06-25
  • 打赏
  • 举报
回复

--数据量大确实是个头疼的问题,最近也在想办法,
--想到好的再告诉你了!呵呵!努力!
yangjinhui 2008-06-25
  • 打赏
  • 举报
回复
shrink什么意思
yangjinhui 2008-06-25
  • 打赏
  • 举报
回复
收缩已经试过了,没有管用,还有别的什么发吗
一品梅 2008-06-25
  • 打赏
  • 举报
回复
shrink一下下
nzperfect 2008-06-25
  • 打赏
  • 举报
回复
收缩一下试试
lff642 2008-06-25
  • 打赏
  • 举报
回复
会不会是数据量很大,造成的呢?
royal1 2008-06-25
  • 打赏
  • 举报
回复
如果收缩没用,你应该分析下表空间的使用情况,如下:

if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tablespaceinfo]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

create table tablespaceinfo --创建临时表
(nameinfo varchar(50) , --表名
rowsinfo int , --表中现有的行数
reserved varchar(20) , --表空间总量
datainfo varchar(20) , --表中数据的空间量
index_size varchar(20) , --表中索引使用的空间量
unused varchar(20) ) --表中未用的空间量

delete from tablespaceinfo

declare @tablename varchar(255)
declare @cmdsql varchar(500)

DECLARE Info_cursor CURSOR FOR
select name
from dbo.sysobjects where OBJECTPROPERTY(id, N'IsTable') = 1
and name not like N'#%%' order by name

OPEN Info_cursor

FETCH NEXT FROM Info_cursor
INTO @tablename

WHILE @@FETCH_STATUS = 0
BEGIN

if exists (select * from dbo.sysobjects where id = object_id(@tablename) and OBJECTPROPERTY(id, N'IsUserTable') = 1)
execute sp_executesql
N'insert into tablespaceinfo exec sp_spaceused @tbname',
N'@tbname varchar(255)',
@tbname = @tablename

FETCH NEXT FROM Info_cursor
INTO @tablename
END

CLOSE Info_cursor
DEALLOCATE Info_cursor
GO


--表空间信息
select *
from tablespaceinfo
order by cast(left(ltrim(rtrim(reserved)) , len(ltrim(rtrim(reserved)))-2) as int) desc
ChinaITOldMan 2008-06-25
  • 打赏
  • 举报
回复
用楼上的方法试一试
由于种种原因,我们如果当时仅仅备份了mdf文件,那么恢复起来就是一件很麻烦的事情了。   如果您的mdf文件是当前数据库产生的,那么很侥幸,也许你使用sp_attach_db或者sp_attach_single_file_db可以恢复数据库,但是会出现类似下面的提示信息   设备激活错误。物理文件名 ’C:\Program Files\Microsoft SQL Server\MSSQL\data\test_Log.LDF’ 可能有误。   已创建名为 ’C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.LDF’ 的新日志文件。   但是,如果您的数据库文件是从其他计算机上复制过来的,那么很不幸,也许上述办法就行不通了。你也许会得到类似下面的错误信息 服务器: 消息 1813,级别 16,状态 2,行 1   未能打开新数据库 ’test’。CREATE DATABASE 将终止。   设备激活错误。物理文件名 ’d:\test_log.LDF’ 可能有误。   应该怎么办呢?下面我们举例说明恢复办法。   A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL Server EntERPrise Manager里面建立。   B.停掉数据库服务器。   C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。   D.启动数据库服务器。此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。   E.设置数据库允许直接操作系统表。此操作可以在SQL Server Enterprise Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。   use master   go   sp_configure ’allow updates’,1   go   reconfigure with override   go   F.设置test为紧急修复模式   update sysdatabases set status=-32768 where dbid=DB_ID(’test’)   此时可以在SQL Server Enterprise Manager里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里面的表,但是仅仅有系统表   G.下面执行真正的恢复操作,重建数据库日志文件   dbcc rebuild_log(’test’,’C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf’)   执行过程中,如果遇到下列提示信息:   服务器: 消息 5030,级别 16,状态 1,行 1   未能排它地锁定数据库以执行该操作。   DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。   说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL Server Enterprise Manager打开了test库的系统表,那么退出SQL Server Enterprise Manager就可以了。   正确执行完成的提示应该类似于: 告: 数据库 ’test’ 的日志已重建。已失去事务的一致性。应运行 DBCC CHECKDB 以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。   DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。   此时打开在SQL Server Enterprise Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。   H.验证数据库一致性(可省略)   dbcc checkdb(’test’)   一般执行结果如下:   CHECKDB 发现了 0 个分配错误和 0 个一致性错误(在数据库 ’test’ 中)。   DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。   I.设置数据库为正常状态   sp_dboption ’test’,’dbo use only’,’false’   假如没有出错,现在你就可以正常的使用恢复后的数据库啦。   J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL Server Enterprise Manager里面恢复,也可以使用如下语句完成   sp_configure ’allow updates’,0   go   reconfigure with override   go
几天前在盒子看到绿色Sql server很高兴,现将本人对绿色SQL Server的现实思路作一说明,不正确的地方还请指教。1. Sqlservr.exe 运行参数。 Sql Server的启动可以为Windows服务方式(默认),也可以以应用程序方式启动。下面介绍sqlservr.exe以应用程序方式启动时的参数问题。sqlservr 应用程序用法:sqlservr [-sinstance_name] [-c] [-dmaster_path] [-f] [-eerror_log_path] [-lmaster_log_path] [-m] [-n] [-Ttrace#] [-v] [-x] [-g number] [-O] [-y number]-sinstance_name 指定要连接到的 SQL Server 实例。如果未指定命名实例,sqlservr 将启动 SQL Server 默认实例。重要 启动 SQL Server 实例时,必须从实例所在的适当目录使用 sqlservr 应用程序。对于默认实例,从 MSSQLBinn 目录运行 sqlservr。对于命名实例,在 MSSQL$instance_nameBinn 目录运行 sqlservr。-c 表示以独立于 Windows NT 服务控制管理器的方式启动 SQL Server 实例。当从命令提示符下启动 SQLServer 时,可使用该选项缩短启动 SQL Server 的时间。(注意:当使用该选项时,无法通过使用 SQLServer 服务管理器或 net stop 命令停止 SQL Server,而且如果已从 Microsoft Windows NT? 系统注销,则 SQL Server 将停止运行。)-dmaster_path指出 master 数据库文件的完全合法路径。在 -d 和 master_path 之间没有空格。-f以最小配置模式启动服务器。然后,系统管理员可对配置选项重新配置(使用 sp_configure 系统存储过程)。-eerror_log_path表示错误日志文件的完全合法路径。如果未指定路径,则默认实例的默认位置是 x:Program FilesMicrosoft SQL ServerMSSQLLogErrorlog,命名实例的默认位置是 x:Program FilesMicrosoft SQL ServerMSSQL$instance_nameLogErrorlog。在 -e 和 error_log_path 之间没有空格。-lmaster_log_path指示 master 数据库事务日志文件的完全合法路径。在 -l 和 master_log_path 之间没有空格。-m表示在单用户模式下启动 SQL Server 实例。如果 SQL Server 是以单用户模式启动的,则只能连接一个用户。CHECKPOINT 机制(它确保完成的事务定期从磁盘高速缓存写入数据库设备中)将不启动。(一般情况下,如果您遇到需要修复的系统数据库问题时,可使用此选项。)-n表示您不想使用 Windows NT 应用程序日志来记录 SQL Server 事件。如果用 -n 选项启动 SQL Server 实例,则最好也使用 -e 选项,否则将不会记录 SQL Server 事件。-Ttrace#表示应使用指定的有效跟踪标记 (trace#) 来启动 SQL Server 实例。跟踪标志用来启动具有非标准行为的服务器。有关可用跟踪标记 (trace#) 的更多信息,请参见跟踪标记。重要 当指定跟踪标志时,请使用 –T 来传递跟踪标志号。SQL Server 接受小写字母 t (-t);然而,-t 还设置 SQL Server 支持工程师所需的其它内部跟踪标记。-v显示服务器的版本号。-x禁用维护 CPU 统计。-g memory_to_reserve指定内存的兆字节整数,该内存被保留下来用于 SQL Server 2000 内部(进程内)运行的其它应用程序。-O指定不需要分布式 COM (DCOM),从而禁用异类查询。-y error_number如果 SQL Server 2000 遇到在该选项中指定的错误信息,它将把表象堆栈跟踪写入错误日志。可以使用多个 –y 参数指定多个错误。2. 系统数据库路径问题. 一般情况下,正常安装sql server之后,master等系统数据库的路径都是被设置为绝对路径,如果要改正数据库的路径为相对路径,可以使用以下SQl语句: sql:=format(' update sysaltfiles set filename='%s' where filename='%s' ', ['...data'+extractfilename(MDFFile),MDFFile]); ADOQuery1.Close; ADOQuery1.SQL.Text:=sql; ADOQuery1.ExecSQL; sql:=format(' update sysaltfiles set filename='%s' where filename='%s' ', ['...data'+extractfilename(LogFile),LogFile]); ADOQuery1.Close; ADOQuery1.SQL.Text:=sql; ADOQuery1.ExecSQL; sql:=Format('update sysdatabases set filename='%s' where name='%s'', ['...data'+extractfilename(MDFFile),Edit1.text]); ADOQuery1.Close; ADOQuery1.SQL.Text:=sql; ADOQuery1.ExecSQL;大家打开sysaltfiles 表和sysdatabases 一看就知道了,不多说了。除了系统数据库,其它的数据库也可以使用这种方法修改为相对路径。 使用相对路径的好处是可以让你的绿色Sql server随时copy到任意目录或是任意其它机器上启动,并且原来的数据库全部可以使用,如果是绝对路径到了其它机器就不行了。3. 注册表问题: 大家可以看下面的注册表文件Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$name][HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameMSSQLServer]"AuditLevel"=dword:00000000"DefaultLogin"="guest""ListenOn"=hex(7):53,00,53,00,4d,00,53,00,53,00,48,00,37,00,30,00,00,00,53,00, 53,00,4e,00,45,00,54,00,4c,00,49,00,42,00,00,00,00,00"LoginMode"=dword:00000000"Map_"="""Map#"="-""Map$"="""SetHostName"=dword:00000000"Tapeloadwaittime"=dword:ffffffff"uptime_pid"=dword:00001044"uptime_time_utc"=hex:26,57,c8,b3,fb,bb,c5,01[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameMSSQLServerCurrentVersion]"CurrentVersion"="8.00.194""RegisteredOwner"="""SerialNumber"="""CSDVersionNumber"=dword:00000300"CSDVersion"="8.00.761""Language"=dword:00000804"checksum"=hex:37,35,32,32,63,31,35,38,61,65,37,64,34,63,64,37,35,30,64,61,30, 33,34,62,37,64,63,32,30,61,36,36,39,37,62,34,61,35,65,36,63,66,62,61,38,37, 39,36,37,31,66,33,39,61,36,65,35,64,30,33,37,36,37,65,64,36,33,30,61,39,63, 36,66,37,36,30,35,65,32,66,34,66,31,33,63,39,33,63,34,66,62,66,34,66,64,38, 64,65,36,64,35,34,37,33,35,39,35,32,36,63,61,32,36,63,33,32,64,34,36,33,65, 36,39,34,30,65,61,37,64,35,30,61,66,34,64,32,66,38,37,36,30,61,39,64,30,61, 32,36,64,65,66,66,00[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameMSSQLServerParameters][HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameMSSQLServerSuperSocketNetLib]"ProtocolList"=hex(7):74,00,63,00,70,00,00,00,6e,00,70,00,00,00,00,00[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameMSSQLServerSuperSocketNetLibNp]"PipeName"="\.pipeMSSQL$$namesqlquery"[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameMSSQLServerSuperSocketNetLibTcp]"TcpHideFlag"=dword:00000000"TcpDynamicPorts"="$port""TcpPort"="$port"[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL Server$nameSetup]"FeatureName"="SqlRun""FirstStart"=dword:00000000"ProductCode"="{E09B48B5-E141-427A-AB0C-D3605127224A}""SQLDataRoot"="$path""SQLPath"="$path"这是注册一个Sql Server实例所要使用的注册表,把里面的$name,$path,$port替换成你定义的实例名,当前程序所有路径,监听端口,然后导入注册表就可以了。4. 启动Sql Server iPath:=ExtractFilePath(Application.ExeName); CommandLine:=PChar(iPath+'binnsqlservr.exe -d...datamaster.mdf -l...datamastlog.ldf -e...Loglog.txt+Edit1.Text); CreateProcess( nil, CommandLine, nil, nil, true, CREATE_NO_WINDOW, nil, PChar(iPath+'binn'), StartupInfo, ProcessInformation )也可以直接写个.bat运行就ok了.5. 启动日志问题。 这个问题最简单,因为在执行sqlservr.exe时指定的有log文件,你只用用个定时器(50ms)读文件,就可以在程序中显示出来启动日志了,呵呵,这只是个思想,具体的自已想办法吧. 6. 停止服务 用CreateProcess可以得到进程ID,TerminateProcess就关了sql server进程,服务就停了,简单吧。根据上面的6个步骤,你就可以自已搞定一个绿色的Sql Server了.并且你可以根据不同的sql server版本,整理出所有版本的绿色sql server。绿色 sql server 企业版绿色 sql server 个人版绿色 MSDE... ...这样以后遇到什么操作系统都全部搞定。 最后说一句,只要你能把几个Sql server版本的数据整理好(主要是系统数据库的路径问题(好像现在盒子已经有绿色企业版的文件了),DLL全部copy就OK了),都可以使用我的管理工具进行管理,呵呵,当然你也可以作出自已的管理器。我的管理器,主要是为了我自已用,大家如果用着可以,请多提意见。由于sql server数据太大,并且盒子上已经有了,这次只上传了exe和目录结构。不知道说的是否正确,如果还有什么问题,我们一起交流. Email: 11826088@163.com
实验一 大型数据库的基本操作 一、实验目的 1. 熟悉大型数据库实验环境,以MS SQL SERVER为例。 2. 掌握MS SQL SERVER的企业管理器的用法。 3. 能够根据给定的设计要求,设计数据库和数据库表结构。 4. 能够使用MS SQL SERVER的企业管理器完成数据库创建和表创建等操作。 5. 能够往表中添加数据记录。 二、实验内容 (1)创建数据库 1. 数据库名字为:abc; 2. 此数据库包含两个数据文件,其中主数据文件的逻辑文件名为:Data1,物理文件名为Data1_data.mdf,初始大小为3MB,存放在新建目录下,增长方式为自动增长,每次增加1MB,最多增长到10MB。辅助数据文件的逻辑文件名为:Data2,物理文件名为Data2_data.ndf,初始大小为2MB,同主数据文件存放在相同的位置,不自动增长。 3. 日志文件的逻辑文件名为:log1,物理文件名为log1_log.ldf,初始大小为2MB,同主数据文件存放在相同的位置,增长方式为自动增长,每次增加15%。 (2) 创建表 为描述销售人员对产品的销售情况,定义了三张表:销售人员表、产品表和销售情况表,分别用于描述销售人员的基本信息、产品的基本信息和销售人员与产品之间的销售情况。写出在 “abc”数据库中定义这三张表的语句并创建这三张表,(请将语句以文件形式保存下来,文件名为“考生名.sql”,存放在新建的目录下。可以将下述所有的SQL语句均保存到此文件中,在文件中要注明题号),三张表的结构为: 注:括号中为表名和列名的拼音表示,建表时用拼音表示表名和列名即可。 1. 销售人员表(XSRYB)包括如下字段: 职工号(ZGH):普通编码定长字符型,6位长,主码 姓名(XM):普通编码定长字符型,10位长,非空 年龄(NL):整型,取值范围为20 ~ 60,允许空 地区(DQ):普通编码可变长字符型,10位长,允许空 邮政编码(YZhBM):普通编码定长字符型,6位长,每一位必须是数字,允许空 2. 产品表(CPB)包括如下字段: 产品号(CPH):普通编码定长字符型,6位长,主码 产品名(CPM):普通编码可变长字符型,20位长,非空 生产厂家(SCCJ):普通编码定长字符型,10位长,非空 价格(JG):整型,大于0,允许空 生产日期(SCRQ): 小日期时间型(SmallDatetime),允许空,默认为系统当前日期 3. 销售情况表(XSQKB)包括如下字段: 职工号(ZGH):普通编码定长字符型,6位长,非空 产品号(CPH):普通编码定长字符型,6位长,非空 销售日期(XSRQ):小日期时间型,非空 销售数量(XSSL):整型,允许空 其中:(职工号,产品号,销售日期)为主码 职工号为引用销售人员表的外码,产品号为引用产品表的外码。 (3) 在表中加入数据 销售人员表 '职工号','姓名','年龄','地区','邮政编码' 'G01','人员1',25,'北京','100101' 'G02','人员2',45,'北京','100108' 'G03','人员3',30,'天津','200211' 'G04','人员4',42,'天津','200322' 'G05','人员5',50,'南京','123456' 'G06','人员6',38,'上海','300310' 'G07','人员7',28,'上海','300123' 'G08','人员8',55,'上海','300456' 产品表 产品号 产品名 生产厂家 价格 生产日期 P02 电冰箱 北京 4800 2002/2/14 P03 计算机 北京 7900 2001/11/1 P04 音响 上海 4000 2001/4/6 P05 空调 上海 3800 2001/10/11 P06 洗衣机 青岛 3100 2001/9/18 P07 笔记本 北京 11230 2001/8/30 P08 微波炉 天津 1980 2002/1/20 销售情况表 职工号 产品号 销售日期 销售数量 G03 P04 2001/11/20 16 G03 P05 2001/11/20 2 G05 P02 2002/5/2 1 G06 P07 2001/12/4 5 G06 P08 2002/4/4 10 G03 P02 2002/6/5 4 G08 P02 2001/12/5 1 三、附加题(可以不做) (1)在“表中加入数据”的过程,可否采用导入的方法,而不是手工输入?(提示:将数据拷贝到Excel或者Txt文件,通过MS SQL Server提供的导入功能) (2)可否把完成的abc数据库进行备份?然后在另外一台数据库服务器上进行还原?(提示:MS SQL Server企业管理器提供数据库的备份和还原功能)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧