找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3897|回复: 0

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

[复制链接]
发表于 2009-9-16 00:32:35 | 显示全部楼层 |阅读模式
压缩日志及数据库文件大小   ) ^! E" K, U& R( J0 h- m

% c, G( H: o. w) j1 J! u: e" G0 n9 z- G0 i5 M( L
, x4 }6 }+ u+ |: H0 K& i
  --下面的所有库名都指你要处理的数据库的库名   
  ]  p4 p( l' d3 {# L
$ f) e' W1 ?0 [! J( w* _! i+ i# N  1.清空日志   ) t) ]0 K( o! \( y, m) x
  DUMP     TRANSACTION     库名     WITH     NO_LOG           . y* ~# X6 h% {

( M9 b- T4 J; \* C( E  2.截断事务日志:   7 N7 s! v/ M6 g( A* R5 o
  BACKUP   LOG   库名   WITH   NO_LOG   4 ]: L3 I( |" E. G! w% w( V

* @, ~5 ~" c) z- d% _4 U, c( L  3.收缩数据库文件(如果不压缩,数据库的文件不会减小   
4 [$ |8 _7 x+ W' t$ n; ~  企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件   
1 L6 n2 T- D* t+ a& P& _5 f  --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   8 J! E7 r$ a7 _; A7 S; w2 o  ^
  --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   0 I1 |( k2 J" X: S
8 c- j; j8 k' W5 k4 o9 P9 \
  也可以用SQL语句来完成   ' x" r0 m) V- k
  --收缩数据库   ) Q' o) A/ ^3 h: W2 d; ~
  DBCC   SHRINKDATABASE(库名)   
5 O: j; W1 N* i! c' |( p: m2 m3 {4 g, M7 n: s8 J3 p, R
  --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select   *   from   sysfiles   
8 Z% j# z) X' t+ R) W  DBCC   SHRINKFILE(1)   
( e2 ?2 N3 W5 g2 ~8 Y  s9 W9 B; e' Y& r5 n
  4.为了最大化的缩小日志文件(如果是sql   7.0,这步只能在查询分析器中进行)   5 u4 r# x- w5 M0 z0 Q3 z. c
  a.分离数据库:   
4 ^, ^/ T& G2 ^- h; [  企业管理器--服务器--数据库--右键--分离数据库   $ h5 F1 W! c% E2 h+ w  G

. y( ?1 {* k% ]- ?( \  b.在我的电脑中删除LOG文件   1 F# D) W  m. n3 l
$ M- y& k- P( }) f
  c.附加数据库:   6 S: w+ l1 k+ J- H0 b
  企业管理器--服务器--数据库--右键--附加数据库   ! g2 L( F1 o3 @* u/ q1 q$ G

6 k1 `5 G2 @' [; D- [9 h  此法将生成新的LOG,大小只有500多K   , \( t( [, S* @% w' D
/ w9 t. ^; c7 Z5 W, l, N, ?0 ~
  或用代码:     4 t# M5 y# Y- u. v% l* _( v! F! ?% w
  下面的示例分离   pubs,然后将   pubs   中的一个文件附加到当前服务器。   
: O6 `: q; C9 g; ]- z5 o3 D. z) v- R6 i
6 S' Y0 I# X& n* z) C  a.分离   * _( A$ c8 U! U
  EXEC   sp_detach_db   @dbname   =   '库名'   6 F# K! c8 [/ T! a* P# a7 E# x

5 [, M8 C$ h5 P' k  b.删除日志文件   " }  _  E% d" ]' z9 z% V  ]& u

+ V! Q4 ?8 H" F8 g9 ?& h7 G  c.再附加   1 v+ d+ J7 n- U3 @9 Z* n
  EXEC   sp_attach_single_file_db   @dbname   =   '库名',     
8 J. h6 u& U) M        @physname   =   'crogram   FilesMicrosoft   SQL   ServerMSSQLData库名.mdf'   6 I" i& T5 p* O9 [# _
9 O+ ~" l0 B* Z
  5.为了以后能自动收缩,做如下设置:   
3 b, c; }4 O& o  企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"   8 H& I3 Y( c$ c/ \# N7 q, d( R' ^6 ~
" q1 W& [0 K$ i' |  a$ t$ n
  --SQL语句设置方式:   
& v- Z2 d* h& X; f9 ]) C  EXEC   sp_dboption   '库名',   'autoshrink',   'TRUE'   
6 x0 c/ L) U: p$ h3 t* b, o) d* Z0 [) Z# I0 n+ Y$ e
  6.如果想以后不让它日志增长得太大   ; ?+ B+ {& {* y+ F8 g9 u2 u$ ]
  企业管理器--服务器--右键数据库--属性--事务日志   
2 [3 w% V% a4 i+ x7 ~6 A! M$ A  j  --将文件增长限制为xM(x是你允许的最大数据文件大小)   7 l1 S: Y. K& M5 Z+ ?

* `! V0 ]) V$ L; A  g  --SQL语句的设置方式:   2 y+ E; P( ]; p% ?& y- Q6 F; Z- F
  alter   database   库名   modify   file(name=逻辑文件名,maxsize=20)   0 p4 c' S# ]6 U: K8 a
  ---------------------------------------------------------------------6 g. i, C- T- Z+ v' x
SQL Server 控制Ldf文件的大小(清理历史记录 &设定自动缩小)
/ n. u* J/ {+ y+ H' Z, ^: a0 M& S: @- D3 u# ~3 F, R
*清理历史记录 . s" a9 o2 R9 T  }+ x7 o  _2 t/ K
1. 在SQL Server Enterprice Manager(企业管理器)工具列---进入 SQL Query Analyzer(SQL查询分析器)
* y2 N" p- p$ A8 S; }& T4 y6 O2. 输入BACKUP LOG <你的数据库名称> WITH TRUNCATE_ONLY $ Q4 @5 S. Y( P, R7 f
如: BACKUP LOG myXXDB WITH TRUNCATE_ONLY 2 _4 W" \3 z: ^6 I" w) t
6 f& a+ }) r/ j' X
2. 回SQL Server Enterprice Manager, 在该数据库上按右键选[所有工作/压缩数据库],
/ x4 |  {. |4 U  C# ^, t+ h点[文件], 在数据库文件选择该 Log文件, 在[压缩动作]选择[将文件压缩为X MB (最小值为Y MB)],
7 ?. b3 h' [+ I# `( K直接将x改成其建议其最小值y按[确定]即可压缩.
0 {9 ^; i; J- D1 H4 a/ ], S先不要离开,再点一次[文件]看看压了多少, 会发现还可以再压, 还会变更小哟! 可以压两三次.
6 E" T: v: j9 A- O7 b5 g% S* N0 ?0 T+ S
总结:其实也就是两个指令就可以完成了 : s: P* Z/ ?3 _% t" C; D  d: ~
BACKUP LOG DateBaseName WITH TRUNCATE_ONLY
0 @7 K8 Y- p$ b- }) LDBCC ShrinkDatabase(DateBaseName) , s& I5 V: A1 F
0 b9 \* D$ Q$ N& O% L
*设定数据库自动缩小, 默认值为OFF
% x* M7 m0 D$ O  m3 M1 j方法1. " P/ D+ h$ G; E: [6 B
ALTER DATABASE <你的数据库名称> SET AUTO_SHRINK ON 2 a! U' e! T3 K$ b6 I
如: ALTER DATABASE myXXDB SET AUTO_SHRINK ON ) o5 l* _9 v: I! P
方法2.
! ^+ V& f& c& `0 u  |8 E$ Q1 k& J' y在数据库上按右键选内容(要等一下下), 点[选项]页, 勾选[自动压缩]后按确定 7 A6 `$ S) g# e3 y! l( s" }
4 O4 t1 m9 P; E* p7 g/ J

