找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3896|回复: 0

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

[复制链接]
发表于 2009-9-16 00:32:35 | 显示全部楼层 |阅读模式
压缩日志及数据库文件大小   
! t1 M5 ]+ H7 }% L3 R. I" I( P
* u$ k# S, o, L! e; M" z. H  ^
8 `) L9 X: Y! N
( `0 P% p. R  w7 |$ i  --下面的所有库名都指你要处理的数据库的库名   1 O1 z/ L1 b. {! N3 X

0 c2 ]7 o, }7 a  U: w, `  1.清空日志   
! b6 Q  w+ E  B  DUMP     TRANSACTION     库名     WITH     NO_LOG           % O# d% Z4 g" k, V

  s& n, _& z1 B" g9 `' j8 v0 F  2.截断事务日志:   
6 @- T( j' @% Z# z4 G" f  BACKUP   LOG   库名   WITH   NO_LOG   - e. Y8 s( M% v$ o+ h$ `  l
! @; b5 h* U( B
  3.收缩数据库文件(如果不压缩,数据库的文件不会减小   - z* i7 C5 ?) y: A
  企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件   
1 J( l4 Y  o! q3 c" l7 P$ W  --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   
2 f, e3 b, Z: L& f) z. H  --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   * k" N2 N( s. p6 d' [

' i$ r; p2 h& X) C6 k, |4 w1 c  M  也可以用SQL语句来完成   ; Q6 D, M2 a$ O/ \. o
  --收缩数据库   
+ D0 [' U) }6 s; G  DBCC   SHRINKDATABASE(库名)   
' k  s. v9 [0 a+ ?' E4 q5 A4 [3 |
  --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select   *   from   sysfiles   
8 l: v8 g- g( Y5 g0 D2 x) Z  DBCC   SHRINKFILE(1)   
5 w' |$ {& y9 z: x& i- i& p6 M- q7 B3 e/ V
  4.为了最大化的缩小日志文件(如果是sql   7.0,这步只能在查询分析器中进行)   . [6 \7 k$ {' C
  a.分离数据库:   7 K! q! d+ c7 [2 |) u# C: l; W
  企业管理器--服务器--数据库--右键--分离数据库   
7 C: g6 s8 u7 _1 _1 N, ?/ }) o' Y6 [7 H- N
  b.在我的电脑中删除LOG文件   
( `- d1 y6 e* \) W) ]" i# W! I* i( m; s4 k  Y# q! z
  c.附加数据库:   
( z9 S1 K1 R8 l  }- N  企业管理器--服务器--数据库--右键--附加数据库   
1 B9 D4 O# e+ _& W9 |% P. f! n- U
7 y. v# [% ]( g7 w% G5 I% R3 I  此法将生成新的LOG,大小只有500多K   8 \7 J/ ^# M( o- w- X) P

+ `3 f% R& w% \+ Z  ]  或用代码:     8 Y8 ~7 k! Z  f- r$ ~
  下面的示例分离   pubs,然后将   pubs   中的一个文件附加到当前服务器。     Y' |( w2 I( K* m, ]# u7 K

" [% q( Q# S4 t' ~9 R# c1 |  a.分离   0 D4 {: |5 k; i( h0 o
  EXEC   sp_detach_db   @dbname   =   '库名'   
. C' s+ z: m0 S3 r) s
8 y5 V! e6 k" U" G  b.删除日志文件   
8 U+ Y1 x, r- ?$ n; |% @
2 c1 Z* g4 C% f; k5 Y$ k# H3 c  c.再附加   $ v/ u' B$ X2 W) ~+ t
  EXEC   sp_attach_single_file_db   @dbname   =   '库名',     " i/ U0 y+ L$ P- J- ~# |
        @physname   =   'crogram   FilesMicrosoft   SQL   ServerMSSQLData库名.mdf'   6 ]9 f" Y3 k$ b! M* S

0 Q5 m9 }- o2 ~: h. W  5.为了以后能自动收缩,做如下设置:   
0 _1 p# X3 N# J9 ?( x  企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"   
% c' {1 z  D1 a# b! r% `' u: u
5 \2 M/ Z2 f3 z/ p3 c/ \/ }2 J  x  --SQL语句设置方式:   
5 n& Y+ I( U# k: B5 y  EXEC   sp_dboption   '库名',   'autoshrink',   'TRUE'   ! I1 i" \0 Z* n/ @8 G& F# v
6 r/ K& J) r! E
  6.如果想以后不让它日志增长得太大   0 V! ?' C0 U9 H, @& \0 U+ N
  企业管理器--服务器--右键数据库--属性--事务日志   : B7 K) `; x" V3 {) a% j+ v+ x4 T
  --将文件增长限制为xM(x是你允许的最大数据文件大小)   
" J8 k" |% }4 q$ C& p$ i# d0 f
, @- P. b3 O! y5 P* \5 W+ c$ P  --SQL语句的设置方式:   + |8 C' n" V" V8 D* z
  alter   database   库名   modify   file(name=逻辑文件名,maxsize=20)   + N. C3 k1 |4 G" D0 Z/ B
  ---------------------------------------------------------------------
( |1 T3 N$ r' I% e% ASQL Server 控制Ldf文件的大小(清理历史记录 &设定自动缩小)
6 h3 C3 l# d$ w. [: t. T+ ?, B+ `+ c( y4 h
*清理历史记录 & S% \. S2 l, Y* b% \' _
1. 在SQL Server Enterprice Manager(企业管理器)工具列---进入 SQL Query Analyzer(SQL查询分析器) # S6 t! C3 ^  ]0 T/ G  D
2. 输入BACKUP LOG <你的数据库名称> WITH TRUNCATE_ONLY
$ Z/ u( g5 d3 m2 |4 F0 G" U" K如: BACKUP LOG myXXDB WITH TRUNCATE_ONLY 0 B, m' d5 E7 |% A# _, y
6 e2 N5 [0 b; Z
2. 回SQL Server Enterprice Manager, 在该数据库上按右键选[所有工作/压缩数据库], 0 `2 M) Z0 f- Z! ]% x% h) U
点[文件], 在数据库文件选择该 Log文件, 在[压缩动作]选择[将文件压缩为X MB (最小值为Y MB)], " j% M3 q% K9 a  x% E
直接将x改成其建议其最小值y按[确定]即可压缩.
& y1 P! c/ n0 O3 L3 l先不要离开,再点一次[文件]看看压了多少, 会发现还可以再压, 还会变更小哟! 可以压两三次.
% d/ a* ^3 s! E9 K
# `+ H3 r7 J  g. v9 ~总结:其实也就是两个指令就可以完成了 ) N5 h. N3 Y; g  b- d
BACKUP LOG DateBaseName WITH TRUNCATE_ONLY ) l; A% U5 P- o. ?+ V$ H
DBCC ShrinkDatabase(DateBaseName) : f3 |& b7 S% w
- f$ F3 a  y  v: Y5 B  d$ t1 b
*设定数据库自动缩小, 默认值为OFF
, K! o7 P7 ?+ C8 x: E方法1. 2 J" i7 B  ^2 P
ALTER DATABASE <你的数据库名称> SET AUTO_SHRINK ON
/ N, V2 Q; n2 Q% w/ v; i8 ?' C" P如: ALTER DATABASE myXXDB SET AUTO_SHRINK ON
- P1 y: R3 l$ s. X方法2.
- S- p5 K1 a1 d( C; a8 n0 e; Y* ]在数据库上按右键选内容(要等一下下), 点[选项]页, 勾选[自动压缩]后按确定 1 W3 J3 E' ]4 S9 K- Z

$ I, U) X0 }7 ^2 h' ?) g
, k* w5 |: t# Y* G SQL SERVER日志清除的两种方法
! C: \; ~4 @" h( c  在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……
0 h, E$ t+ E' N4 ^/ e2 H# F; G' o
  方法一
