首页 > 代码库 > 解析SQLServer事务日志压缩与删除的方法

解析SQLServer事务日志压缩与删除的方法

做项目的时候拿到一个只有280M的数据库备份,可是在SQLServer 2000下恢复的时候等了半天才都没有恢复完毕,感觉很不可思议,于是怀疑有什么猫腻。到了数据文件的目录下一看,果不其然竟然声称了一个接近10G的数据库日志文件!以前从来没有做过那么多数据的数据库,而且更没有做过有3年数据库日志记录的数据库。

    这对于硬盘空间不是很充裕的我来说已经超过了能够忍受的极限,而且另一个80M的数据库回复之后生成的日志文件更是夸张的达到了5G+!这是不能忍受的,也是不能被原谅的。
    刚开始的时候不太懂,直接把数据库日志删除了,发现这样数据库就不能用了,于是百度了一下,发现网上很多提到了日志的压缩和删除技术,正是我想要掌握的内容。仔细整理了一下,大致有这么几种方法解决。
------------------------

方法一:  这是对数据库和日志进行收缩,比较麻烦,也不是我想要的。

第一步: 

backup log database_name with no_log

或者 backup log database_name with truncate_only

no_logtruncate_only是在这里是同义的,随便执行哪一句都可以。 

第二步: 

1.收缩特定数据库的所有数据和日志文件,执行: 

dbcc shrinkdatabase (database_name,[,target_percent])

 database_name是要收缩的数据库名称;target_percent是数据库收缩后的数据库文件中所要的剩余可用空间百分比。

2.收缩一次一个特定数据库中的数据或日志文件,执行

dbcc shrinkfile(file_id,[,target_size])

file_id是要收缩的文件的标识 (ID) 号,若要获得文件 ID,请使用 FILE_ID 函数或在当前数据库中搜索 sysfiles;target_size是用兆字节表示的所要的文件大小(用整数表示)。如果没有指定,dbcc shrinkfile 将文件大小减少到默认文件大小。两个dbcc都可以带上参数notruncate或truncateonly,具体意思查看联机帮助. 

-----------------------------------

方法二:  这个正是我想要的,删除原来的日志文件。但是在操作的时候总是提示我数据库正在使用当中,如果我停掉数据库管理器有进不去企业管理器找到要收缩的数据库,没办法只好放弃,改试第三种。

第一步: 

先备份整个数据库以备不测 。 

第二步: 

备份结束后,在Query Analyzer中执行如下的语句: 

exec sp_detach_db yourDBName,true

卸除这个DB在MSSQL中的注册信息 

第三步: 

到日志的物理文件所在的目录中去删除该日志文件或者将该日志文件移出该目录

第四步: 

在Query Analyzer中执行如下的语句:

exec sp_attach_single_file_db yourDBName,‘

d:\mssql\data\yourDBName_data.mdf ‘

以单文件的方式注册该DB,如果成功则MSSQL将自动为这个DB生成一个500K的日志文件。 

---------------------------------------

方法三:  完美解决!

1. 进入企业管理器,选中数据库,比如demo 

2. 所有任务->分离数据库 

3. 到数据库文件的存放目录,将demo_log.LDF文件删除,以防万一,你可以拷出去,或者是给它改名

4. 企业管理器->附加数据库,选demo,这个时候你会看见日志文件这项是一个叉,不要紧,继续,此时数据库就会提示你该数据库无日志是否创建一个新的,确定就是了。 

5. 记得数据库重新附加后用户要重新设置一下。 

如果以后,不想要它变大: 

SQL2000下使用: 

在数据库上点右键->属性->选项->故障恢复-模型-选择-简单模型。 

或用SQL语句: 

alter database 数据库名 set recovery simple

----------------------------------------

    第三种办法完美解决了我的问题,真是令人愉快的一天啊!而且安装好了数据库之后很顺利的能够对项目进行部署了,希望接下来一切顺利。