找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3810|回复: 0

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

[复制链接]
发表于 2009-9-16 00:32:35 | 显示全部楼层 |阅读模式
压缩日志及数据库文件大小   " n& J& m5 x* \' p8 m+ S
% [) |) K; M9 [3 U8 {/ v

2 \  k4 |$ i- t; S  B+ \1 i- u& p. i0 X; [3 S
  --下面的所有库名都指你要处理的数据库的库名   
8 R! B- h  a8 S, v' g  U- C$ v$ r7 ~$ x/ U6 ~  _, R2 V' D
  1.清空日志   
% U9 V% t' v2 B1 i  DUMP     TRANSACTION     库名     WITH     NO_LOG           
! a: w$ X( s" |# U! |# J# O( H' @- h0 e
  2.截断事务日志:     m, U) Y% k1 f( F4 P
  BACKUP   LOG   库名   WITH   NO_LOG   
" o& I: \" U( x! i
" _, [# a: a9 |2 P  3.收缩数据库文件(如果不压缩,数据库的文件不会减小   
. o$ d  {& ?9 Q% C- S) {  企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件   * j. Q2 K4 {. A4 P
  --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   
% _. N0 R! [* C7 F$ G  --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   9 p) l) f3 c9 N/ D, Z" T1 v" y

+ G8 R9 ^# ~; ]9 Y9 e8 l+ `' r  也可以用SQL语句来完成   - e4 }5 c4 F9 l5 T/ v) `
  --收缩数据库   ) A7 M7 h5 k6 g/ u( I2 [
  DBCC   SHRINKDATABASE(库名)   ! }( O  b2 O& X4 C5 ]. Q( U
$ d( ]" w% R2 B/ ^; E
  --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select   *   from   sysfiles   + E" C' p! @" V5 g  U
  DBCC   SHRINKFILE(1)   
6 A- G' P; E) [' N2 w# k( c4 ?; W$ \$ X- F/ O
  4.为了最大化的缩小日志文件(如果是sql   7.0,这步只能在查询分析器中进行)   
. x8 i; o- q5 C. t9 {1 ]  a.分离数据库:   
. g9 R* u1 C5 H% z# g* R  企业管理器--服务器--数据库--右键--分离数据库   
) c5 a! _9 _. j. ?- j3 |" w
, i! a8 c4 I+ F, M! R! F  b.在我的电脑中删除LOG文件   8 U5 G$ {( r; {  _6 C, R$ ^
& h; o2 {3 u/ D( U) k
  c.附加数据库:   ) O; Z* J! R' c, S& l
  企业管理器--服务器--数据库--右键--附加数据库   ' o3 J- V" b& q5 r1 x" G
. ^; E2 r( G$ V- `8 z& g
  此法将生成新的LOG,大小只有500多K   + |+ b4 v( g% H2 C; V6 y

8 V7 E2 C6 I- k$ g; z# {7 j  或用代码:     : Q4 E, O" |" S# r- z
  下面的示例分离   pubs,然后将   pubs   中的一个文件附加到当前服务器。   + c5 [8 S& F/ x$ m$ D9 l6 _: K
3 R  v& S2 F# r' b; f
  a.分离   : U+ \- D4 ^( \
  EXEC   sp_detach_db   @dbname   =   '库名'   
+ Z5 h6 S- j4 _0 r2 k: n
' v8 U. i  r/ q9 ~6 T$ o  b.删除日志文件   ; v3 J- }+ c( y

" y) V/ r; k; t. i% L  c.再附加   
5 `8 ?8 |7 M8 \" G6 ^2 r# |9 N8 N  EXEC   sp_attach_single_file_db   @dbname   =   '库名',     
* n% U9 V3 D* N' P9 C5 U        @physname   =   'crogram   FilesMicrosoft   SQL   ServerMSSQLData库名.mdf'   " m4 k8 d( B/ n6 K5 t: _
- C* r% V! ]4 m& C4 O* @
  5.为了以后能自动收缩,做如下设置:   - N9 [% ^& f) G1 M0 L
  企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"   ! @$ h7 x% M; x) ?- w

* M7 n0 M7 ~0 V8 @8 a/ F  --SQL语句设置方式:   " Y- B- |0 Y+ A7 q$ L
  EXEC   sp_dboption   '库名',   'autoshrink',   'TRUE'   
$ l" n) ^; `& ~
% W/ F# t# [+ r) o0 O  6.如果想以后不让它日志增长得太大   
% _. Z* U3 }% l' ]6 {5 e  企业管理器--服务器--右键数据库--属性--事务日志   
2 T# s$ x$ H3 Y8 V  --将文件增长限制为xM(x是你允许的最大数据文件大小)   
* V; i3 t+ y/ W0 j
' ?" @. W6 q- S. s6 W  --SQL语句的设置方式:   
0 Z, M& r0 Y1 x( b7 L3 i  alter   database   库名   modify   file(name=逻辑文件名,maxsize=20)   # ~/ X, s! p7 D
  ---------------------------------------------------------------------1 ], S: Q" R* Z# G: l' N6 w
SQL Server 控制Ldf文件的大小(清理历史记录 &设定自动缩小)
/ n% R/ T2 ?( B4 z. T! p7 [# a$ P/ }. H1 d& N2 I$ t# |$ {" @
*清理历史记录 1 l4 a6 Y* w' h+ A$ G4 W8 [
1. 在SQL Server Enterprice Manager(企业管理器)工具列---进入 SQL Query Analyzer(SQL查询分析器) ) s; t, @( p0 g) o( M# n) c$ a
2. 输入BACKUP LOG <你的数据库名称> WITH TRUNCATE_ONLY
9 U$ T# }, x4 @& z6 w如: BACKUP LOG myXXDB WITH TRUNCATE_ONLY . c5 [6 x' K$ Y$ p/ N3 h9 i# a

9 _' A* r* r8 G) b2. 回SQL Server Enterprice Manager, 在该数据库上按右键选[所有工作/压缩数据库], 1 A- j( _2 p, d6 C& d! g
点[文件], 在数据库文件选择该 Log文件, 在[压缩动作]选择[将文件压缩为X MB (最小值为Y MB)],
/ {/ Q- q  t) c  m直接将x改成其建议其最小值y按[确定]即可压缩. 2 n/ v6 F3 P& C# y
先不要离开,再点一次[文件]看看压了多少, 会发现还可以再压, 还会变更小哟! 可以压两三次.
* w4 F& m1 x' T( X- O; r8 Z
" W  T0 W8 b: ~3 L; w总结:其实也就是两个指令就可以完成了
- |1 z$ b5 b0 [# s8 Q0 yBACKUP LOG DateBaseName WITH TRUNCATE_ONLY : C$ P+ l4 i1 b6 B1 O5 j( m
DBCC ShrinkDatabase(DateBaseName)
1 c, Z8 j4 E* s' f7 H2 @% a9 ~6 F6 r5 G
*设定数据库自动缩小, 默认值为OFF + c6 ~9 j' n2 \! u+ H
方法1. / P& e5 h8 W7 T% ^1 g
ALTER DATABASE <你的数据库名称> SET AUTO_SHRINK ON / t( H! d, T- u0 B1 f7 V# P- R% l
如: ALTER DATABASE myXXDB SET AUTO_SHRINK ON
  G4 X+ o% n( `0 g+ Q方法2.
6 I/ V( Y9 F6 t$ ^1 _; y在数据库上按右键选内容(要等一下下), 点[选项]页, 勾选[自动压缩]后按确定 . u6 J* @9 {2 e* F1 s3 f5 U. V
* q5 D5 ^- ^$ I: G4 B% D3 ~  z# v
2 z- ?. y! f5 z* {3 C: ^! C9 Q# J7 ?) r
 SQL SERVER日志清除的两种方法
4 x" a1 ], w, m' }* M  M  在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……
" p3 {& n) i& c3 P9 ~
/ ~5 G& `  e$ f; J5 M  方法一
, q. c9 Z; n6 o) B
! |; N6 m8 J" {  一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大
. g0 y$ o" T5 }4 e3 }
4 p9 n; {5 [" x4 f8 U+ @  1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存。
( _- c/ r9 K5 I& H& R. P2 R% g' A, w
  2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定。 0 I! o( R# Y! i8 e

' q* u! @) a) @& R$ c  3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据 % s. ?7 J+ d( c4 H* T

% R% m2 H( t$ }9 k1 M- k; |# ~6 H" E: K6 f- S- j
. r& \2 F+ N% V' x
9 H0 G( M8 H! n: X
SQLSERVER中讲: # W# q# E( j& b. K
& y4 q: C. ]; P6 |! d% \* s
BACKUP LOG 数据库名 WITH NO_LOG|TRUNCATE_ONLY可以截断事务日志。 # C" K7 m. d! ~: n5 H  }9 R

; F5 w) C, @- f( r! ]但我在数据库中进行上述操作后,事务日志还是没有改变。 $ g# r! S+ V0 Q) I, R
4 G2 L8 U- N1 S8 y0 q
$ l5 ~( B, U! e, P
第一步只是将非活动的事务日志截断,并没有收缩数据库,只有进行第二项操作后,数据库才进行事务日志的清理工作,将截断的非活动事务删除,并将事务日志文件收缩到适当尺寸。 - \1 G+ z* j! B- e
在使用 SQL Server 时,数据库里的日志文件会越来越大,需要把它删除。 我先把这个数据库分离,在数据库上点右键 -> 所有任务 -> 分离数据库,分离之后,就可以把 Log 文件删除,同时也可以把数据进行备份。之后,就可以在所有任务里的附加数据库再把那个数据库添进来,SQL Server 会提示 LOG 文件不存在,问你是不是要新建一个,选是就行了,这样,LOG 文件就清空了。 这个方法只需几分钟的时间,但在这几分钟里,就不能访问这个数据库了,我觉得只适用于小型的应用,对于大型的系统就要找其它方法了。
5 o5 j2 T- G* S2 W
$ f5 x1 ~' M; J# m9 p& O2 S
0 \" H6 V8 o2 h" p3 S0 ]* c* h0 r2 j老马嗖嗖 2007-04-30 13:03
0 a$ w3 I4 C) O9 _SQL Server 2000中*.LDF文件是什么作用
1 T# T8 t) \, C& y. L( K  m9 \0 i) r& M5 d6 P; k" Q
*.mdf是数据文件   
) o7 n, c8 Y- N" G* N" l*.ldf是日志文件   
- N) _& C4 o  V; q) ?当数据库出现问题时   ) M  p( Y' \. p! ]: V1 a
可用以下语句恢复   % C# R! \* E2 C5 |2 h  D
数据恢复一   
( u9 R8 U7 i. Y; l' j1 N, C8 b  V2 \1. 先分离数据库   
2 _* }& F2 N) |) j% m$ v7 g7 mexec   sp_detach_db   dbname   
+ ^5 J- L. C3 ~6 ^' k# ?2. 加上数据库   
& [0 t8 e2 q+ Z! Gexec   sp_attach_db   @dbname=’dbname’,@filename1=’d:sql   server...dbname.mdf’,@filename2=’d;sql   server...dbname_log.ldf’   
* B! Z2 ?- C8 M( O- e6 B3 j( u% V2 r. m0 a: l! i

9 U3 h* z# ?3 k( ?( P老马嗖嗖 2007-04-30 13:04 ) {5 A* A  E9 ?0 K. p0 g
& ]! Q# o3 d, }% X$ C+ I+ J# V. z

3 E: u4 h3 B2 {( ^. l1.清空日志
3 V" H- o* S1 L" A; ]9 BDUMP TRANSACTION 库名 WITH NO_LOG 5 y3 T9 @$ V. h( S; K. g
3 U1 O% s! k; f% `1 j& d7 `
2.截断事务日志: 8 Z! a$ `- P  f
BACKUP LOG 数据库名 WITH NO_LOG
% {9 G# {; M( c
2 z. Y& q9 j" y; f3.收缩数据库文件(如果不压缩,数据库的文件不会减小 7 O: \9 h& R. S* |2 a* e  {/ f3 k5 n
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
7 b6 n$ `4 A  t--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 7 r; ~/ X$ R: U! ?/ Y: g
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
, J5 Y! i$ q% W6 k5 R( e/ k. ]
1 Y. C7 G! u. _* R/ Q4 E6 ^+ N也可以用SQL语句来完成 ) g0 o% e+ m( {7 u$ R% W
--收缩数据库
1 E- U% c8 n+ U* Z" {$ ]DBCC SHRINKDATABASE(客户资料)
( W, d2 ?( G! K2 H  J3 N5 n! j; _' e
--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
2 ]0 ], u5 f8 V: Z9 KDBCC SHRINKFILE(1)
5 ]: L# U8 G/ f- d
2 q3 t3 H( n, U6 e4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
) t! ~0 d+ `! x! J6 Fa.分离数据库:
& [6 q* h, |/ l5 D4 _  L企业管理器--服务器--数据库--右键--分离数据库
8 P, c0 m, D1 |
8 c+ L  H% V6 z# wb.在我的电脑中删除LOG文件
- j/ m) @! A9 v2 V/ t
' O* x, W, U' |! zc.附加数据库: ( i1 a- U% [3 n) U8 w6 u( M2 r
企业管理器--服务器--数据库--右键--附加数据库 8 K' H  ]8 ~& f! ]2 R" b' o* U
0 V+ `( j' k/ i% `
此法将生成新的LOG,大小只有500多K
9 e/ l* s- G3 T$ W! ?5 Z+ n
* C7 V7 B2 @( Y6 r$ D$ t) d或用代码:
  z& R; V& R5 F  `1 G* |7 q下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
6 n; A. M3 @3 H2 @
& z- n# \6 q. u. [6 ]a.分离 $ q5 u2 {" l, {4 z3 n+ W
EXEC sp_detach_db @dbname = 'pubs'
$ c4 [" J8 `& w; r$ Z% `: c$ y: U- _
b.删除日志文件
% |( E+ x) V9 O6 j% W6 o
3 I+ o( o; r5 Z% V4 y1 Gc.再附加 5 h5 ?  B+ N' T! p6 L2 ^9 v
EXEC sp_attach_single_file_db @dbname = 'pubs',
1 r% O  [; I) Z$ K4 |+ t& `: K% i@physname = 'crogram FilesMicrosoft SQL ServerMSSQLDatapubs.mdf'
0 f2 z5 x2 b% z3 F  m2 X$ ~! f4 ~& K7 H6 @6 a
5.为了以后能自动收缩,做如下设置:
0 U  \& d7 x7 F6 F企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"
1 W1 f4 q% J# R9 L9 ~4 x$ Q, H+ ^6 t3 W7 I6 u4 w
--SQL语句设置方式: & O) H) h0 r& x- Z/ _6 F- S
EXEC sp_dboption '数据库名', 'autoshrink', 'TRUE'
( e* J8 L  a) Z, \. }
5 o; i3 x+ R" g# p  ~6.如果想以后不让它日志增长得太大
# w# ?0 F  R. R$ h$ q" V9 q/ F企业管理器--服务器--右键数据库--属性--事务日志
1 `  Q0 _$ ~% m( a* r# \  K--将文件增长限制为xM(x是你允许的最大数据文件大小)
1 H: n: O, Q2 D; C) e3 \* x
& x' o: H2 ~0 {# J% O--SQL语句的设置方式: " v9 {& Q. v! a1 x! Q  S
alter database 数据库名 modify file(name=逻辑文件名,maxsize=20) ; g* k8 h4 }+ l0 P  ~' J

/ l' M3 v! p* P5 P( ^/ U+ s
0 U! q. A; d  _2 C) tvxfire 2007-08-28 14:19
+ i0 D* ]; d; Y+ {/ ]5 c我这里.ldf文件比Mdf文件大100G怎么解决啊。,头痛死啦
; N9 m! O* y3 R& q6 h
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-5 01:12 , Processed in 0.106394 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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