找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3892|回复: 0

关于数据库的ldf和mdf文件变得超大解决办法

[复制链接]
发表于 2009-9-16 00:32:35 | 显示全部楼层 |阅读模式
压缩日志及数据库文件大小   
! g1 F8 i$ z. F& o
. b: k0 [5 Y' B/ a6 @9 M+ g' N0 i3 o5 i

7 @- a& [  _. |( t! O* |5 d  --下面的所有库名都指你要处理的数据库的库名   
8 i/ Z# `9 y; ?% `' d7 E
' E* x; ?& U! T1 W) Q  1.清空日志   9 {. J1 q  `: H6 `0 k* r
  DUMP     TRANSACTION     库名     WITH     NO_LOG           % P; I4 e" M: S5 K" g* g9 Y
5 j8 u, M, Z, F/ {" Y6 o" X
  2.截断事务日志:   
* D' @! H6 a  U% R6 b  BACKUP   LOG   库名   WITH   NO_LOG   1 F) a* T6 A& o+ Y

( ~) |! S1 e. d8 n  3.收缩数据库文件(如果不压缩,数据库的文件不会减小   
' V$ U, f5 o, O7 H4 }  企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件   
6 |9 Y$ U3 ^3 x6 _- k  --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   
, ], _3 S5 `" K6 q, z3 v( k  --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   9 b" Q& D% p9 U1 v1 ]7 z
8 q( I0 v: Q1 U& f% [' b8 _, ^, `
  也可以用SQL语句来完成   
4 G  N1 j1 _+ o/ J# [0 f9 |2 n" T1 z  --收缩数据库   " g& o: O5 a/ e# m
  DBCC   SHRINKDATABASE(库名)   - S7 X: _- k6 g/ K

; o" K# i  C  J  --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select   *   from   sysfiles   : m& _2 E( \* F4 I1 y5 Z% P
  DBCC   SHRINKFILE(1)   + I: i: _3 ?4 s- `$ Z

* @* X' G' l% c4 F2 p+ y9 e$ \  4.为了最大化的缩小日志文件(如果是sql   7.0,这步只能在查询分析器中进行)   
. f, r+ L3 W" a/ f4 n; D7 s  a.分离数据库:   6 d, M( X! L  ^5 p+ A5 f' i
  企业管理器--服务器--数据库--右键--分离数据库   
; z6 R+ N' C2 t) ?: W! R
2 I% A+ `" m4 k3 U+ A! z  b.在我的电脑中删除LOG文件   
0 h' x. ~0 j# `( b" o
* [7 m& a0 t! F' Y( C  c.附加数据库:   
- f* i( d2 F. c4 ?9 F  企业管理器--服务器--数据库--右键--附加数据库   3 P$ P* |0 U. R* O
# h* y- x, b* v- b, g# M
  此法将生成新的LOG,大小只有500多K   0 }8 B$ ?  T5 A  r0 }4 s

! L  @4 @) q/ ?  或用代码:     
1 {; v8 T) k8 ~4 G3 F. U  下面的示例分离   pubs,然后将   pubs   中的一个文件附加到当前服务器。   ! U+ n4 ^7 Y$ y/ R$ g

0 f7 k1 N/ \! r7 }8 C4 o" M  a.分离   ! G, K! y* f/ J4 e( b$ @
  EXEC   sp_detach_db   @dbname   =   '库名'   
  g0 g2 `/ U5 v! O% X0 `+ f, I+ X5 U
  b.删除日志文件   # n- J4 V/ i# d; T( S
- [0 w; R# Q% Z  m
  c.再附加   # i+ _) M6 v3 P$ U
  EXEC   sp_attach_single_file_db   @dbname   =   '库名',     
# _3 H5 w: ~* K6 L- C( i: L" P0 n        @physname   =   'crogram   FilesMicrosoft   SQL   ServerMSSQLData库名.mdf'   
/ i4 P7 Q, _1 ^& ^- s4 G3 C# H' q5 N# Y2 o$ D( Z0 S1 `
  5.为了以后能自动收缩,做如下设置:   
8 P$ q. X5 p! f  企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"   
  Q7 c9 O7 W, ~# m; Z: x1 ^
6 K5 d2 B+ W8 \9 `7 z: a  --SQL语句设置方式:   , r" Y; B# O6 z9 H
  EXEC   sp_dboption   '库名',   'autoshrink',   'TRUE'   
& ^" }/ O$ G& ^* I, B( z( {
7 W1 f+ t+ t- }0 A+ }! T" r* L  6.如果想以后不让它日志增长得太大   9 r! b6 W; o, B# p0 N- S
  企业管理器--服务器--右键数据库--属性--事务日志   4 G- q( ~3 U2 `/ z  Q3 Z
  --将文件增长限制为xM(x是你允许的最大数据文件大小)   
! H6 Y) ?9 {0 }# A1 i8 h6 D4 r+ k8 C
! \' \6 n3 W3 b5 O  c  --SQL语句的设置方式:   ; {# |! O4 x6 [7 ?$ [
  alter   database   库名   modify   file(name=逻辑文件名,maxsize=20)   
2 L5 R4 J! e2 |3 W8 [5 c7 G  ---------------------------------------------------------------------2 u' @+ w/ p7 Y6 z
SQL Server 控制Ldf文件的大小(清理历史记录 &设定自动缩小) * Y. w- T! l) @2 M/ r- r; f+ S4 G6 K1 F

& X/ S% g8 s- o. L*清理历史记录 $ |" I- c: E0 _; y6 E6 N
1. 在SQL Server Enterprice Manager(企业管理器)工具列---进入 SQL Query Analyzer(SQL查询分析器)
% N+ Y4 g% X7 o+ c2. 输入BACKUP LOG <你的数据库名称> WITH TRUNCATE_ONLY # t, T* _( z$ [5 I) `
如: BACKUP LOG myXXDB WITH TRUNCATE_ONLY 5 D# \  W( t/ \# p& r' ~  j3 |

$ q( d& n9 ]$ A- u2. 回SQL Server Enterprice Manager, 在该数据库上按右键选[所有工作/压缩数据库],
8 \; g2 Q% H: c点[文件], 在数据库文件选择该 Log文件, 在[压缩动作]选择[将文件压缩为X MB (最小值为Y MB)], 0 Y# Q, ~% @) ]9 [- p& P, i" H
直接将x改成其建议其最小值y按[确定]即可压缩. : K2 }' }- ~+ P5 O' Z" s
先不要离开,再点一次[文件]看看压了多少, 会发现还可以再压, 还会变更小哟! 可以压两三次. ( a# }3 ^' j& G; K7 S7 s

, ?8 ]1 ~* |' G总结:其实也就是两个指令就可以完成了
4 }; o1 H0 p: g- tBACKUP LOG DateBaseName WITH TRUNCATE_ONLY ) T' m4 E4 f, a. D+ u8 h+ X; l
DBCC ShrinkDatabase(DateBaseName) 2 n0 Z5 O3 w3 j, f
6 V4 H$ f; X$ g8 T1 j/ `* S) I
*设定数据库自动缩小, 默认值为OFF   h* f' c, b! d9 P/ _* W% T$ G
方法1.
  u$ p  ^0 ~6 ^7 B* LALTER DATABASE <你的数据库名称> SET AUTO_SHRINK ON
; |8 D6 M, q# u& x如: ALTER DATABASE myXXDB SET AUTO_SHRINK ON
& \3 E( X% o' o3 _5 Z8 Z% ?# j; L5 k方法2.
1 e; l2 m. c  v; |& Z  i在数据库上按右键选内容(要等一下下), 点[选项]页, 勾选[自动压缩]后按确定
# Y9 F; `% j( K8 o8 `' z2 D* J; w/ V" C% @* g

( z# Y0 j4 [, p0 q$ Q0 I! a SQL SERVER日志清除的两种方法 5 F7 I* e9 f9 N; \
  在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法…… # r" Y* [4 Z% |9 ^% Q! a
' h2 e( f. ~8 Z
  方法一
! Y5 I3 b% }' }4 W% v, i% g' X" d/ g$ n" |
  一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大 ( X- q6 u# N5 O0 L9 @8 c
& ^( R8 E: N' Y& Z8 j& P1 U
  1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存。 7 Q3 o' W; V' i9 }7 z

7 P( H; {. R0 L  2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定。 7 e- d( o: U2 t' N- [' Q1 X
: X/ [# c- z3 p5 {: u
  3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据 3 m" h9 g3 H4 ]: O" v
1 d9 _* I7 p* X- Y" A0 ]0 u
* g) U. F0 ]8 o) p5 C" x/ F
6 k5 _: b. E1 k1 I
* x5 ~$ w/ |! K- U7 I6 T4 b* r
SQLSERVER中讲: 6 b6 E; H" G) y1 C) P; c! i2 Z) K" S
# I0 ^, b4 a/ {4 t) f2 a, |& W$ R
BACKUP LOG 数据库名 WITH NO_LOG|TRUNCATE_ONLY可以截断事务日志。 3 d7 x% T6 P; H! j) @) R
( d2 z5 D. W) M% Q
但我在数据库中进行上述操作后,事务日志还是没有改变。 & T: X% d+ l. A  A2 k' {! F
0 D! M; i- v8 [4 W
; ~, B3 |! ~; E$ H3 I
第一步只是将非活动的事务日志截断,并没有收缩数据库,只有进行第二项操作后,数据库才进行事务日志的清理工作,将截断的非活动事务删除,并将事务日志文件收缩到适当尺寸。
2 ~7 L1 H/ K, S1 O# \5 h2 t7 I在使用 SQL Server 时,数据库里的日志文件会越来越大,需要把它删除。 我先把这个数据库分离,在数据库上点右键 -> 所有任务 -> 分离数据库,分离之后,就可以把 Log 文件删除,同时也可以把数据进行备份。之后,就可以在所有任务里的附加数据库再把那个数据库添进来,SQL Server 会提示 LOG 文件不存在,问你是不是要新建一个,选是就行了,这样,LOG 文件就清空了。 这个方法只需几分钟的时间,但在这几分钟里,就不能访问这个数据库了,我觉得只适用于小型的应用,对于大型的系统就要找其它方法了。
0 j8 b) \3 m+ c% X2 D* I' Y
) f# m, y- z4 ?! p8 V. R$ p% F1 n) K( Z2 S
老马嗖嗖 2007-04-30 13:03 - G5 ^1 J* {$ G
SQL Server 2000中*.LDF文件是什么作用
2 A7 J$ |4 M- g1 H) w# e: g- ^  A8 Q% a* e9 B- ^. L$ s
*.mdf是数据文件   ! t% i# {3 e8 ~  l$ G! ]1 A
*.ldf是日志文件   7 x# P/ z+ }# e# ?& ?, v3 s
当数据库出现问题时   & b+ a! B, h  B( c
可用以下语句恢复   / }9 e# V. j6 C3 \, h) w$ k7 l
数据恢复一   2 d- Z) G4 P3 G- V0 ~6 A. y# Q
1. 先分离数据库   ; S" V' I) Y0 f3 b$ l, ?+ V" D
exec   sp_detach_db   dbname   
! C$ U9 [5 T4 T2 a/ e# P2. 加上数据库   : T8 B, k, g7 y2 s& u
exec   sp_attach_db   @dbname=’dbname’,@filename1=’d:sql   server...dbname.mdf’,@filename2=’d;sql   server...dbname_log.ldf’   - J8 }8 N4 w2 R; ]
) s) j9 Y  W' q

* |3 c. P% F& }& U3 c" d老马嗖嗖 2007-04-30 13:04
3 p# E% N% i5 D4 D
$ t1 A1 W# d/ Y- v1 M8 N) ~+ p) e$ C% m" Y' C0 B
1.清空日志 # D  z$ v3 L7 I/ x8 p: w. \  Y
DUMP TRANSACTION 库名 WITH NO_LOG
! X7 m$ c6 G7 K5 }1 G
) ]3 @( Z5 \3 k2.截断事务日志: 2 U/ O7 X$ N5 D' Z+ @; V
BACKUP LOG 数据库名 WITH NO_LOG
/ ^' d; B5 ?! C" q: `0 D
) y8 {% b* w' w2 e- \4 \# }3.收缩数据库文件(如果不压缩,数据库的文件不会减小 : a; V& o3 C7 @
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
! _: |4 l6 I. {& Z5 z+ C# z--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
: B, @: ]& P+ ?7 o" X7 D--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 : u! F2 y9 Q8 S1 r

, r6 \5 o8 b4 e6 L5 d( R( f也可以用SQL语句来完成
$ `- X+ ]7 H' C8 `6 Z7 W! B--收缩数据库
5 R& d9 Q, B8 e9 I$ ?, U: EDBCC SHRINKDATABASE(客户资料) 2 K& e8 ^2 t& j+ I
# S) D# M  I4 I
--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles $ h+ k7 f) [. T- j- ~; {! `6 F
DBCC SHRINKFILE(1) ' B% }1 d% f6 b9 w" K" o
9 y, B# W8 d; S
4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行) / t- J% j' ~; n
a.分离数据库: ; s% `+ q9 C7 O$ T8 x9 V& K
企业管理器--服务器--数据库--右键--分离数据库 4 t5 S- F; D  Q' }
. }9 @, ]% j1 z$ V
b.在我的电脑中删除LOG文件 % ]. t4 {- M7 b% w. P2 |( ^/ j2 g2 A
" {& v% i4 Z& E! u. I
c.附加数据库: . c8 ]+ @) l0 h6 c5 \* Y
企业管理器--服务器--数据库--右键--附加数据库 / G/ p/ l9 G1 C- K

( P/ h# L" m6 A" F0 r: b此法将生成新的LOG,大小只有500多K - V5 n. b. ^5 r( \* _1 ~
* Y2 m" R# a& Y0 \5 e
或用代码: 7 d/ r% C; [% z5 F' ~# M
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
# o$ N7 K; @/ h6 q9 E8 p
0 K) D3 e' ~5 J4 t! K2 ra.分离 5 G: d- F$ V. D
EXEC sp_detach_db @dbname = 'pubs'
4 [8 g( M- G( \  Z9 t" b! w9 |3 \7 _, F4 @2 W1 x4 Q
b.删除日志文件
; }1 I) K* A2 t
3 A/ |3 [/ V4 P: ^2 v& a+ u3 V: Oc.再附加 ; E9 N! r3 s6 i* l
EXEC sp_attach_single_file_db @dbname = 'pubs',
( u6 ?% D' ?' B+ C( R$ P@physname = 'crogram FilesMicrosoft SQL ServerMSSQLDatapubs.mdf' 4 V3 y! E0 D. c) ]
$ A! h9 Z! e5 q  C/ I  A
5.为了以后能自动收缩,做如下设置:
9 V6 S- M8 f) F% g9 j; j企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩" : R5 V& `! v7 J

  }0 g& g' e6 I1 t) ~" s--SQL语句设置方式: 7 Z4 t8 s2 D7 n4 ]  E" N
EXEC sp_dboption '数据库名', 'autoshrink', 'TRUE'
' Z5 y2 Z8 V; ~! G, k8 O$ K
( a3 @5 k2 V* A, M6.如果想以后不让它日志增长得太大 5 E; F1 m" a9 `  R: B' [
企业管理器--服务器--右键数据库--属性--事务日志   t$ A! M7 Z* j4 Q  ^# u
--将文件增长限制为xM(x是你允许的最大数据文件大小) , {5 Z7 w8 o( D/ c+ V

: m! Q. Y! O  G4 l1 H  i) A--SQL语句的设置方式: # ^2 k# p2 @2 f+ S' ~5 z" W
alter database 数据库名 modify file(name=逻辑文件名,maxsize=20)
' }/ j( ^, P) b- e$ j* q; S
, M" }6 e1 f' g. [' g
$ f" e3 }% z0 G4 \5 J0 ?% I4 @vxfire 2007-08-28 14:19 * v' F. D3 p8 ~' D5 \' H
我这里.ldf文件比Mdf文件大100G怎么解决啊。,头痛死啦 . I8 u/ c& j* B1 q; g5 f
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|赛格电脑 华强北 电脑城 南山赛格 龙岗电子世界 龙华电脑城 沙井电脑城 松岗电脑城 pc4g.com ( 粤ICP备16039863号 )

GMT+8, 2026-3-7 07:59 , Processed in 0.117681 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表