找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3796|回复: 0

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

[复制链接]
发表于 2009-9-16 00:32:35 | 显示全部楼层 |阅读模式
压缩日志及数据库文件大小   
! l8 E. Q( ~2 t2 D  _# G# Q1 |0 ^1 H
/ m) b  w" U9 ]( ^; M
2 ^, C! u* A) h: v* ]. X
  --下面的所有库名都指你要处理的数据库的库名   . ?/ d. |5 z2 x3 u: m, j
5 S3 C" V# t& V9 W5 [% W
  1.清空日志   ) Q, W6 |4 v" U+ @, x8 [
  DUMP     TRANSACTION     库名     WITH     NO_LOG           
8 \+ R* ~7 \  }+ X8 o  D
/ g/ p+ }* i6 |7 l0 d$ o  2.截断事务日志:   0 s  ~2 M: c0 T1 {4 A/ K
  BACKUP   LOG   库名   WITH   NO_LOG   
* c' f1 ^% ^7 c2 F( C
8 Y7 v) B  d0 R6 a" q  D6 B  n  3.收缩数据库文件(如果不压缩,数据库的文件不会减小   
7 E: W* w9 K1 u3 j- h2 @1 ^  企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件   * ]  Q- L' a" G7 T- v6 o) a6 L
  --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   
, k7 u8 ?4 S3 K: @1 J" y  --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   + C3 h) U0 J- A0 ?2 G- ^* R% O" Z" [4 L
& S( ?- @- l( C9 g
  也可以用SQL语句来完成     R3 i; }" W( p9 D8 V
  --收缩数据库   
9 z4 ~: I  w5 V  DBCC   SHRINKDATABASE(库名)   
8 I& Q# o2 @! I, a8 V( h8 D2 w, U3 z2 B
  --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select   *   from   sysfiles   
# i- e( v( }# c2 s) G& \. V" P  DBCC   SHRINKFILE(1)   ; `7 J3 k. O( Z. X$ S: F0 `
/ x2 z" q, t% A) a( K; W  |
  4.为了最大化的缩小日志文件(如果是sql   7.0,这步只能在查询分析器中进行)   * T. Q1 y  d# a$ _9 f
  a.分离数据库:   
( w2 R8 u- L, F% K) b  企业管理器--服务器--数据库--右键--分离数据库   : p' e; z' H$ I# ?8 T6 `% y
( y8 y: k# q6 c- U1 Y
  b.在我的电脑中删除LOG文件   
; b. P5 i3 i2 p) X- S  l
5 S  `* N# H+ }" v  c.附加数据库:   7 K  L2 g+ t, X) M5 x
  企业管理器--服务器--数据库--右键--附加数据库   2 [/ A4 g+ U" V$ t7 }! I" L

" g3 R  |' s! j( f1 r0 L4 _5 z  此法将生成新的LOG,大小只有500多K   / p7 r& b0 Q/ L9 C9 `4 J% v

! P8 g  o6 X, v3 X3 p  或用代码:     4 i. V0 V) S) N8 k5 Z5 A
  下面的示例分离   pubs,然后将   pubs   中的一个文件附加到当前服务器。   
. M* J7 s$ D/ q) l7 j* E2 y; Q* B( ~
) G' }8 O& U2 e% q4 h9 H, A/ v- y  a.分离   
% M2 s8 d7 D% i  N1 u  EXEC   sp_detach_db   @dbname   =   '库名'   
7 b& g; ?8 t3 @
0 k* S3 x$ T. v1 g. W9 m* X0 W9 D0 e  b.删除日志文件   . k  ^/ H0 R+ |1 t

/ c6 [* t- O% n% c; W  c.再附加   
$ @+ w4 I% k. H* u0 o+ ~  EXEC   sp_attach_single_file_db   @dbname   =   '库名',     
8 U; ~5 [2 i# h9 k; I! x        @physname   =   'crogram   FilesMicrosoft   SQL   ServerMSSQLData库名.mdf'   + l; d9 K+ V1 j. k
2 B& o, @, e2 |! l
  5.为了以后能自动收缩,做如下设置:   
0 r! n" Z& B! [) R2 K! ~  企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"   
7 F7 o/ i# i( {: W% H3 T8 ^/ V2 Z& w$ [' z) h
  --SQL语句设置方式:   - n* M7 P) I! J+ t6 ?6 v& K
  EXEC   sp_dboption   '库名',   'autoshrink',   'TRUE'   / q) j7 n* ]5 K% |  J' ?
