由于经常和数据库打交道,经常见到在客户的机器上,SQL server数据库日志文件的大小,远远超过于数据库数据文件的大小,客户用的都是一些服务器,磁盘空间有的是,当然不在乎这点文件,可以,当客户要求查找一些数据的时候,就不得不备份客户的数据库,经常是备份回来的数据库,无法还原,原因就是我的PC上没有这么大的空间来还原,无奈啊,
只有把客户的数据库日志缩小一下了,于是从网上找了以下代码,可以收缩数据库日志,我执行了一下,日志缩小的,不过有一个错误产生,还没来的急分析,先不管他,达到目的才是硬道理
SET
NOCOUNT
ON
DECLARE
@LogicalFileName
sysname,
@MaxMinutes
INT
,
@NewSize
INT


USE
bbbbb
--
要操作的数据库名
SELECT
@LogicalFileName
=
'bbbbb
_Log
'
,
--
日志文件名
@MaxMinutes
=
100
,
--
数据库操作的超时上限.
@NewSize
=
100
--
你想设定的日志文件的大小(M)
--
Setup / initialize
DECLARE
@OriginalSize
int
SELECT
@OriginalSize
=
size
FROM
sysfiles
WHERE
name
=
@LogicalFileName
SELECT
'
Original Size of
'
+
db_name
()
+
'
LOG is
'
+
CONVERT
(
VARCHAR
(
30
),
@OriginalSize
)
+
'
8K pages or
'
+
CONVERT
(
VARCHAR
(
30
),(
@OriginalSize
*
8
/
1024
))
+
'
MB
'
FROM
sysfiles
WHERE
name
=
@LogicalFileName
CREATE
TABLE
DummyTrans
(DummyColumn
char
(
8000
)
not
null
)

DECLARE
@Counter
INT
,
@StartTime
DATETIME
,
@TruncLog
VARCHAR
(
255
)
SELECT
@StartTime
=
GETDATE
(),
@TruncLog
=
'
BACKUP LOG
'
+
db_name
()
+
'
WITH TRUNCATE_ONLY
'

DBCC
SHRINKFILE (
@LogicalFileName
,
@NewSize
)
EXEC
(
@TruncLog
)
--
Wrap the log if necessary.
WHILE
@MaxMinutes
>
DATEDIFF
(mi,
@StartTime
,
GETDATE
())
--
当操作未超时
AND
@OriginalSize
=
(
SELECT
size
FROM
sysfiles
WHERE
name
=
@LogicalFileName
)
AND
(
@OriginalSize
*
8
/
1024
)
>
@NewSize
BEGIN
--
Outer loop.
SELECT
@Counter
=
0
WHILE
((
@Counter
<
@OriginalSize
/
16
)
AND
(
@Counter
<
50000
))
BEGIN
--
update
INSERT
DummyTrans
VALUES
(
'
Fill Log
'
)
DELETE
DummyTrans
SELECT
@Counter
=
@Counter
+
1
END
EXEC
(
@TruncLog
)
END
SELECT
'
Final Size of
'
+
db_name
()
+
'
LOG is
'
+
CONVERT
(
VARCHAR
(
30
),size)
+
'
8K pages or
'
+
CONVERT
(
VARCHAR
(
30
),(size
*
8
/
1024
))
+
'
MB
'
FROM
sysfiles
WHERE
name
=
@LogicalFileName
DROP
TABLE
DummyTrans
SET
NOCOUNT
OFF