找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3815|回复: 0

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

[复制链接]
发表于 2009-9-16 00:32:35 | 显示全部楼层 |阅读模式
压缩日志及数据库文件大小   + @2 V  k7 D' |: i5 R  N- M# P
+ d; R# ~; d7 b: H- l  N: J! q) l

' S1 N5 z7 G% I5 X/ a8 c  t9 F' j0 P3 {
  --下面的所有库名都指你要处理的数据库的库名   
6 s4 x  t0 k6 M/ I' w" A5 u( r: S+ \# c& _/ t# Z7 l
  1.清空日志   
( s3 K3 A; |9 _2 \% i- M- X  DUMP     TRANSACTION     库名     WITH     NO_LOG           ) n( ^8 I" D3 Y' F

: n+ w% k" d1 S2 d  2.截断事务日志:   
3 y! j, t* v6 k' `) A( f5 H9 @  BACKUP   LOG   库名   WITH   NO_LOG   . {6 B' E9 l2 M( Y& f2 Y

! `: S4 L2 |5 V" [0 P; N9 M! r+ h! H  3.收缩数据库文件(如果不压缩,数据库的文件不会减小     c" `) r2 e* O: e0 u% z3 A9 P
  企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件     [% S8 z# R# D) z( T6 d
  --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   
0 ?0 @1 L) t: ]% I! G$ H  --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   
6 ^7 ^& v! d0 s, D
! b, \. a  b3 f% w- m/ l2 A  也可以用SQL语句来完成   3 n6 R0 N8 _. i; J" q7 Y9 S3 a: b0 H
  --收缩数据库   
, V/ l. t; T8 j; Y; }9 x  DBCC   SHRINKDATABASE(库名)   
8 o& [  H8 j! Q+ z2 \5 E4 X' P
  --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select   *   from   sysfiles   8 D* c  [, v$ p' T) O( y
  DBCC   SHRINKFILE(1)   
9 N- O- q7 J9 G! q( }3 A6 d9 _) u9 S2 l& G" F
  4.为了最大化的缩小日志文件(如果是sql   7.0,这步只能在查询分析器中进行)   5 _) J3 I: B: b! Q. a+ g4 d+ Y
  a.分离数据库:   
/ q0 p5 q6 C5 M0 e  企业管理器--服务器--数据库--右键--分离数据库   
0 K6 r# y+ c& ~! R5 z
/ {  v1 L2 f% A- Y  b.在我的电脑中删除LOG文件   / |- O2 J: @7 {6 L  m# M" @' ?) ?
' q( y& D5 b+ e# i# J  m4 @
  c.附加数据库:   - u9 |1 C& j) y4 u8 W9 B
  企业管理器--服务器--数据库--右键--附加数据库   
' S0 Q/ U9 K5 `5 X$ [) D% H9 L+ {" t6 N5 W$ o) d! j* G# Q, t0 i. S
  此法将生成新的LOG,大小只有500多K   4 B; n6 U) @! r% C9 {
) I3 Y4 _5 p+ ^* ?; o
  或用代码:     4 }, D/ v$ A  z+ z- ~1 W7 s
  下面的示例分离   pubs,然后将   pubs   中的一个文件附加到当前服务器。   
4 f9 T1 z- D5 P- H6 Q. `$ l; i2 k* \; G3 A
  a.分离   : V! D- v6 Y0 t  D
  EXEC   sp_detach_db   @dbname   =   '库名'   
# Q# R* E, @7 h* S
! r  Q4 S: K% ^- P  b.删除日志文件   
' E' ]8 R- V7 \
0 ^. [8 G6 V5 T* j2 g2 ]  c.再附加   6 b; r- g0 }  L/ ], O
  EXEC   sp_attach_single_file_db   @dbname   =   '库名',     0 i( |5 p+ m$ V  d' {5 D3 P! `
        @physname   =   'crogram   FilesMicrosoft   SQL   ServerMSSQLData库名.mdf'   