: l3 S. H7 c7 @8 _) A9 |% v SQL SERVER日志清除的两种方法 3 y) K0 c3 e6 Q7 u. I0 A! d) u
  在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……
5 M( p- o* b8 _
* `! k- J! w1 t* q  n  方法一 2 g; p5 o3 d* S* S
* W3 e' ^$ {1 L1 V4 s8 F9 O2 _  t
  一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大
% e( i8 U. P, L  L9 u/ K, U
  O6 {: V+ Z+ q' R1 x0 v/ r9 l  1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存。 6 C, p8 h( a4 t: ~; t* d: T

/ C( @1 g& T. h! H! S! n  2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定。
. R  z1 j6 [$ Y. g5 r  Y% H" J! f% R6 m3 @& U  S1 u
  3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据
" f9 m, K% o' `
% f$ [2 P# m+ \5 Q# A# L& s/ q  J* q& N' F' Z

" l) X2 Q3 l% y* d8 h1 R. Y2 m: ^, o. A3 m- O
SQLSERVER中讲: & i; j: N+ Q+ ^4 M

6 C7 y4 ^5 S& f8 gBACKUP LOG 数据库名 WITH NO_LOG|TRUNCATE_ONLY可以截断事务日志。 6 \$ E1 A% _- J% f
5 }9 s6 {- o9 V+ K1 C0 i- ]
但我在数据库中进行上述操作后,事务日志还是没有改变。 * n' h1 D9 w* r4 r, N
7 ?1 I) }( T' P' f5 j
0 U" j- ~8 x- t, a, y/ x
第一步只是将非活动的事务日志截断,并没有收缩数据库,只有进行第二项操作后,数据库才进行事务日志的清理工作,将截断的非活动事务删除,并将事务日志文件收缩到适当尺寸。
0 S, b. O  ~$ v0 H4 U在使用 SQL Server 时,数据库里的日志文件会越来越大,需要把它删除。 我先把这个数据库分离,在数据库上点右键 -> 所有任务 -> 分离数据库,分离之后,就可以把 Log 文件删除,同时也可以把数据进行备份。之后,就可以在所有任务里的附加数据库再把那个数据库添进来,SQL Server 会提示 LOG 文件不存在,问你是不是要新建一个,选是就行了,这样,LOG 文件就清空了。 这个方法只需几分钟的时间,但在这几分钟里,就不能访问这个数据库了,我觉得只适用于小型的应用,对于大型的系统就要找其它方法了。
* B! ~2 C+ s# P$ ]8 r6 K) D$ q

6 {: W2 z7 o) R' n) b! h: j1 F老马嗖嗖 2007-04-30 13:03
+ Y) |' s/ |8 Y& T0 ~! ?( U- _SQL Server 2000中*.LDF文件是什么作用
9 Q. |3 `3 |& f6 p* K& D, A
) i3 P& p$ G6 \8 N2 N$ U8 o*.mdf是数据文件   
9 {$ r9 A* X7 l+ }*.ldf是日志文件   + b) o4 [$ U/ G% W8 x' y
当数据库出现问题时   
0 Q+ e7 r7 g0 q5 N7 s可用以下语句恢复   6 z+ I3 b9 H" B. K) j# T+ Q
数据恢复一   
9 z) X; e8 h- |* S: S1. 先分离数据库   
4 \4 g" D  `% p" K+ |; Uexec   sp_detach_db   dbname   3 F* T1 o& I9 e
2. 加上数据库   
, b9 @: f" m5 ]7 P3 Nexec   sp_attach_db   @dbname=’dbname’,@filename1=’d:sql   server...dbname.mdf’,@filename2=’d;sql   server...dbname_log.ldf’   + r7 I5 F. s9 n9 ]: L( ]; B3 [

  G6 Q0 ^% X6 Z5 |
