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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3658|回复: 0

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

[复制链接]
发表于 2009-9-16 00:32:35 | 显示全部楼层 |阅读模式
压缩日志及数据库文件大小   
# d6 }5 W9 g; L5 P# r( a2 t: }6 [6 w  y" x: f

7 S& e6 T& D% D% |/ e5 |. J
# |# ~# ]9 f# r! b! m2 E  --下面的所有库名都指你要处理的数据库的库名   5 @' h5 U; j. {7 C3 H
3 }7 T( I- K5 o6 U' ^2 \
  1.清空日志   . `3 U& d9 _6 E: g; Y
  DUMP     TRANSACTION     库名     WITH     NO_LOG           8 |6 M  E- G$ N) p) M. X

3 C3 d: c! b  p2 x  2.截断事务日志:   
4 S! ?6 n, _% W, s3 Z, k0 u" C' D  BACKUP   LOG   库名   WITH   NO_LOG   % J) Z  w! \8 Y! L
& \, f& _: f5 i" d+ H. D
  3.收缩数据库文件(如果不压缩,数据库的文件不会减小   
: a1 h; F, I& o  ^+ q9 U; {" e7 Z- Y  企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件   
; w) S! a1 O8 ?  V% E, s  --选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   * M* D$ Z) h2 {& B
  --选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了   . \9 w$ }! p" @8 j% A/ V# R+ G1 |

* b' B' Z4 l' {  u  也可以用SQL语句来完成   " s& a' w' y, \/ k# {
  --收缩数据库   % _3 c/ R2 V) I7 o
  DBCC   SHRINKDATABASE(库名)   6 g) W/ B) j+ p9 `' B

$ ~9 E! X6 ]9 `5 r& d  --收缩指定数据文件,1是文件号,可以通过这个语句查询到:select   *   from   sysfiles   
3 F& W& R1 |0 _" L3 [5 A  DBCC   SHRINKFILE(1)   " U6 z1 g2 m3 M  H3 H4 t* Y
! [$ }+ Y. q) G/ h; E$ t! d
  4.为了最大化的缩小日志文件(如果是sql   7.0,这步只能在查询分析器中进行)   