& Y7 Q9 `  _! \: r5 o& _% s* j1 ~' K* z( u; a. n
  5.为了以后能自动收缩,做如下设置:   7 \$ i1 ^1 r& n& B
  企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"   
9 ~4 r3 c, F* L4 C5 S
+ `2 `2 J6 Z: x+ [1 V  --SQL语句设置方式:   3 E6 d" b) V. @; z
  EXEC   sp_dboption   '库名',   'autoshrink',   'TRUE'   
/ y+ R) }! |1 Z
9 i% a9 K+ n/ O8 t" K0 D  6.如果想以后不让它日志增长得太大   
* U3 `6 G; y! d# K% ?  企业管理器--服务器--右键数据库--属性--事务日志   1 r3 i: J' A$ i+ z
  --将文件增长限制为xM(x是你允许的最大数据文件大小)   
0 n# p$ z2 P! |" v) v) I* u3 ~7 M* r2 H: H& I8 o) H* n
  --SQL语句的设置方式:   ( D& Y# i$ f9 ]' }! e
  alter   database   库名   modify   file(name=逻辑文件名,maxsize=20)   3 V( J9 z" N  b- f4 t/ f
  ---------------------------------------------------------------------! S, L1 Y1 m: k/ W6 h0 f( |
SQL Server 控制Ldf文件的大小(清理历史记录 &设定自动缩小)
( S4 r- v- M$ A, |& F! E: n  Q- p4 A9 e* u* g1 A
*清理历史记录 ( b% F( y  C* T6 R/ ^3 y
1. 在SQL Server Enterprice Manager(企业管理器)工具列---进入 SQL Query Analyzer(SQL查询分析器)
+ |" t: g( O8 D- M2 s2. 输入BACKUP LOG <你的数据库名称> WITH TRUNCATE_ONLY
6 q- V3 Z; X7 ~4 q# }( N3 P+ s如: BACKUP LOG myXXDB WITH TRUNCATE_ONLY ( |$ K: e! n2 C1 b) t' _" X

3 X: |! I* O! {( {2. 回SQL Server Enterprice Manager, 在该数据库上按右键选[所有工作/压缩数据库], : {4 l5 K$ C: P
点[文件], 在数据库文件选择该 Log文件, 在[压缩动作]选择[将文件压缩为X MB (最小值为Y MB)],
* w0 \0 H0 C0 _* i+ r直接将x改成其建议其最小值y按[确定]即可压缩.
2 q" z* \( i) k) C$ x' I- ^先不要离开,再点一次[文件]看看压了多少, 会发现还可以再压, 还会变更小哟! 可以压两三次. % M, Q$ ?# R7 m' G5 T8 N

. ?9 O# _! A0 m总结:其实也就是两个指令就可以完成了 ) t7 a! v2 H: a7 i4 p9 m
BACKUP LOG DateBaseName WITH TRUNCATE_ONLY ' z7 B; i; `/ l
DBCC ShrinkDatabase(DateBaseName) ( R! u8 k% Y$ a. i

, \( A& d4 P9 h& a* T*设定数据库自动缩小, 默认值为OFF # k4 ?# F. X# N0 L  U! N6 X
方法1. 7 X4 R! [: d0 f. r3 Q5 ?
ALTER DATABASE <你的数据库名称> SET AUTO_SHRINK ON & s" N% J; |& o% O
如: ALTER DATABASE myXXDB SET AUTO_SHRINK ON ; p4 b6 l: H; ^
方法2. 3 ^3 v' |6 z# Y4 I: j
在数据库上按右键选内容(要等一下下), 点[选项]页, 勾选[自动压缩]后按确定 4 z: n9 ?) A% k. Q# B: r

3 a: \9 P* I6 a# @2 [" ?3 X$ u; ~7 ]3 ]
 SQL SERVER日志清除的两种方法 . x9 a/ }' O6 x% H7 H5 T5 c
  在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……
, y" _2 u+ V* C8 p
- {* W- z, E% T0 s! H! p) W' b7 f  方法一
0 F* ~1 O  B' m, ^; s& x6 O& h! Y, N3 P# ~1 T0 o
  一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大
. Z# {( |0 P  b7 P
$ l' q4 @! Y- ^! L; R" j  1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存。 # W2 R; _6 T5 p0 N
4 f, O, I9 c  ~* r
  2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定。 . T3 I2 y& _$ L8 F

9 a# A- s3 Z- N- I  3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据   U/ }5 [0 G7 X% v/ }8 q

% k$ B# Y' }  s, w- c& l8 d
( ]: k. g3 \) l1 R
$ D% T1 t2 E5 F
. F% Z+ x# T3 {( Z3 B4 `( KSQLSERVER中讲: 0 ?' Z/ l" r, x5 L1 K

, N4 H. {/ k7 X) Z8 M4 S1 n, a4 \BACKUP LOG 数据库名 WITH NO_LOG|TRUNCATE_ONLY可以截断事务日志。
; O0 b) o# `: `' d1 [
" H8 w* _" U, o; k但我在数据库中进行上述操作后,事务日志还是没有改变。 - L* u; N) J3 X7 l) ]! c

' O( ^+ G$ r6 O' X3 n/ G
* O$ i1 W  U" E2 @' |( d3 @+ F第一步只是将非活动的事务日志截断,并没有收缩数据库,只有进行第二项操作后,数据库才进行事务日志的清理工作,将截断的非活动事务删除,并将事务日志文件收缩到适当尺寸。 % L4 d, I. A) W3 X6 H0 {
在使用 SQL Server 时,数据库里的日志文件会越来越大,需要把它删除。 我先把这个数据库分离,在数据库上点右键 -> 所有任务 -> 分离数据库,分离之后,就可以把 Log 文件删除,同时也可以把数据进行备份。之后,就可以在所有任务里的附加数据库再把那个数据库添进来,SQL Server 会提示 LOG 文件不存在,问你是不是要新建一个,选是就行了,这样,LOG 文件就清空了。 这个方法只需几分钟的时间,但在这几分钟里,就不能访问这个数据库了,我觉得只适用于小型的应用,对于大型的系统就要找其它方法了。
; u% U  Q4 ~$ A6 B+ Q$ {
  n3 t" ?% X# o) [# W- W7 Y$ r* y; Y2 {
老马嗖嗖 2007-04-30 13:03 ' I3 q; m2 `+ Z7 f# k$ X; ~
SQL Server 2000中*.LDF文件是什么作用0 L- c/ ~, Z8 N) [
8 a8 [5 Q+ o- r, H' y0 T
*.mdf是数据文件   ; r7 H* N& @( @2 w* d
*.ldf是日志文件   / N7 o" g; ], ?9 A
当数据库出现问题时   
# d4 c0 m; P9 ~+ D' ^可用以下语句恢复   
) ]" Z7 q# r( U% X) r5 ^& ~6 q数据恢复一   1 |4 E1 h6 g) K6 N7 R! c7 V  X
1. 先分离数据库   
) p9 N; B6 C, V( eexec   sp_detach_db   dbname   
* Q0 M4 U+ C- n( a+ {! w2. 加上数据库   
5 V( V/ M% Z* r, `) lexec   sp_attach_db   @dbname=’dbname’,@filename1=’d:sql   server...dbname.mdf’,@filename2=’d;sql   server...dbname_log.ldf’   . O" k! U+ ?) q

3 ?! F  ~: b9 `; `2 d  e( u9 b) b5 F; P0 U9 f: {. A# }
老马嗖嗖 2007-04-30 13:04
3 N  x* Y" X4 u+ ^" {. S- M6 D2 w# V& K2 z1 x% ]
2 _+ l; ~) R7 s9 p9 x" G
1.清空日志 4 P1 v# }/ k6 z0 [2 g: l( R
DUMP TRANSACTION 库名 WITH NO_LOG + Z& X  r- B2 ?' ~( \! z
; r; `1 ?6 B5 F6 l0 f
2.截断事务日志:
6 ~3 E, N; n8 n. _" g9 pBACKUP LOG 数据库名 WITH NO_LOG
* [0 w; J" p6 f
6 n+ w/ W' {9 q% t. }9 p6 O3.收缩数据库文件(如果不压缩,数据库的文件不会减小 0 I2 F# m  g# }& E
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
( x" t! |; k+ b; I7 h* F; _--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
, O+ C. s+ ~: D. [5 t--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
8 t* e% R8 e+ K/ C, ?/ _! R9 r  @' |
也可以用SQL语句来完成
( f1 E/ X9 q, u' i" {--收缩数据库
6 X# r' [1 f8 a! o4 I  D# rDBCC SHRINKDATABASE(客户资料)
4 {7 ^. ]' C7 B$ {, ^, L6 F3 L6 P3 S( w) `0 J" [2 u
--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
3 T6 d3 l6 X2 \1 l7 d1 Q' p0 QDBCC SHRINKFILE(1)
0 F! N* p; q( S  B/ S7 G. p0 e& [2 B( U% l" a6 _2 N9 Y5 M6 L
4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行) % a5 C6 J. s3 i6 j' C5 ^
a.分离数据库: / c' b$ r/ }1 F) J
企业管理器--服务器--数据库--右键--分离数据库 " t3 V; I3 R& ~/ T. ~

4 b  @  O  o5 a5 ob.在我的电脑中删除LOG文件
  @3 g9 u3 y# L, n
9 C7 N/ B  ]6 R7 c! jc.附加数据库: 2 N1 `/ p2 p2 P7 ?4 w
企业管理器--服务器--数据库--右键--附加数据库
9 `* A7 ~2 z, `, x# i0 I
3 A2 e" e3 e& }  v( r* p5 S0 {此法将生成新的LOG,大小只有500多K
+ ]' k2 Y8 U6 Y- t
( w% }* ~8 j7 `2 W" i或用代码:
8 ^$ M3 ]& V; F9 e3 V6 ?( x2 @8 v; y下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
5 ?# H* m- \, L
* A0 ^* e5 r& Ma.分离
+ K5 {' n" N1 c- kEXEC sp_detach_db @dbname = 'pubs'
7 M; G% w5 n" S& N1 f9 `5 Z! W
9 k! ~$ h9 R9 a% ob.删除日志文件 " {5 ~  Z; d( Z2 E- e8 c
" J  }$ g' ~& f% a* r8 ~
c.再附加 + ]+ W. P/ d$ a6 _8 w" G; j
EXEC sp_attach_single_file_db @dbname = 'pubs', ! c0 x& L. w) k9 w
@physname = 'crogram FilesMicrosoft SQL ServerMSSQLDatapubs.mdf'
9 x! s- `, V) U- O) E
- R4 e4 O& K0 }$ _5.为了以后能自动收缩,做如下设置: # O7 e3 I7 E% ^2 o1 a# r& C
企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩" 4 W8 z7 w7 @- E, u" A: \# H( J
8 B6 L. [/ T3 S- m" e6 L
--SQL语句设置方式: 0 A* U$ y8 v1 N) T
EXEC sp_dboption '数据库名', 'autoshrink', 'TRUE' 6 S4 L  K7 B- ]6 w* g
" ^8 {! \; v8 `( s) Q
6.如果想以后不让它日志增长得太大
% F( |% R( \: W1 V. X; c企业管理器--服务器--右键数据库--属性--事务日志 : N7 U" X5 U# b9 G# C! l
--将文件增长限制为xM(x是你允许的最大数据文件大小) 8 q$ ?0 ], P; `4 C% G
- c6 T( S: `2 J. t9 O4 {2 b# i
--SQL语句的设置方式:
( \+ b3 X/ N7 P5 jalter database 数据库名 modify file(name=逻辑文件名,maxsize=20)
! Y) ~6 y& B: A. U# J5 \3 U* Z# [. v6 d6 e. L
3 I" b" ^9 I, ]$ q, J
vxfire 2007-08-28 14:19 9 ^& S) d/ a  p1 F3 R
我这里.ldf文件比Mdf文件大100G怎么解决啊。,头痛死啦 ( s7 B9 p5 p4 @/ M: ~- j! \" z% ^
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-2 03:43 , Processed in 0.086674 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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