我的数据库大小接近1.9Gb数据库,MSDE2000不允许超过2.0Gb的数据库
我需要缩小这个数据库(以及许多其他类似的客户端位置).
我发现并删除了许多被认为不需要的1000个记录中的100个:这些记录占数据库中一些主要(最大)表的很大比例.因此,假设现在可以检索的空间很大是合理的.
所以现在我需要缩小数据库以解决丢失的记录.
我执行DBCC ShrinkDatabase('MyDB')
......没有效果.
我已经尝试过MSSMS提供的各种收缩设施....仍然没有效果.
我已备份数据库并将其恢复...仍然无效.
仍然是1.9Gb
为什么?
无论我最终发现什么程序都需要在客户机上重放,只能访问OSql或类似的东西.
ALTER DATABASE MyDatabase SET RECOVERY SIMPLE GO DBCC SHRINKFILE (MyDatabase_Log, 5) GO ALTER DATABASE MyDatabase SET RECOVERY FULL GO
这可能看起来很奇怪,但它对我有用,我编写了一个C#程序来实现自动化.
步骤1:截断事务日志(仅备份事务日志,打开选项以删除非活动事务)
第2步:运行数据库收缩,将所有页面移动到文件的开头
步骤3:再次截断事务日志,因为步骤2添加了日志条目
第4步:再次运行数据库收缩.
我使用SQL DMO库的精简代码如下:
SQLDatabase.TransactionLog.Truncate(); SQLDatabase.Shrink(5, SQLDMO.SQLDMO_SHRINK_TYPE.SQLDMOShrink_NoTruncate); SQLDatabase.TransactionLog.Truncate(); SQLDatabase.Shrink(5, SQLDMO.SQLDMO_SHRINK_TYPE.SQLDMOShrink_Default);
这是一个老问题,但我刚刚发生了.
已经给出了真正简短且正确的答案,并获得了最多的选票.这是怎么你收缩事务日志,这很可能是有机磷农药的问题.当事务日志失去控制时,通常需要缩减,但应注意防止日志日益失控.关于dba.se的这个问题解释了这一点.基本上 - 通过适当的恢复模型,事务日志维护,事务管理等,首先不要让它变得那么大.
但是,在阅读关于缩小数据文件(甚至是日志文件)的问题时,我脑子里的更大问题是什么原因?而发生在你尝试了什么不好的事情?似乎收缩操作已经完成.现在在这种情况下它在某种意义上是有道理的 - 因为MSDE/Express版本的上限是最大数据库大小.但正确的答案可能是根据您的需求查看正确的版本.如果你偶然发现这个问题想缩小你的生产数据库并且这不是原因,你应该问问自己为什么?题.
我不希望有人在网上搜索"如何缩小数据库"并认为这是一个很酷或可接受的事情.
缩小数据文件是一项特殊任务,应该保留用于特殊场合.考虑到缩小数据库时,您实际上是在对索引进行分段.考虑到当你缩小数据库时,你正在夺走数据库有朝一日可能重新成长的可用空间 - 有效地浪费你的时间并引起收缩操作的性能损失,只是看到数据库再次增长.
我在几篇关于缩小数据库的博客文章中写过这个概念.首先想到这个名为" 不要触摸缩小按钮 "的内容.我谈到了这里概述的这些概念 - 还有"正确调整"数据库的概念.最好确定您的数据库大小需要什么,计划未来的增长并将其分配给该数量.使用SQL Server 2005及更高版本的数据文件中的即时文件初始化,增长成本较低 - 但我仍然希望有一个正确的初始应用程序 - 而且我对数据库中的空白区域的害怕远不如我一般没有先考虑就缩小了.:)
DBCC SHRINKDATABASE
适合我,但这是它的完整语法:
DBCC SHRINKDATABASE ( database_name, [target_percent], [truncate] )
target_percent
数据库收缩后,数据库文件中剩余的可用空间百分比在哪里.
和truncate
参数可以是:
NOTRUNCATE
使释放的文件空间保留在数据库文件中.如果未指定,则释放的文件空间将释放到操作系统.
TRUNCATEONLY
导致数据文件中任何未使用的空间释放到操作系统,并将文件缩小到最后分配的范围,从而减小文件大小而不移动任何数据.不尝试将行重定位到未分配的页面.使用TRUNCATEONLY时会忽略target_percent.
...并且是no_one是正确的,缩小数据库是不是很好的做法因为例如:
收缩数据文件是引入重要逻辑碎片的绝佳方法,因为它将页面从数据库文件的分配范围的末尾移动到文件前面的某个位置...
收缩数据库可以对数据库,服务器产生很大的影响....在你做之前想想很多!
在网上有很多关于它的博客和文章.
迟到的答案但可能对其他人有用
如果DBCC ShrinkDatabase/ShrinkFile或SSMS(任务/收缩/数据库)都没有帮助,Quest和ApexSQL的工具可以完成工作,甚至可以根据需要安排定期收缩.
我在前一段时间使用后一个免费试用版,通过本文末尾的简短描述:
https://solutioncenter.apexsql.com/sql-server-database-shrink-how-and-when-to-schedule-and-perform-shrinking-of-database-files/
您需要做的就是安装ApexSQL Backup,单击主功能区中的"Shrink database"按钮,在弹出的窗口中选择数据库,然后单击"完成".