2 P* ]( k" J4 z% X$ [# R+ F- o+ X% }0 U; l. P, @
  一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大 7 A; _' ]8 q$ Z( r& ~

6 T, K' L: f" i  1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存。 ( d% M) i. G7 P7 |

6 r& ]7 t. k$ U2 g  2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定。 ( k! x3 h( {5 U5 V

* G. p+ h/ m, o/ D; M  3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据 ) m- f& q; ?) V
+ m9 I; q! A0 k& D/ f, F7 f
1 ]1 C9 H# _: B4 x* C

8 p  y; P, r9 Y& H
6 T$ \/ [1 H  |$ T* ]SQLSERVER中讲: % w, {7 y' p1 {/ P2 N% A

8 D" j& G3 S* W9 ZBACKUP LOG 数据库名 WITH NO_LOG|TRUNCATE_ONLY可以截断事务日志。
8 W6 G1 A) G+ b6 o
: v. ?& m# C1 e) U/ V* {/ I2 w但我在数据库中进行上述操作后,事务日志还是没有改变。 ' Q/ @* F9 n9 D8 y  V+ g* `

9 ]# `1 @5 N# s& l  Q: r: S3 m6 A; }' `' q2 f8 n) S
第一步只是将非活动的事务日志截断,并没有收缩数据库,只有进行第二项操作后,数据库才进行事务日志的清理工作,将截断的非活动事务删除,并将事务日志文件收缩到适当尺寸。   V6 t. m$ ]5 {) Q" S, O9 W. [
在使用 SQL Server 时,数据库里的日志文件会越来越大,需要把它删除。 我先把这个数据库分离,在数据库上点右键 -> 所有任务 -> 分离数据库,分离之后,就可以把 Log 文件删除,同时也可以把数据进行备份。之后,就可以在所有任务里的附加数据库再把那个数据库添进来,SQL Server 会提示 LOG 文件不存在,问你是不是要新建一个,选是就行了,这样,LOG 文件就清空了。 这个方法只需几分钟的时间,但在这几分钟里,就不能访问这个数据库了,我觉得只适用于小型的应用,对于大型的系统就要找其它方法了。
9 e7 p: A' l6 _3 t  v: f8 a$ s9 A3 B% {) \% Z( n0 ^/ l/ e

* {, w/ {. B2 h2 v0 A老马嗖嗖 2007-04-30 13:03
& \0 F; M& B/ K# `# Y. h& TSQL Server 2000中*.LDF文件是什么作用
  d3 B7 D% }. N1 p+ D$ ?4 U. f3 q  r! Y- U7 m+ A' v2 o
*.mdf是数据文件   1 V+ ^# |3 h; H, A
*.ldf是日志文件   
1 f  t! u% _3 Y当数据库出现问题时   
$ J) q3 F" e+ @- B# A可用以下语句恢复   
% z$ y! z9 F. r" E1 d6 Y' \数据恢复一   
2 P4 B! _5 K! T9 `0 D1. 先分离数据库   $ Y4 J) a$ ]! Q: X; p2 Q/ A% q
exec   sp_detach_db   dbname   
2 C9 y. e: \% `! V; P  ?+ k' A+ w4 W" `2. 加上数据库   
- Q& Q. A! v  f2 D2 A/ \exec   sp_attach_db   @dbname=’dbname’,@filename1=’d:sql   server...dbname.mdf’,@filename2=’d;sql   server...dbname_log.ldf’   8 r5 G6 Q. f% T& @$ T& r

" q6 t2 @. l, M: `( ]- }% c4 h7 _6 Z* I+ M
老马嗖嗖 2007-04-30 13:04 % A6 B6 z  |# i4 ~0 L' m  ^; l) S7 \