( N5 A% r* F6 W: j: e9 Q* v4 m
  6.如果想以后不让它日志增长得太大   
1 G- ]- _. \" a# `  企业管理器--服务器--右键数据库--属性--事务日志   
, o$ i' D" O! X  --将文件增长限制为xM(x是你允许的最大数据文件大小)   , U- O* _9 i8 a9 T: Y; \  q
9 v# W/ ]4 a( k1 y& K' y, S% q4 e# C
  --SQL语句的设置方式:   / x) S# k* l. c4 G1 f6 d2 C. U
  alter   database   库名   modify   file(name=逻辑文件名,maxsize=20)   
  K/ X4 a+ h0 V' n) Y, m( m9 Z0 M2 B  ---------------------------------------------------------------------/ _- _- Y, Y% W) C* ^
SQL Server 控制Ldf文件的大小(清理历史记录 &设定自动缩小)
% ?: F3 G; ]- u# j# g# `8 e# w
" f0 `+ v% _% v8 V: R*清理历史记录 ' G7 n# k: B( i6 E& Q* i
1. 在SQL Server Enterprice Manager(企业管理器)工具列---进入 SQL Query Analyzer(SQL查询分析器) 2 v8 q7 \) N  b" C' r) ]/ M" k
2. 输入BACKUP LOG <你的数据库名称> WITH TRUNCATE_ONLY
) `) I8 A+ @3 _8 d6 `( ]% I. o如: BACKUP LOG myXXDB WITH TRUNCATE_ONLY 6 ~/ m# y1 L* ]0 v% l- M# M
- y- i8 M# p/ E2 ~- y3 l
2. 回SQL Server Enterprice Manager, 在该数据库上按右键选[所有工作/压缩数据库],
7 `8 M3 `+ y2 e; ?9 Y点[文件], 在数据库文件选择该 Log文件, 在[压缩动作]选择[将文件压缩为X MB (最小值为Y MB)], 4 \! X8 i1 p# {# l7 c% b+ [
直接将x改成其建议其最小值y按[确定]即可压缩. 8 m- }- ^; B* F4 [6 v
先不要离开,再点一次[文件]看看压了多少, 会发现还可以再压, 还会变更小哟! 可以压两三次.
* Z6 t. A$ x! a3 Q$ K
# F- I% P6 T  m) d, P1 D- b总结:其实也就是两个指令就可以完成了
! s5 Y4 o# E  ?6 a" MBACKUP LOG DateBaseName WITH TRUNCATE_ONLY
/ l2 g, b7 Z& A; q8 WDBCC ShrinkDatabase(DateBaseName) . j2 r' Q2 l0 e$ ]% ^& l" l2 N

# ~4 O! |* w% S# c9 a" @  ^*设定数据库自动缩小, 默认值为OFF / r. o7 `. C3 S2 M
方法1.
# s; E- T# J2 K  z2 x  B2 EALTER DATABASE <你的数据库名称> SET AUTO_SHRINK ON 3 m; Z% k* D, q
如: ALTER DATABASE myXXDB SET AUTO_SHRINK ON : n# K- Y& T$ [0 @9 `' [( u
方法2. 7 b, I3 f9 a; @& L1 [+ t/ j* @! L
在数据库上按右键选内容(要等一下下), 点[选项]页, 勾选[自动压缩]后按确定 , ^3 r0 S" y, i( o& J

: Y4 f2 `. `7 T( K. c2 f$ S, K6 `* i4 d- Z* N2 i7 H
 SQL SERVER日志清除的两种方法 ' I+ v# q' A" h% h0 k% o( P
  在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……
9 j3 n* \7 C3 X6 r! U1 X: A* g
! e2 H; r% G" ]  _  方法一
! D3 }; K9 R; H3 ~- l/ l
) p2 R0 L5 ?1 T  Z, X& `- u/ r  一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大 * F( n9 _4 R" V+ ?
1 ?' J1 A2 ^/ ~3 x; Q3 |" P# }
  1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存。 ( M" _- u* U& \% V5 M2 A

$ h; k9 H9 I5 K$ F3 C+ ?! ?, I# F  2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定。
  X5 M3 J9 e2 }* _6 R* _4 s& k  Y
' v" ?+ R5 u" J7 \0 a' K; J  3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据
' {/ l$ Q( j1 s/ Q+ R+ S/ I7 A+ B! [7 c7 }* A

8 x  o! z: g' ?) h& Q1 f- q5 M  @$ \" X7 V3 V: p

1 ]1 H) S2 z: d. J9 w! HSQLSERVER中讲: $ o/ q3 W' X- J. L

# Q9 \$ ?& O, D0 P: mBACKUP LOG 数据库名 WITH NO_LOG|TRUNCATE_ONLY可以截断事务日志。 4 r3 N: q2 S) C* x3 g4 E5 H
! x& `# f; m/ O* d  H" D2 g
但我在数据库中进行上述操作后,事务日志还是没有改变。 5 d8 [3 _" j5 q. b) q

% T1 z9 q$ N2 M9 k0 d6 Q
, j  h5 H" Y" y, j, d3 [; |第一步只是将非活动的事务日志截断,并没有收缩数据库,只有进行第二项操作后,数据库才进行事务日志的清理工作,将截断的非活动事务删除,并将事务日志文件收缩到适当尺寸。 " i9 V/ E% A8 r( Z7 s. @$ h# m& e
在使用 SQL Server 时,数据库里的日志文件会越来越大,需要把它删除。 我先把这个数据库分离,在数据库上点右键 -> 所有任务 -> 分离数据库,分离之后,就可以把 Log 文件删除,同时也可以把数据进行备份。之后,就可以在所有任务里的附加数据库再把那个数据库添进来,SQL Server 会提示 LOG 文件不存在,问你是不是要新建一个,选是就行了,这样,LOG 文件就清空了。 这个方法只需几分钟的时间,但在这几分钟里,就不能访问这个数据库了,我觉得只适用于小型的应用,对于大型的系统就要找其它方法了。 5 F! ?. b  w3 E, n! q$ t
; n; E# ?2 ~  v4 }

$ y  B7 M0 P9 M+ j; j老马嗖嗖 2007-04-30 13:03 * h* {6 P3 O7 T% L' V# W3 m
SQL Server 2000中*.LDF文件是什么作用) }# h3 m4 @9 U7 e/ ?% m
7 m8 X) q2 h" j6 x
*.mdf是数据文件   . J; H9 ?+ L" P; o
*.ldf是日志文件   / R8 X2 \& ~; t
当数据库出现问题时   - F$ o' _" k! o$ m& r- ?' y
可用以下语句恢复   
1 a! [! ~& t# J数据恢复一   , u: r# p  P% z, o- p
1. 先分离数据库   
: p% T3 F0 }4 s; oexec   sp_detach_db   dbname   7 _8 y2 F2 |" a, F7 F( C
2. 加上数据库   
) Y3 Y5 @1 H! [/ L" K) Sexec   sp_attach_db   @dbname=’dbname’,@filename1=’d:sql   server...dbname.mdf’,@filename2=’d;sql   server...dbname_log.ldf’   0 r8 K1 S: M0 U4 C
- E3 T/ Z' K1 ~; x3 V
/ T/ `' _3 w0 ^
老马嗖嗖 2007-04-30 13:04 ) O( T2 K% o* E* O9 d
8 m4 J5 E* q8 O3 t% }

- @+ _3 K8 G+ q% E- u1.清空日志 0 ?" g5 o+ b$ |3 \4 S: F
DUMP TRANSACTION 库名 WITH NO_LOG 0 d# [3 a: m0 P! D
" z0 S- s; O: M0 I/ q! \
2.截断事务日志: . m; Q7 p: @- @8 f- s$ y; o
BACKUP LOG 数据库名 WITH NO_LOG 2 E/ D& U' u5 E9 G8 B5 J& M

( ^3 q9 z$ b+ E( `! o& H9 X3 P3.收缩数据库文件(如果不压缩,数据库的文件不会减小 9 }- V* j# `  y2 H- E0 |
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件 4 I: r6 p" g5 F' L2 r! q7 e2 j
--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
# u& G/ c9 h- q- d--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 / H- W; W% E- p4 z) ^" {

  A: M* m9 O& g) a也可以用SQL语句来完成 # ~% S6 L/ a* k, w; C5 ]5 @2 J  j, X
--收缩数据库
! k' K& N2 x& I) tDBCC SHRINKDATABASE(客户资料)
0 }+ b7 j' J0 ^; d
1 c9 @9 {- ]9 J--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
% Z( Y8 |' m" R9 \  xDBCC SHRINKFILE(1) # G$ {) k. D, h$ G* u. j

( }; t# [* b# a1 Q0 h# o: L4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行) 4 K3 r4 ]  A2 A$ c3 a7 Q1 z6 o
a.分离数据库: 6 f* y" X3 a+ V0 X
企业管理器--服务器--数据库--右键--分离数据库
% y. Y4 r& h& _2 b5 {( v: a+ d5 E' t& k$ D
b.在我的电脑中删除LOG文件 * M( L' w( G7 A* Y
0 S% {7 j2 E1 \, u6 {" @! E8 w0 m- ]
c.附加数据库: & g$ j8 r1 A0 ~* Z: I& v; s2 c
企业管理器--服务器--数据库--右键--附加数据库 $ a- r& l, W" \+ [

: K& N- l$ Q8 h此法将生成新的LOG,大小只有500多K 4 T; a% {+ U% O! [
% I. f  p' q( G' F) |5 @; i: B
或用代码: 8 I. v3 X; u. Z* z- H5 j5 e
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。 3 Q) m% R  ]8 X2 ?9 [

8 I2 t& A  ?. E2 Ra.分离
! z% _6 S" q2 x" C- A' @. X9 G/ bEXEC sp_detach_db @dbname = 'pubs' $ y6 y6 i4 ~9 j4 H+ K5 d

# z( ~7 ~5 @& i: Ib.删除日志文件
) p) R( A! w% L: a- N/ ^3 ]
, E3 f: V# `* T& M: jc.再附加
/ K5 k% m7 @: l! g2 [EXEC sp_attach_single_file_db @dbname = 'pubs',
9 b/ R! L; t1 N@physname = 'crogram FilesMicrosoft SQL ServerMSSQLDatapubs.mdf'
/ P4 x( I8 z- q& _5 L
& A8 R# y6 {* Z5.为了以后能自动收缩,做如下设置:
0 F& Y% }2 F+ {. [4 ^企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"
: U0 U" F/ |6 r/ @! s/ P) y, g
! a; C- L5 N+ n9 H3 ?# [- ]--SQL语句设置方式:
! g$ j2 E/ i& d' S( ~3 _EXEC sp_dboption '数据库名', 'autoshrink', 'TRUE'
" l9 |: _0 \9 k9 X, Q$ |/ w( Y1 z1 s
) s/ Q- L2 f+ y7 a0 `6.如果想以后不让它日志增长得太大
; [+ Y4 {: {$ Z# A4 n' k4 Z4 q, [企业管理器--服务器--右键数据库--属性--事务日志
+ W+ U3 u' j- z! o. S. H--将文件增长限制为xM(x是你允许的最大数据文件大小) 2 ]8 ^8 D8 H8 _6 K/ N

7 G# Q/ j- a6 E0 {--SQL语句的设置方式:
! u- J* \+ M, g# U3 @& B) [alter database 数据库名 modify file(name=逻辑文件名,maxsize=20)
; g6 ^- w8 e0 D8 I7 ?: O. j, u: j0 e8 j* p

  y: P$ H  j; X$ @" [- b- K9 P' evxfire 2007-08-28 14:19
3 a- R' G4 [3 m) f. d- h& Z. r我这里.ldf文件比Mdf文件大100G怎么解决啊。,头痛死啦
8 N1 @" I4 E2 F
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 22:10 , Processed in 0.065661 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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