华强北电脑城 龙岗电子世界 龙华电脑城  凯尔电脑

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3657|回复: 0

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

[复制链接]
发表于 2009-9-16 00:32:35 | 显示全部楼层 |阅读模式
压缩日志及数据库文件大小   
, K- ^, _$ |" S
3 S9 x# V% n1 \$ E  I6 @. {3 C; o6 L0 s7 b$ w- X% E8 F3 ]' ]
3 F3 ?+ i7 p7 l3 I9 a* O
  --下面的所有库名都指你要处理的数据库的库名   6 E7 l% J5 c4 b8 r# ?# ^6 r
- ]1 g% N3 Z3 V. n3 I
  1.清空日志   
$ ?% ?5 u! I! |  DUMP     TRANSACTION     库名     WITH     NO_LOG           
( a1 F" J2 v0 J: |7 m% O  o0 R, o7 h+ \: X; B+ `( n
  2.截断事务日志:   
) @5 L5 l* i7 ]! t1 f: ^  BACKUP   LOG   库名   WITH   NO_LOG   
9 [" f4 ]/ N, {& T8 h, s/ [+ O5 ^5 A% c9 L
  3.收缩数据库文件(如果不压缩,数据库的文件不会减小   
- e" O/ f! X# N% m7 A( \+ W* O' Z  企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件   
9 Y( o% T7 M5 ^2 \4 P: H  --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   
( y, E( Z$ {" G& b1 b/ P! I% G  --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   + ?! X7 P6 |* `0 h8 k
9 c+ h! b9 Y# u( ?
  也可以用SQL语句来完成   
5 T7 [* a  P. J; q- b% U' Z  --收缩数据库   
; n; h) h# P6 x" H- P  DBCC   SHRINKDATABASE(库名)   $ F2 A5 @) h0 ]$ X% t
8 P2 M/ z/ B( J# g, Z4 L  ^* G0 i
  --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select   *   from   sysfiles   & ~/ F! Q$ w* P1 p7 }' d
  DBCC   SHRINKFILE(1)   
6 n2 \' l0 Y  S' `3 W2 ?; I
/ g. V, @6 h: R/ E  4.为了最大化的缩小日志文件(如果是sql   7.0,这步只能在查询分析器中进行)   
/ @. I2 C0 ]/ m- q8 ]  a.分离数据库:   ! N8 h) e' C4 ]
  企业管理器--服务器--数据库--右键--分离数据库   5 ~- g* N# K, h

' `2 J5 M2 i3 Z$ R. t3 s) T7 a3 M" b  b.在我的电脑中删除LOG文件   
. A7 o2 Q, O; L
8 V2 j( x) h% H2 o: X6 a  c.附加数据库:   
, R% t7 D7 j4 }1 K" C  企业管理器--服务器--数据库--右键--附加数据库   
4 c1 d! U" U, i4 H
$ l5 `6 P  M2 h1 V+ y- l9 V  此法将生成新的LOG,大小只有500多K   
* U( `2 ~8 x9 O8 Q2 ^) r& V6 e+ ^/ ^. _3 E% S+ U" G4 K6 |. p
  或用代码:     7 n/ j6 ?/ ^- L# B0 j5 l1 s5 c6 ^
  下面的示例分离   pubs,然后将   pubs   中的一个文件附加到当前服务器。   
# C% P* W; [' R- Y
( D4 X7 O5 t! u( @  a.分离   
& B+ H, b5 l: t6 K6 S6 }  EXEC   sp_detach_db   @dbname   =   '库名'   
. @# q4 n* X) k- j# G4 N. f8 Y9 L
  b.删除日志文件   
6 M* Y! p. }- r. [1 |- ?
2 S2 L( t5 G. h/ k, @7 W  c.再附加   
0 s. J, B) c9 T  EXEC   sp_attach_single_file_db   @dbname   =   '库名',     ) j1 @* W* B, ?1 F9 c2 U* y
        @physname   =   'crogram   FilesMicrosoft   SQL   ServerMSSQLData库名.mdf'   
; N: P9 k2 A/ {+ Z) x. T7 g- a. l- Q
  5.为了以后能自动收缩,做如下设置:     y4 q4 ]0 M% ?) a! K
  企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"   
+ r, B% Q+ N" _  D/ G) M. O) z" b% N: n. G
  --SQL语句设置方式:   
* \) g3 B- N: U  }# t. J) m  EXEC   sp_dboption   '库名',   'autoshrink',   'TRUE'   
3 i9 w9 N2 U/ K# j6 y6 Y
0 {! x# }, ]3 q9 j4 a* J  w  6.如果想以后不让它日志增长得太大   
0 y% \1 [* |1 [8 E! K9 i  企业管理器--服务器--右键数据库--属性--事务日志     V0 @1 c7 z5 Z  A( Y
  --将文件增长限制为xM(x是你允许的最大数据文件大小)   
4 }- d" S' @3 W8 y! w( f9 T" @# K& |5 E9 u
  --SQL语句的设置方式:   
) i8 j/ B! t4 ]6 P3 l+ g  alter   database   库名   modify   file(name=逻辑文件名,maxsize=20)   2 q% L3 s: _2 Y: L. K) d
  ---------------------------------------------------------------------
