最近在轉移數據,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中傳說中的動態執行字符串,當然需要拼湊語句。