压缩数据库日志(sql server数据库)

waterxcfg304 2008-07-24 05:12:22
如何在不分离数据库的情况下,压缩数据库日志(sql server数据库)有的日志能达到20G,我用了如下的方法压缩数据库
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT


USE SVW20053 -- 要操作的数据库名
SELECT @LogicalFileName = 'SVW_log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 1 -- 你想设定的日志文件的大小(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 has not expired
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
但是有的数据库是没有办法压缩的,有的是可以的,求助有没有什么好的方法,急用!
...全文
589 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChinaJiaBing 2008-07-28
  • 打赏
  • 举报
回复

dbcc shrinkfile
bwu851 2008-07-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 farmer_in_city 的回复:]
-- 为什么总有人拿
“--1.清空日志
exec('DUMP TRANSACTION ['+@dbname+'] WITH NO_LOG')


来误导他人?
[/Quote]

到也不是误导, 就是为什么让别人重复做一遍backup log?? 而且还多次重复的告诉别人(特别是新手). MICROSOFT多次说了, dump transaction以后就不会出现了. 可还是有人要叫别人记住......
bwu851 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bwu851 的回复:]

DUMP TRANSACTION Northwind WITH NO_LOG

BACKUP TRANSACTION Northwind WITH NO_LOG

[/Quote]

sorry, 应该是:

DUMP TRANSACTION Northwind WITH NO_LOG

BACKUP LOG Northwind WITH NO_LOG


诚心请教
bwu851 2008-07-25
  • 打赏
  • 举报
回复
实在看不下去了.

楼上几位, 谁能跟偶说说下面的两句有什么区别?

DUMP TRANSACTION Northwind WITH NO_LOG

BACKUP TRANSACTION Northwind WITH NO_LOG


诚心请教.
farmer_in_city 2008-07-25
  • 打赏
  • 举报
回复


--3.收缩数据库文件(如果不压缩,数据库的文件不会减小
exec('DBCC SHRINKDATABASE(['+@dbname+'])')


要缩小数据库日志,上面的方法显然是有问题的,它是收缩数据库。
要想最大限度的减小日志文件大小。
要用到 DBCC SHRINKFILE

dbcc shrinkfile(file_name, 你希望的日志文件大小MB)
dbcc shrinkfile(log_file_name, 100) -- 收缩日志文件到 100MB

或者
dbcc shrinkfile(log_file_name, 0) -- 收缩到最小程度。

更加详细的, dbcc shrinkfile 可以看 sql server 帮助。
farmer_in_city 2008-07-25
  • 打赏
  • 举报
回复
如果,想要确保备份数据库库或者日志前,把内存中的脏页写回磁盘, 可以运行。

checkpoint

指令来实现。
farmer_in_city 2008-07-25
  • 打赏
  • 举报
回复
--1.清空日志
exec('DUMP TRANSACTION ['+@dbname+'] WITH NO_LOG')
--2.截断事务日志:
exec('BACKUP LOG ['+@dbname+'] WITH NO_LOG')
--3.收缩数据库文件(如果不压缩,数据库的文件不会减小
exec('DBCC SHRINKDATABASE(['+@dbname+'])')
------------------------------------------------------

有问题吧。


--
sql 联机手册,明明说: dump transaction == backup log ..

The DUMP DATABASE and DUMP TRANSACTION statements are synonymous(同义的) with
BACKUP DATABASE and BACKUP LOG statements.

Support for the DUMP DATABASE and DUMP TRANSACTION statements may be removed in a future release.

Consider removing all references of DUMP DATABASE and replacing with references
to BACKUP DATABASE.

Consider removing all references of DUMP TRANSACTION and replacing with references to BACKUP LOG.


-- 为什么总有人拿
“--1.清空日志
exec('DUMP TRANSACTION ['+@dbname+'] WITH NO_LOG')


来误导他人?
lao_bulls 2008-07-24
  • 打赏
  • 举报
回复
学习一下。
waterxcfg304 2008-07-24
  • 打赏
  • 举报
回复
我是要用SQL 语句来压缩数据库,我要直接在查询分析器中用SQL 语句来压缩数据库日志到我要的大小.
exec('DUMP TRANSACTION ['+@dbname+'] WITH NO_LOG')
--2.截断事务日志:
exec('BACKUP LOG ['+@dbname+'] WITH NO_LOG')
--3.收缩数据库文件(如果不压缩,数据库的文件不会减小
exec('DBCC SHRINKDATABASE(['+@dbname+'])')
上面的方法并不能对所有的数据库都有效的.
-狙击手- 2008-07-24
  • 打赏
  • 举报
回复
要先清空日志再截断事务日志看看
liangCK 2008-07-24
  • 打赏
  • 举报
回复
1、用BACKUP LOG database WITH NO_LOG清除日志
把数据库属性中的故障还原模型改为“简单”可以大大减慢日志增长的速度。
如果把还原模型调到简单,这样就不支持时间点还原了,但是日志文件会很小,如果数据比较重要推荐还是把数据库的还原模型调为完全
用BACKUP LOG database WITH NO_LOG命名后,会截断不活动日志,不减小物理日志文件的大小,但逻辑日志会减小,收缩数据库后会把不活动虚拟日志删除来释放空间,不会损坏数据。
如果日志被截断并收缩数据库后,就不能直接用最近的一个全库备份做时间点还原,建议立即备份数据库,以防万一。
2、sql server运行中,是否能删除主数据库事务日志文件
步骤如下:(1)、分离数据库企业管理器--数据库--右击你要删除日志的数据库--所有
任务--分离数据库
(2)、然后删除日志文件
(3)、然后再附加数据库
企业管理器--数据库--右击数据库--所有任务--附加数据库这时候只附加。mdf就可以了。
3、压缩SQL数据库及日志的详细方法
SQL Server 2000基础教程——压缩数据库数据库在使用一段时间后,时常会出现因数据删除而造成数据库中空闲空间太多的情况,这时就需要减少分配给数据库文件和事务日志文件的磁盘空间,以免浪费磁盘空间。当数据库中没有数据时,可以修改数据库文件属性直接改变其占用空间,但当数据库中有数据时,这样做会破坏数据库中的数据,因此需要使用压缩的方式来缩减数据库空间。可以在数据库属性选项中选择“Auto shrink”选项,让系统自动压缩数据库,也可以用人工的方法来压缩。人工压缩数据库有以下两种方式:
1、用Enterprise Manager 压缩数据库
在Enterprise Manager 中在所要压缩的数据库上单击右键,从快捷菜单中的“所有任务(All Tasks)”中选择“Shrink Database(压缩数据库)”选项,就会出现如图6-10 所示的对话框。可以在图6-10 所示的对话框中选择数据库的压缩方式,也可以选择使用压缩计划或压缩单个文件单击图6-10 中的“Files”按钮,会出现如图6-11 所示的压缩数据库文件对话框,可以针对每个数据库文件进行不同的压缩设置。

单击图6-10 中的“Change” 按钮,会出现如图6-12 所示的压缩计划编辑对话框,可以指定压缩计划的执行方式。单击图6-12 中的“Change” 按钮,会出现如图6-13 所示的循环工作计划编辑对话框,可以编辑计划执行的周期或时间点。设置完成后单击“OK” 按钮就开始压缩数据库,在压缩结束后会显示一个压缩情况信息框。


2、用Transact-SQL 命令压缩数据库
可以使用DBCC SHRINKDATABASE 和DBCC SHRINKFILE 命令来压缩数据库。其中DBCC SHRINKDATABASE 命令对数据库进行压缩,DBCC SHRINKFILE 命令对数据库中指定的文件进行压缩。
(1) DBCC SHRINKDATABASE
DBCC SHRINKDATABASE 命令语法如下:
DBCC SHRINKDATABASE (database_name [, target_percent]
[, {NOTRUNCATE | TRUNCATEONLY}] )
各参数说明如下:
·target_percent 指定将数据库压缩后,未使用的空间占数据库大小的百分之几。如果指定的百分比过大,超过了压缩前未使用空间所占的比例,则数据库不会被压缩。并且压缩后的数据库不能比数据库初始设定的容量小。
·NOTRUECATE
将数据库缩减后剩余的空间保留在数据库,中不返还给操作系统
。如果不选择此选项,则剩余的空间返还给操作系统。
·TRUNCATEONLY
将数据库缩减后剩余的空间返还给操作系统。使用此命令时SQL Server 将文件缩减到最后一个文件分配,区域但不移动任何数据文件。选择此项后,target_percent 选项就无效了。例6-14: 压缩数据库mytest 的未使用空间为数据库大小的20%

dbcc shrinkdatabase (mytest, 20)
运行结果如下:
DBCC execution completed. If DBCC printed error
messages, contact your system administrator.
(2) DBCC SHRINKFILE
DBCC SHRINKFILE 命令压缩当前数据库中的文件。其语法如下:
DBCC SHRINKFILE ( {file_name | file_id }
{ [, target_size] |
[, {EMPTYFILE | NOTRUNCATE | TRUNCATEONLY}] } )
各参数说明如下:
·file_id
指定要压缩的文件的鉴别号(Identification number, 即ID)
。文件的ID 号可以通过 FILE_ID()函数或如本章前面所讲述
的Sp_helpdb 系统存储过程来得到。
·target_size
指定文件压缩后的大小。以MB 为单位。如果不指定此选项,SQL Server 就会尽最大可能地缩减文件。
·EMPTYFILE
指明此文件不再使用,将移动所有在此文件中的数据到同一文件组中的其它文件中去。执行带此参数的命令后,此文件就可以用ALTER DATABASE 命令来删除了。 其余参数NOTRUNCATE 和TRUNCATEONLY 与DBCC SHRINKDATABASE
命令中的含义相同。 例6-15: 压缩数据库mydb 中的数据库文件mydb_data2 的大小到1MB。 use mydb dbcc shrinkfile (mydb_data2, 1)


企业管理器里面的方法:
1、打开企业管理器
2、打开要处理的数据库
3、点击最上面菜单>工具>SQL查询分析器,打开SQL查询分析器
4、在输入窗口里面输入:
Code:
DUMP TRANSACTION [数据库名] WITH NO_LOG
BACKUP LOG [数据库名] WITH NO_LOG
DBCC SHRINKDATABASE([数据库名])

点击绿色的小三角(或按F5)执行查询,等状态栏提示处理完成
即可!

程序里面的方法:
压缩数据库日志
--1.清空日志
exec('DUMP TRANSACTION ['+@dbname+'] WITH NO_LOG')
--2.截断事务日志:
exec('BACKUP LOG ['+@dbname+'] WITH NO_LOG')
--3.收缩数据库文件(如果不压缩,数据库的文件不会减小
exec('DBCC SHRINKDATABASE(['+@dbname+'])')

  4、减小日志的方法:
一、用如下步做了:
1、DUMP TRANSACTION 庫名 WITH no_log
2、dbcc shrinkfile(logfilename)
3、收縮數據庫
4、設定自動收縮。
  二、分离数据库,删除日志文件,再附加,OK!右击数据库--所有任务--分离or 附加
  三、1、backup log 庫名 WITH no_log,2、dbcc shrinkfile(logfilename),3、收縮數據庫
4、設定自動收縮。

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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