导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

SQL2000 收缩数据库 为何没有效果

gengycn 2007-12-13 10:06:54
数据库文件43G,日志文件130M
先收缩了日志文件到500K
然后再收缩数据库后,数据库文件变成39G
但奇怪的是再向数据库中导入表的话
数据库文件就变回43G,日志文件也变回130M
请问是什么原因?
怎样才能正确收缩数据库?
谢谢!!
...全文
965 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rouqu 2007-12-13
要是磁盘快没空间了 可以分一部分数据出去
回复
andy84 2007-12-13
你可以先完全备份 再收缩
回复
rouqu 2007-12-13
39G和43G相差很多吗...你现在空间又是43G 不等于这里面已经写

膨胀是数据库本身的一个特点 你可以调低它的伸缩比例(如5%) 但是如果DML操作频繁 对性能是要大打折扣的
回复
gengycn 2007-12-13
那能否控制膨胀比例?
或者是否有其他方法解决??
回复
rouqu 2007-12-13
其实SQL2K里数据库默认设置就是按照10%比例膨胀(从操作系统申请空间分配)
回复
rouqu 2007-12-13
根据你对数据库设置的膨胀比率 如10% 当39G数据文件内部空间比较紧密 新的数据无法容纳的情况下 则它会从OS申请39G*10%的空间 这样加起来差不多43G
回复
gengycn 2007-12-13
1L:我有搜到,就是按那样做的也不行。
3L:是空间问题,而且删除多余表后数据库文件并不减小。
回复
rouqu 2007-12-13
压缩似乎没有问题 可以这样理解

■ ■■■■ ■■■■■■ ■■■■■ ■■■■■■■ 43G

■ ■■■■■■■■■■■■■■■■■■■■■■ 39G

■ ■■■■■■■■■■■■■■■■■■■■■■ ■ 43G
回复
w2jc 2007-12-13
收缩数据库的目的何在?
如果空间不是问题最好不要收缩,
否则应该考虑增加空间,而不是收缩...
回复
-狙击手- 2007-12-13
清除日志:


DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE szwzcheck -- 要操作的数据库名
SELECT @LogicalFileName = 'szwzcheck_Log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 20 -- 你想设定的日志文件的大小(M)
-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name =
@LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log')
DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF

把szwzcheck换成你数据库的名字即可,在查询分析器里面运行。
有全角的空格(为了显示好看),你自己把他换一下.


收缩日志:

企业管理器--所有任务--收缩数据库--文件--选日志文件收缩
回复
-狙击手- 2007-12-13
1: 删除LOG
1:分离数据库 企业管理器->服务器->数据库->右键->分离数据库
2:删除LOG文件
3:附加数据库 企业管理器->服务器->数据库->右键->附加数据库
此法生成新的LOG,大小只有500多K
再将此数据库设置自动收缩
或用代码:
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。

EXEC sp_detach_db @dbname = 'pubs'
EXEC sp_attach_single_file_db @dbname = 'pubs',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'


2:清空日志
DUMP TRANSACTION 库名 WITH NO_LOG

再:
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了

3: 果想以后不让它增长
企业管理器->服务器->数据库->属性->事务日志->将文件增长限制为2M



1、设置数据库为简单模式
-->数据库的属性
-->“选项”页
-->“模型”选为“简单”

2、截断日志,收缩数据库
backup log 数据库名 with no_log
go

dbcc shrinkdatabase(数据库名)
go
回复
rouqu 2007-12-13
收缩有效果 但不是每次都很明显 完全备份本身和收缩没有关系
回复
gengycn 2007-12-13
意思就是想先备份后收缩的
但是看到收缩没有效果,才没有完全备份的
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告