sqlserver中压缩日志文件
最近在转移数据,sqlserver的日志文件ldf,占用空间特别大,为了还原库,节省空间,所以压缩日志文件迫在眉睫。在网上找了一段代码:
1 USE [master] 2 GO 3 ALTER DATABASE AFMS SET RECOVERY SIMPLE WITH NO_WAIT 4 GO 5 ALTER DATABASE AFMS SET RECOVERY SIMPLE 6 GO 7 USE AFMS 8 GO 9 DBCC SHRINKFILE (N'AFMS_Log' , 11, TRUNCATEONLY) 10 GO 11 USE [master] 12 GO 13 ALTER DATABASE AFMS SET RECOVERY FULL WITH NO_WAIT 14 GO 15 ALTER DATABASE AFMS SET RECOVERY FULL 16 GO
把数据库名称替换成自己的数据库即可,还真的可以压缩,我几个G的数据量直接压缩到了11M大小,我很是惊讶。那么我们先来理解下 DBCC SHRINKFILE 命令,它的语法如下:
DBCC SHRINKFILE
( { file_name | file_id }
{ [ ,target_size ]
| [ , { EMPTYFILE | NOTRUNCATE | TRUNCATEONLY } ]
}
)
参数
file_name
是已收缩文件的逻辑名称。文件名必须符合标识符的规则。
file_id
是要收缩的文件的标识 (ID) 号。若要获得文件 ID,请使用 FILE_ID 函数或在当前数据库中搜索 sysfiles。
target_size
是用兆字节表示的所要的文件大小(用整数表示)。如果没有指定,DBCC SHRINKFILE 将文件大小减少到默认文件大小。
EMPTYFILE
将所有数据从指定文件中迁移到同一文件组中的其它文件
NOTRUNCATE
导致将释放的文件空间保留在文件中。
TRUNCATEONLY
导致文件中的任何未使用的空间释放给操作系统,并将文件收缩到上一次分配的大小,从而减少文件大小,而不移动任何数据。不尝试将行重新定位到未分配页。如果使用 TRUNCATEONLY,将忽略 target_size
看了这个解释,是不是对这个命令有所了解呢?
如果对日志文件的逻辑名称不清楚的话,用下面这句sql可以直接查出来:
SELECT file_id, name FROM sys.database_files
如果我们要压缩多个数据库日志文件,用上面的命令一一执行的话,于是就产生了好多个Ctrl+C、Ctrl+V,这不符合“Don't Repeat YourSelf”原则。看看我改进后的代码:
1 declare @dbName varchar(20) 2 declare @dbNamelog varchar(20) 3 4 5 select @dbName='NF_Group' 6 select @dbNamelog='NF_Group_log' 7 8 9 declare @sql nvarchar(2000) 10 11 set @sql=' 12 13 USE '+@dbName+' 14 15 ALTER DATABASE '+@dbName+' SET RECOVERY SIMPLE WITH NO_WAIT 16 17 ALTER DATABASE '+@dbName+' SET RECOVERY SIMPLE 18 19 USE '+@dbName+' 20 21 DBCC SHRINKFILE (N'''+@dbNamelog+''' , 11, TRUNCATEONLY) 22 23 USE '+@dbName+' 24 25 ALTER DATABASE '+@dbName+' SET RECOVERY FULL WITH NO_WAIT 26 27 ALTER DATABASE '+@dbName+' SET RECOVERY FULL 28 29 30 31 SELECT file_id, name FROM sys.database_files' 32 33 exec(@sql)
这个就是sql中传说中的动态执行字符串,当然需要拼凑语句。