/ B& H0 y- t: {6 e1 X# i" d1 z) b. g2 e: g6 y
1.清空日志 . m( R- o! V0 L! U% B' T- |
DUMP TRANSACTION 库名 WITH NO_LOG 2 ], B8 B% [& G* P1 x6 ?

$ c/ L% h! P9 ~! K- ~( z9 \1 O) _& M2.截断事务日志: % m* I7 G. j* Q/ i  z
BACKUP LOG 数据库名 WITH NO_LOG
8 K" z) b, C, @- _# _, E( E" d9 j
3.收缩数据库文件(如果不压缩,数据库的文件不会减小
5 Y4 m. H" l8 C: P* o企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
3 T2 U. G# ~5 h--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 , V9 q% ]6 g6 `6 Z8 f
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   s$ s) A+ g3 w, w% G$ ?% [

/ ^3 S+ \* |, t3 I  l2 Y6 C1 K也可以用SQL语句来完成
5 C( K, n* w% M/ a--收缩数据库
0 H9 C5 o- X; |. \; W1 qDBCC SHRINKDATABASE(客户资料)
' K, Y! m( j; J- e: D9 M3 e  d7 d0 G3 S4 O* V& y' y
--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles 2 ~7 M1 ?" F* V9 n. V
DBCC SHRINKFILE(1)
; \# f5 x" Q+ \7 d& S
* X3 d: E3 _# N: \& D, E* |( j! o, |4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行) ( [+ T& D; z+ U2 s' w+ q5 z
a.分离数据库:
6 x" [) H& _3 ]% n' M2 H6 ?- P. A企业管理器--服务器--数据库--右键--分离数据库
4 |( w% {( O$ V5 N" f9 C8 B+ V( G
8 f8 H3 M, E0 |/ X& \6 O& Ab.在我的电脑中删除LOG文件 1 ~% m6 U+ O( h- `

! w( @$ E+ S7 Z) W  f1 j3 s; g3 ~c.附加数据库: # n: ?& x/ t2 m" k" F
企业管理器--服务器--数据库--右键--附加数据库
: w5 H# [3 e# f1 z, n- l& w3 t/ k4 v0 O2 g
此法将生成新的LOG,大小只有500多K
+ h8 O; n: x9 [$ l! Z
$ a8 C& n0 x6 J+ L或用代码: / d' W( z; k; J4 L! X. l
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
. ^2 I$ C& p: H" R8 U4 S% u, x/ V! Q- i& S
a.分离 " s: U9 c5 @) J0 o. i
EXEC sp_detach_db @dbname = 'pubs'
1 R9 D" u, _1 F9 V* @! B5 ~9 E% j. h
b.删除日志文件
9 K- u# d, v( i- u4 H" M: o! l' t
) G  G" @- C) E% I# O; Vc.再附加 : p% X9 o, L, i2 O" o( A  s
EXEC sp_attach_single_file_db @dbname = 'pubs', ) u; I+ B9 Z. p
@physname = 'crogram FilesMicrosoft SQL ServerMSSQLDatapubs.mdf'
9 K) f5 ~0 B4 z# @; {  y
8 ~$ _0 A/ ~+ L- j& C! M# R5.为了以后能自动收缩,做如下设置:
( @, k9 M0 L4 G$ v8 }  f4 y- w/ g# V企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"
" K5 N+ m1 l2 j6 |2 s4 K" l, B  t, |* M0 C
--SQL语句设置方式:
* J) Y3 p, H' ~  O' P9 s0 S3 \EXEC sp_dboption '数据库名', 'autoshrink', 'TRUE'
' Z" t0 E, ]9 e9 B/ n
, L" ?. P7 {. p! b4 h; t, u6.如果想以后不让它日志增长得太大
( I8 Q5 E9 R. Q! O+ s% |$ c2 Z企业管理器--服务器--右键数据库--属性--事务日志 ' J( t3 [2 q6 E3 M" o
--将文件增长限制为xM(x是你允许的最大数据文件大小) , @) _6 q8 L. ~6 t) ]0 ^& y0 `! Z
8 l+ \7 l3 J( X
--SQL语句的设置方式:
  D. v8 N  r, P$ talter database 数据库名 modify file(name=逻辑文件名,maxsize=20) ( G- f: o3 c4 }! j6 p

% d; e7 o3 m2 Y6 g" i0 N) Y' J7 o
+ {# j5 t% K# l- jvxfire 2007-08-28 14:19
9 Y7 c; B" ?' g8 S. _8 w我这里.ldf文件比Mdf文件大100G怎么解决啊。,头痛死啦 1 v* ^" o7 q8 v9 m: j# s9 U3 {
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-7 11:00 , Processed in 0.095183 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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