% T2 t* m3 H2 w, f5 ]SQL Server 控制Ldf文件的大小(清理历史记录 &设定自动缩小) ! o3 ?% d% t- a7 V! h8 N

: P) Y, N( n6 ~( U" S" e5 R! }1 m*清理历史记录
1 b1 k5 `% E+ V7 |( V* o8 }% V6 F1. 在SQL Server Enterprice Manager(企业管理器)工具列---进入 SQL Query Analyzer(SQL查询分析器)
3 |0 {  w" J  f" Q2. 输入BACKUP LOG <你的数据库名称> WITH TRUNCATE_ONLY
# ]/ ^* e% ~  {' D. c' `4 ?如: BACKUP LOG myXXDB WITH TRUNCATE_ONLY , A& y0 g, V4 Y2 G* d5 B0 r2 \
  w( ?5 f- Q' j$ B1 {
2. 回SQL Server Enterprice Manager, 在该数据库上按右键选[所有工作/压缩数据库], 1 c0 S& v4 ^# E# O) @
点[文件], 在数据库文件选择该 Log文件, 在[压缩动作]选择[将文件压缩为X MB (最小值为Y MB)], + K6 Z. l1 i" f/ A& }
直接将x改成其建议其最小值y按[确定]即可压缩.
7 Y* ?- ~8 [, w8 c9 }1 P/ K, Z先不要离开,再点一次[文件]看看压了多少, 会发现还可以再压, 还会变更小哟! 可以压两三次.
) n* g, B; i, d7 C
2 X! C2 y2 H2 S2 h* A7 e3 @总结:其实也就是两个指令就可以完成了
0 Q- A$ [' r; P7 A' DBACKUP LOG DateBaseName WITH TRUNCATE_ONLY ! a+ J# O& S' Z, z
DBCC ShrinkDatabase(DateBaseName) 7 g! p9 e3 ^: a) v) L