6 m  S- d% F& m* Q2 Y- g2 U  a.分离数据库:   
: \/ Q! l- K+ S1 F, n4 w  企业管理器--服务器--数据库--右键--分离数据库   
% ?. ]* ^+ E  ~& y( \
/ H4 L! }/ Y1 Y8 b% U9 J0 x% J  b.在我的电脑中删除LOG文件   
% ^! o- V+ U! k3 \. K' Q0 ^
/ {! K8 m, F' w7 T5 p2 h  c.附加数据库:   
) u' W2 W) b! ^6 X  企业管理器--服务器--数据库--右键--附加数据库   1 P5 W! n' {  m; T7 P* g

% H/ ^: {8 A6 R* v8 S/ {  此法将生成新的LOG,大小只有500多K   ( `2 _6 X8 b4 d+ h3 S' P0 B
% _  C) [6 q0 F3 C/ u9 p
  或用代码:     
( T/ ~- _" w7 ~! v  下面的示例分离   pubs,然后将   pubs   中的一个文件附加到当前服务器。   
' q6 k9 L: V+ }6 v# H3 X# W
0 @! {- |8 ~* D  a.分离   
' v. S1 \+ R3 T# K$ V6 j  EXEC   sp_detach_db   @dbname   =   '库名'   
+ t1 b5 O3 P: D- Y1 m; ]9 F: S5 P2 v: c8 M
  b.删除日志文件   8 A# E7 u, H1 R' s& A

; o! W" |' A; t  c.再附加   9 M: x5 ~3 V$ N7 D
  EXEC   sp_attach_single_file_db   @dbname   =   '库名',     ! T0 A& F% S; _; W0 D- Q6 j: N
        @physname   =   'crogram   FilesMicrosoft   SQL   ServerMSSQLData库名.mdf'   ( V  H! r2 Q  F' D

$ v; E' w& O8 J  5.为了以后能自动收缩,做如下设置:   . \. Q% H- E/ f/ y& f$ t
  企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"   
/ g$ a" _) }7 d1 s$ V0 u
2 N4 _- \7 k: y% U5 c+ T  --SQL语句设置方式:   % \0 i. R: e0 D. D1 B
  EXEC   sp_dboption   '库名',   'autoshrink',   'TRUE'   + x7 a% j& D; Y

$ v' P+ N! |7 I! K; Y  6.如果想以后不让它日志增长得太大   
) M. r7 D: e9 s+ \5 B2 q! ]  企业管理器--服务器--右键数据库--属性--事务日志   ) j- m% W. R4 h8 }
  --将文件增长限制为xM(x是你允许的最大数据文件大小)   9 k; ]0 ?( [3 k

+ @7 w( K" `; m! n6 S" Y" P% y  --SQL语句的设置方式:   + D- A/ l4 ~9 z/ s( O- I' r
  alter   database   库名   modify   file(name=逻辑文件名,maxsize=20)   
2 I0 ?" `+ _# f7 T  ---------------------------------------------------------------------
+ D/ S' F0 U' aSQL Server 控制Ldf文件的大小(清理历史记录 &设定自动缩小)
0 y& H3 u' T% |1 s# F0 k, a0 |4 T# }# s  }7 n; z6 n+ C3 x# O6 a
*清理历史记录
  p0 m) r, ?6 i" F# I0 U% H1. 在SQL Server Enterprice Manager(企业管理器)工具列---进入 SQL Query Analyzer(SQL查询分析器) ( W" s0 ]; [7 K  K/ R: a
2. 输入BACKUP LOG <你的数据库名称> WITH TRUNCATE_ONLY : m1 s  e& n( x! J, x: l
如: BACKUP LOG myXXDB WITH TRUNCATE_ONLY
" t/ X8 p; H4 S4 s
( j4 W8 l, O0 f& r3 a2. 回SQL Server Enterprice Manager, 在该数据库上按右键选[所有工作/压缩数据库], + b4 K% ]# u2 ^! D# q3 o. U
点[文件], 在数据库文件选择该 Log文件, 在[压缩动作]选择[将文件压缩为X MB (最小值为Y MB)],
% w. {/ j& y1 \/ J- `6 ^直接将x改成其建议其最小值y按[确定]即可压缩. ( F; V5 Z& L7 e4 n
先不要离开,再点一次[文件]看看压了多少, 会发现还可以再压, 还会变更小哟! 可以压两三次. - b( {8 [% Z; F8 M+ D, v8 X

& I) {3 _# A1 B3 X! q; e: q总结:其实也就是两个指令就可以完成了 , G( Y6 n, y2 M' a/ q3 e1 k
BACKUP LOG DateBaseName WITH TRUNCATE_ONLY
/ p/ ?$ h# R" zDBCC ShrinkDatabase(DateBaseName)
; r+ C5 I  b9 X; G4 X) n8 T4 `, \  g- l9 d# {4 F: h" ]
*设定数据库自动缩小, 默认值为OFF 7 q* \/ ?( z: Q/ u# ?: |2 o
方法1. 9 F+ I: J1 ~) g! j$ W, O3 k
ALTER DATABASE <你的数据库名称> SET AUTO_SHRINK ON - M1 v) [" M: s
如: ALTER DATABASE myXXDB SET AUTO_SHRINK ON " q4 p2 @- |: Z: B. ?, c1 a, `. N
方法2.
. p% {3 Y- E7 H+ F9 F8 V& z) A& K" g在数据库上按右键选内容(要等一下下), 点[选项]页, 勾选[自动压缩]后按确定 , E  c' E5 i$ R# C

+ c8 W% o0 c4 W5 W% M; F, U& }. _; J* C6 u( a$ }5 i8 T. @
 SQL SERVER日志清除的两种方法 7 U9 |+ b0 @# \: Z( w
  在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……
( K5 `1 V& ~9 J/ U7 ]* c/ O: Q  C$ {: N9 t! V, D
  方法一 & q2 H; J  t* `! Q0 ?& }

* |# e) p% }* I0 h/ J) t& \  一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大
& g; c% T7 _* x$ a. i# N" D; E' X: E4 B  K
  1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存。 : w9 q1 T4 P5 C- N7 X
/ n# E9 Y) t7 S8 E/ I4 E1 D" U
  2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定。
" M" O1 q- e! \4 ]' m& e; ?2 [- K
  3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据
- M, v- I; a. m, e# b) A) R+ D/ S( T! {' g
  F0 `; J& ?" G3 j

- m" ?5 A" B% Z) f+ d& ~4 E& B- _& G) w! B' H- ]0 e
SQLSERVER中讲: ! }; `' I1 L9 }: r! h6 r
, h6 ?/ t# y/ B
BACKUP LOG 数据库名 WITH NO_LOG|TRUNCATE_ONLY可以截断事务日志。 5 j- O  K4 R( S9 N& m9 k  N% o
( Q- q% r, Y! k6 L1 S& l5 a
但我在数据库中进行上述操作后,事务日志还是没有改变。 8 c/ T+ j: {0 T% \4 p4 a9 v
' X' P4 S% M. j: \% Z; {

8 X2 [1 P# w, Y) @8 d  g第一步只是将非活动的事务日志截断,并没有收缩数据库,只有进行第二项操作后,数据库才进行事务日志的清理工作,将截断的非活动事务删除,并将事务日志文件收缩到适当尺寸。
: C2 N3 p5 n/ G# v. V在使用 SQL Server 时,数据库里的日志文件会越来越大,需要把它删除。 我先把这个数据库分离,在数据库上点右键 -> 所有任务 -> 分离数据库,分离之后,就可以把 Log 文件删除,同时也可以把数据进行备份。之后,就可以在所有任务里的附加数据库再把那个数据库添进来,SQL Server 会提示 LOG 文件不存在,问你是不是要新建一个,选是就行了,这样,LOG 文件就清空了。 这个方法只需几分钟的时间,但在这几分钟里,就不能访问这个数据库了,我觉得只适用于小型的应用,对于大型的系统就要找其它方法了。
: [' b* T% t' Z% t
) p1 @9 j' a  q5 g0 Z0 ?
. b. n. r  Q# p: S老马嗖嗖 2007-04-30 13:03
7 v4 P% O1 \3 i& R! [' P* oSQL Server 2000中*.LDF文件是什么作用
4 H6 B8 [! f; h* [9 `9 S/ h  @5 M- `1 r/ W8 N( G
*.mdf是数据文件   ! s! S) l6 C4 q) d
*.ldf是日志文件   
' x5 s7 J( y: V& i! s. a1 d当数据库出现问题时   
" G4 ]! t. k) `可用以下语句恢复   6 K& R2 J# `  i; n4 H
数据恢复一   : j5 s) N( d* K6 F  |
1. 先分离数据库   
" L9 c2 u0 t# h. jexec   sp_detach_db   dbname   
% `& ^" N; G7 x# G: y2. 加上数据库   
; v0 R7 O1 }. k5 h& z: x! Sexec   sp_attach_db   @dbname=’dbname’,@filename1=’d:sql   server...dbname.mdf’,@filename2=’d;sql   server...dbname_log.ldf’   
6 ?$ Q. I; x9 R7 n3 j: m6 I( f  O$ v0 V/ _4 z1 P3 b: x

7 J$ k8 |3 }& \: U老马嗖嗖 2007-04-30 13:04
. o% s' a: S; j7 T3 l  l- g
  h5 n0 V1 n/ P- b1 ~+ e' ?
( A  U7 X1 d8 H1.清空日志
5 ^7 ]8 O: m5 @9 C7 r- C$ L" m( bDUMP TRANSACTION 库名 WITH NO_LOG + Y! z  d) x' X
) x! ?* R# i+ ^. e
2.截断事务日志:
( k9 o- }/ _3 ^6 ^9 S, WBACKUP LOG 数据库名 WITH NO_LOG
" ^, b! y& C) s  ~5 r  X0 X# d- P5 r7 p7 }, c, N
3.收缩数据库文件(如果不压缩,数据库的文件不会减小
# z. o: ~0 x1 H. A$ ]# C6 y企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
1 Q4 |# n' V4 L$ A0 ?* t' `- P; d$ q--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
+ y, `6 |& o/ T, p% w--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 . H$ K5 P' t$ E- g3 k# T

" ?) m1 \- D, Y1 D& y% X4 B5 v也可以用SQL语句来完成
( K: [2 g) G/ M, v& U--收缩数据库
/ b/ M/ H# _/ F  B! P) wDBCC SHRINKDATABASE(客户资料)
4 g& D1 g' k$ g( M. W1 Z, B1 n7 Y6 Y
--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
# E' `/ r& Y/ x% e3 xDBCC SHRINKFILE(1)
* W4 O' B, S8 ^9 o  v5 h" ^) v: [8 j
4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行) ' a- q- x. ?: ?7 t/ S
a.分离数据库:
8 \' P+ ^7 p0 Q3 h5 D' U企业管理器--服务器--数据库--右键--分离数据库 6 a- e( a: y( D6 F" l

9 z' A1 P$ _5 |# db.在我的电脑中删除LOG文件
% m( v" h' B+ b1 S2 B! P. u" Q- g* y* a: [% ?
c.附加数据库: ; w9 B1 w: m. O) s0 h
企业管理器--服务器--数据库--右键--附加数据库 4 V- {/ v1 Z0 L

+ ]' V! n# t& d1 ]4 _此法将生成新的LOG,大小只有500多K
3 F6 q  l- d3 u" b+ L7 {+ ?9 c. j  Y
或用代码:
9 J2 ^! M; O4 |' Q1 J. m下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
/ p* S5 }6 ^/ T" K6 F( L5 d
3 \3 }; _  f8 [2 D. o" {a.分离
6 f: W+ ~: K, A/ G; CEXEC sp_detach_db @dbname = 'pubs' 0 C6 U4 [3 k. W7 W6 m

5 w2 K# m" C5 h2 qb.删除日志文件 + @7 E1 e0 J3 f# T+ v/ n' `6 ?
/ c3 n" r+ W( V
c.再附加 # ]7 `1 }: k# a! @( r! L" L2 _& w
EXEC sp_attach_single_file_db @dbname = 'pubs', + v' s& ^1 j1 B/ w
@physname = 'crogram FilesMicrosoft SQL ServerMSSQLDatapubs.mdf'
) _( R; |. c: v5 H7 d, @: n
! d* l5 |" l% X% Q& G- E' S; X' Z5.为了以后能自动收缩,做如下设置: ! p5 X" K, O% F
企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"
. [4 B$ |: {9 y9 l% P: l% o( E+ ]) C( H- E# z; T* v: Y  Q9 V
--SQL语句设置方式: 0 i. E+ a3 d0 z) N# M& l2 h
EXEC sp_dboption '数据库名', 'autoshrink', 'TRUE' * z% _3 C& h; ~
" Q  x6 O: p& x) Z, f# A6 ^
6.如果想以后不让它日志增长得太大 # f2 w: y: e+ Y8 y+ L- U- i
企业管理器--服务器--右键数据库--属性--事务日志
9 N7 }* d1 S5 i5 O- ~- M( w2 C3 Z--将文件增长限制为xM(x是你允许的最大数据文件大小)
0 _8 H5 g$ C! W9 x6 X
' J6 ?3 s/ v! j% @) H; |+ V0 D--SQL语句的设置方式: % A+ k. N0 q& s( l1 u  l
alter database 数据库名 modify file(name=逻辑文件名,maxsize=20) $ U8 `5 x& T; e; P4 Y
$ s( u" M% {6 V, a; U$ y

% x! d; T; p% k0 D) Qvxfire 2007-08-28 14:19
/ k, b+ F6 m9 u( x# g' U; Q- m我这里.ldf文件比Mdf文件大100G怎么解决啊。,头痛死啦 * y9 M) ~+ A* U
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 21:16 , Processed in 0.102815 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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