& C% f( `- }% d! F6 F# ~& w老马嗖嗖 2007-04-30 13:04 1 H, E$ @. s6 h7 P8 [/ x

% q) E5 f' a/ j9 [
, k# |1 w+ A- p1.清空日志 2 i* g! S3 i2 ~0 P. g
DUMP TRANSACTION 库名 WITH NO_LOG
" t1 C; _) j2 R2 b- P: S" z; [" I4 n
2.截断事务日志:
* {1 x1 s0 j& {! ]BACKUP LOG 数据库名 WITH NO_LOG . J2 P$ |7 \$ g0 H

6 D$ ], O! G, o  ^$ G0 Q3.收缩数据库文件(如果不压缩,数据库的文件不会减小
. {% C: s+ m  K  W9 A3 }( k6 X企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件 ( {# ?! }. K7 u2 r$ @  w% Z
--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
! _/ s* z/ T6 u  b6 j) X--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
4 ?; c* W1 C3 @, R
) a" \9 P1 E! W9 i也可以用SQL语句来完成 - B, e. h' Q7 {6 i
--收缩数据库 : X) j- ~% f# D4 Q
DBCC SHRINKDATABASE(客户资料)
. x" ]; }  D) n) Z" t* M; f! `  q6 \3 L$ R$ a* E
--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles ( _/ y: Q$ }, e5 `% I# E5 `# t; u) a4 |
DBCC SHRINKFILE(1) ; l8 Q4 l4 k" {6 z& ?0 B, J
  ^* _- ?4 S) Q9 s: l0 |& z( I1 Z
4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
7 d) W& T$ I! Ja.分离数据库: / u' l- l# D3 ~% K/ @: s
企业管理器--服务器--数据库--右键--分离数据库
" @3 l5 o4 O1 R4 @4 V( S! Y
' H3 h5 N) ?' _4 ]1 Gb.在我的电脑中删除LOG文件
; d* k8 x/ t6 Y4 ]0 \# @" |, x9 V4 t+ `" P4 E
c.附加数据库: ! s7 \: T- t, x
企业管理器--服务器--数据库--右键--附加数据库 & B' m' C! a& s3 d1 H5 X
( M- }- M# p# A( o: H
此法将生成新的LOG,大小只有500多K ; Z) d' ]! v( R& \; Y& L! S& t