6 o5 g+ T3 F" T8 `& H$ ]- U" \*设定数据库自动缩小, 默认值为OFF
% Q$ p7 _8 @3 V* {方法1. ! i  Q% k* A! v$ i" j( `  f0 H8 y
ALTER DATABASE <你的数据库名称> SET AUTO_SHRINK ON ( k9 p& R' q8 T; Z) r$ N. n
如: ALTER DATABASE myXXDB SET AUTO_SHRINK ON
/ @! t8 }- f9 E8 w" i方法2.
% N* i1 U/ y' X+ S# }& p在数据库上按右键选内容(要等一下下), 点[选项]页, 勾选[自动压缩]后按确定
! I; n+ P* q  B$ K
/ B6 x6 M" A1 q& q0 Y2 B$ r* `& k/ ^8 O: w6 x0 S1 y  G
 SQL SERVER日志清除的两种方法 * {; z4 x1 Z- l
  在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……
8 R' C% S& H4 I
8 h. e) w, ^3 M  方法一
: @6 Z$ G- ^) t+ c& o. B
5 p7 Z0 e1 S  [( N" ^  一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大 ) v0 n" Y1 y' \  a

# s' ]% U: c2 F  1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存。
0 {7 e& V/ Z/ ^* c8 X
9 _% O1 z: F% H" }  2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定。 + ]3 d" \9 P+ q
( d, L! z0 W" \: T: u$ w
  3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据 " G+ F3 }  B6 W. A4 Q* X% }0 i

0 [+ }- n1 I5 B. z# N  k6 T; F  Q( u- x* ~2 X" J9 W
8 {. V* H! o* M- ^, r

8 F7 d* T4 \2 w* S) SSQLSERVER中讲: 5 w" B6 J0 N( T4 x/ F

8 f) R& w$ |8 U3 QBACKUP LOG 数据库名 WITH NO_LOG|TRUNCATE_ONLY可以截断事务日志。 , `0 F- h7 `6 k5 `' c1 l

6 N: x# P- g& Q. s( F/ @2 n! o但我在数据库中进行上述操作后,事务日志还是没有改变。 8 e) _) n0 t9 @5 s& t: c

3 k. B9 r$ T$ Z  x7 V3 F5 g5 @. ?) a2 X& S
第一步只是将非活动的事务日志截断,并没有收缩数据库,只有进行第二项操作后,数据库才进行事务日志的清理工作,将截断的非活动事务删除,并将事务日志文件收缩到适当尺寸。
# N% k6 u  c. ]在使用 SQL Server 时,数据库里的日志文件会越来越大,需要把它删除。 我先把这个数据库分离,在数据库上点右键 -> 所有任务 -> 分离数据库,分离之后,就可以把 Log 文件删除,同时也可以把数据进行备份。之后,就可以在所有任务里的附加数据库再把那个数据库添进来,SQL Server 会提示 LOG 文件不存在,问你是不是要新建一个,选是就行了,这样,LOG 文件就清空了。 这个方法只需几分钟的时间,但在这几分钟里,就不能访问这个数据库了,我觉得只适用于小型的应用,对于大型的系统就要找其它方法了。 ! T( a; Q" ]/ X+ Z5 _

+ K; r2 J) U3 f7 e9 N6 h: w( F5 t. W0 K6 C
老马嗖嗖 2007-04-30 13:03
: n6 x  p' T. C+ [) n4 Y6 ^" a" v# dSQL Server 2000中*.LDF文件是什么作用* M/ Y  D  F5 H% e# M
6 X! B9 L- B9 z" h1 f& v0 _8 x
*.mdf是数据文件   
0 q1 R# T( z0 W) l% g. k*.ldf是日志文件   ; J8 H1 n7 O! I- U3 m
当数据库出现问题时   
) ]6 l8 G  j7 P' F" L5 @/ G# H可用以下语句恢复   5 n6 l) A7 U1 D( h0 d' P/ [
数据恢复一   
& R! n- z' M5 {6 i) g1. 先分离数据库   5 O0 n, n8 B/ ?- x  H
exec   sp_detach_db   dbname   2 B9 N9 {9 f$ E; `' C/ g
2. 加上数据库   
( t& W- R8 |( o) sexec   sp_attach_db   @dbname=’dbname’,@filename1=’d:sql   server...dbname.mdf’,@filename2=’d;sql   server...dbname_log.ldf’   
: e& a9 z) d2 X9 v1 Q9 v5 Y
! t+ F; D2 D9 Z8 p
6 h$ j# `6 @9 w4 W& N( J" P老马嗖嗖 2007-04-30 13:04 ! Q2 c, ~. x3 _  l. `

) e9 k. L7 P  a$ Z1 K7 }
+ I) D: J2 h0 n1.清空日志
- j  ^6 {8 s( ^/ h/ H4 ^8 bDUMP TRANSACTION 库名 WITH NO_LOG
% M" ?- i3 J% U2 Y5 L: [$ z3 R1 R! E/ P# K+ V
2.截断事务日志: : p- n5 R" {: X. E4 _# o/ E2 l
BACKUP LOG 数据库名 WITH NO_LOG
1 |9 P, l  t: T7 E2 s5 B5 B/ h
' |+ T4 H' o# {, _! R& \) b% `, M3.收缩数据库文件(如果不压缩,数据库的文件不会减小 & e+ [  i" T5 w0 _' x! K, v
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
& V; A, _7 C3 H! [7 @" N( W" V--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 ) Z. x( Y5 [6 g  h
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 % d$ a8 p2 o$ L* l9 f& ?! p" R

2 k9 r  n- ^7 G+ Z$ e5 |0 Q也可以用SQL语句来完成
, T1 S5 \+ l6 p6 |( k--收缩数据库 / Y" c/ Y8 Q8 X9 N: H( Z
DBCC SHRINKDATABASE(客户资料)
) M0 E) H# I) h) {0 B7 L) T
8 k  U4 l. y* m4 |--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
+ w( J6 k* f1 N" O( M( aDBCC SHRINKFILE(1)
* Z. M7 E# S1 u% E9 i0 V  ~: H: p" O* m* C- r6 n6 J
4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
+ l: |# X/ `' j& m* P# x  ~3 I/ va.分离数据库: 6 c2 c# U5 }2 L
企业管理器--服务器--数据库--右键--分离数据库
; s9 U' c+ W) r+ P! @
% p& B0 m* ?* v3 T3 A' db.在我的电脑中删除LOG文件 - x1 V! `- \1 E+ k( T
: B) n2 o) C1 ]$ n0 l4 y2 e
c.附加数据库:
1 R& L% b/ @% x企业管理器--服务器--数据库--右键--附加数据库 8 u0 T6 S' g' h/ Y8 @# w' S. d* l7 ]

7 |0 }7 R% M5 {3 B7 B" B8 f7 }此法将生成新的LOG,大小只有500多K
/ f: S$ K( n& o6 s% j& ]
8 l2 H6 O1 Q0 D% @% J7 K或用代码:
' s7 r7 A9 b: ~& r1 l1 V下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
4 `* ?* A5 z) ]* U: x  a% p7 |9 N+ _  Q& X$ d( o/ ^; C
a.分离
" F( v9 x4 B1 qEXEC sp_detach_db @dbname = 'pubs' : G& R1 j% W& N$ u* m* M
6 D4 _' s- M% G: {% [, D- i7 }8 `9 B6 b
b.删除日志文件 2 Q# |! A  r# v9 e
. R8 z/ |+ ?5 S
c.再附加 ' _, t% m+ S4 _4 ~1 r  R7 |4 x# i
EXEC sp_attach_single_file_db @dbname = 'pubs', & b$ f( T% E9 L- P
@physname = 'crogram FilesMicrosoft SQL ServerMSSQLDatapubs.mdf'
$ X. u/ a/ n* N7 _+ f) Y0 i# m! x. m- @
5.为了以后能自动收缩,做如下设置:
' j* o7 Y" z! c9 c# u; x企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩" / v; x% Y% d3 F, J( N0 E- U
# x: b% ?9 z9 T: r$ w* w
--SQL语句设置方式: 1 V) G2 H; t! c# W
EXEC sp_dboption '数据库名', 'autoshrink', 'TRUE'
1 Q; Z3 U! M: c( G% b% {5 |( a( [5 I4 v# p: ^0 p
6.如果想以后不让它日志增长得太大 ; w' }" K8 A: @$ c
企业管理器--服务器--右键数据库--属性--事务日志 - n- Q' C  K: ?) O6 z: {
--将文件增长限制为xM(x是你允许的最大数据文件大小)
2 a+ c& w  s4 B! X8 B0 U( c" z' n8 X4 @
--SQL语句的设置方式:
5 H9 [, o: J; u6 e7 }alter database 数据库名 modify file(name=逻辑文件名,maxsize=20) 1 e6 M1 j- g, ?2 O1 I

- X) C& l$ i& B& R/ Y4 k& |2 ]
vxfire 2007-08-28 14:19
* N  u1 r4 B6 R4 Y我这里.ldf文件比Mdf文件大100G怎么解决啊。,头痛死啦
0 ]/ [9 E. h1 _$ b% N6 x+ c
回复

使用道具 举报

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

本版积分规则

QQ|华强北 电脑城 龙岗电子世界 龙华电脑城 pc4g.com ( 粤ICP备16039863号 )

GMT+8, 2025-6-17 18:02 , Processed in 0.088331 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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