|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
两个到底是哪一个给出了MySQL这个名字至今依然是个迷,包括开发者在内也不知道。数据|数据库
--功效申明:减少数据库日记文件
--
--e.g:数据库名为abc
--------------------------------------------------------------
SETNOCOUNTON
DECLARE@LOGICALFILENAMESYSNAME,
@MAXMINUTESINT,
@NEWSIZEINT
USEabc---要操纵的数据库
SELECT@LOGICALFILENAME=abc_LOG,---日记文件名
@MAXMINUTES=10,---LIMITONTIMEALLOWEDTOWRAPLOG.
@NEWSIZE=1---你想设定的日记文件巨细(M)
--SETUP/INITIALIZE
DECLARE@ORIGINALSIZEINT
SELECT@ORIGINALSIZE=SIZE
FROMSYSFILES
WHERENAME=@LOGICALFILENAME
SELECT原日记巨细=ORIGINALSIZEOF+DB_NAME()+LOGIS+
CONVERT(VARCHAR(30),@ORIGINALSIZE)+8KPAGESOR+
CONVERT(VARCHAR(30),(@ORIGINALSIZE*8/1024))+MB
FROMSYSFILES
WHERENAME=@LOGICALFILENAME
CREATETABLEDUMMYTRANS
(DUMMYCOLUMNCHAR(8000)NOTNULL)
DECLARE@COUNTINT,
@STARTTIMEDATETIME,
@TRUNCLOGVARCHAR(255)
SELECT@STARTTIME=GETDATE(),
@TRUNCLOG=BACKUPLOG+DB_NAME()+WITHTRUNCATE_ONLY
DBCCSHRINKFILE(@LOGICALFILENAME,@NEWSIZE)
EXEC(@TRUNCLOG)
--WRAPTHELOGIFNECESSARY
WHILE@MAXMINUTES>DATEDIFF(MI,@STARTTIME,GETDATE())--TIMEHASNOEEXPIRED
AND@ORIGINALSIZE=(SELECTSIZEFROMSYSFILESWHERENAME=@LOGICALFILENAME)
AND(@ORIGINALSIZE*8/1024)>@NEWSIZE
BEGIN--OUTERLOOP.
SELECT@COUNT=0
WHILE((@COUNT<@ORIGINALSIZE/16)AND(@COUNT<50000))
BEGIN--UPDATE
INSERTDUMMYTRANSVALUES(FILLLOG)
DELETEDUMMYTRANS
SELECT@COUNT=@COUNT+1
END
EXEC(@TRUNCLOG)
END
SELECT新日记巨细=FINALSIZEOF+db_NAME()+LOGIS+
CONVERT(VARCHAR(30),SIZE)+8KPAGESOR+
CONVERT(VARCHAR(30),(SIZE*8/1024))+MB
FROMSYSFILES
WHERENAME=@LOGICALFILENAME
DROPTABLEDUMMYTRANS
SETNOCOUNTOFF
有了数据以后,我们就要想一个比较统一的方法来闪回。上面我们说了对于DML操作,可以通过反向执行所有逆操作来实现,对于语句里面的DDL,只能直接跳过。原因是一个DDL不一定有直接的逆操作。 |
|