# c- I8 B1 j) y8 Z或用代码: - l8 V% @  x" [4 x; S3 I
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
5 p- N8 x, H2 P8 K
) t4 U# @* [$ y8 }- }! Ka.分离 0 J# Q6 |: L( R( {$ S# J
EXEC sp_detach_db @dbname = 'pubs'
$ l$ Y, q8 ?6 M& m9 Y( }" z- |$ ?
b.删除日志文件
6 O# M: {: A  `+ u' m) H, S1 n& q( _" x$ N
c.再附加 & V/ z& y4 L7 g+ F
EXEC sp_attach_single_file_db @dbname = 'pubs', & X' a7 m% L% D# G, r) u  y0 F
@physname = 'crogram FilesMicrosoft SQL ServerMSSQLDatapubs.mdf' / Q. t4 P; E3 y4 l' @$ o  P- p

. d4 u3 ?/ J- u5.为了以后能自动收缩,做如下设置: ) d1 J! d* |! a" o$ r
企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩" * P; |3 L1 f: v. |" Z
! L" K# Q& p. Q  T
--SQL语句设置方式: : a* F5 D* D) t" a
EXEC sp_dboption '数据库名', 'autoshrink', 'TRUE' + W3 ~. P* J# Q+ Z
0 k1 o0 F8 |0 K% T3 N( c6 q9 C
6.如果想以后不让它日志增长得太大 4 n% S$ T+ L6 B1 c: P, ^+ M- @, C* T, ?
企业管理器--服务器--右键数据库--属性--事务日志 ! `) q; a" z, C/ g# _0 T
--将文件增长限制为xM(x是你允许的最大数据文件大小)
' f  ]/ g! U  g  N: n* ?/ f: P& d  o. g8 K6 s  n* ~  g
--SQL语句的设置方式:
- z' ]9 t$ e& C/ l' o1 balter database 数据库名 modify file(name=逻辑文件名,maxsize=20) . \% e$ `& m7 g3 ?6 E: b% x) g: S& F
3 L2 U& h# X0 \* Y/ |, B; ]
+ B  |& E3 v: Z' c* X" k& {
vxfire 2007-08-28 14:19
9 B  N5 z* p6 }; a我这里.ldf文件比Mdf文件大100G怎么解决啊。,头痛死啦 & w7 m4 J% g* i! [5 e
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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