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

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM