SQLServer日志收縮的兩種方法實現(xiàn)
在日常運維中,有時會遇到“The transaction log for database ‘xxxx’ is full due to ‘ACTIVE_TRANSACTION’.”這樣的報錯信息。
此錯誤消息表明:數(shù)據(jù)庫的事務日志文件空間耗盡,log 文件不能再存儲新的transaction log。
這個時候我們需要進行日志收縮。本文將介紹日志收縮的兩種方法。
通過圖形界面進行日志收縮
第一步:右鍵數(shù)據(jù)庫屬性

第二步:更改數(shù)據(jù)庫恢復模式,將模式改為Simple。

第三步:右鍵數(shù)據(jù)庫,Tasks→Shrink→Files 。

第四步:收縮數(shù)據(jù)庫日志,選擇文件類型Log,并在Shrink action 中將文件收縮到給出的Minimum 值,這里的數(shù)據(jù)庫因為是新建的沒有數(shù)據(jù),所以提供的Minimum 值為0MB,可以將紅框3中的數(shù)字修改為0。

- File type:選擇所要收縮的是“數(shù)據(jù)庫文件”還是“日志文件”。
- Currebtly allocated space:數(shù)據(jù)庫為該文件分配的大小,就是在磁盤上看到的文件大小。
- Available free space:就是“當前分配的空間” 減去“實際使用的空間”。
Shrink action:
① Release unused space:將該文件中未使用的空間釋放出來,數(shù)據(jù)在文件中不移動;
② Reorganize pages before releasing unused space:此選項可以將文件收縮到“指定大小”,并將數(shù)據(jù)重新組織。其最小值為數(shù)據(jù)庫“實際使用的空間”;
③ Empty file by migrating the data to other files in the same filegroup:該選項很少用。
上述操作也可以使用T-SQL替代:
DBCC ShrinkFile(‘數(shù)據(jù)庫名', targetsize); /* 收縮數(shù)據(jù)庫文件 */ DBCC ShrinkFile(‘數(shù)據(jù)庫名_log', targetsize); /* 收縮日志文件 */
Targetsize:單位為兆,必須為整數(shù),DBCC SHRINKFILE 嘗試將文件收縮到指定大小。
DBCC SHRINKFILE 不會將文件收縮到小于“實際使用的空間”大小,例如“分配空間”為10M,“實際使用空間”為6M,當制定targetsize為1時,則將該文件收縮到6M,不會將文件收縮到1M。
用本例中的數(shù)據(jù)庫替換后如下:
DBCC ShrinkFile(‘TEST01', 1); /* 收縮數(shù)據(jù)庫文件 */ DBCC ShrinkFile(‘TEST01_log', 1); /* 收縮日志文件 */
注意:如若磁盤空間已滿,無法進行收縮數(shù)據(jù)庫事務日志文件,可采取先分離出部分暫未使用的數(shù)據(jù)庫,然后將MDF文件及LDF文件進行拷貝到其他空余盤,進行釋放磁盤空間,待日志收縮后,再次將分離出的數(shù)據(jù)庫文件進行附加。
分離數(shù)據(jù)庫操作如下:
右擊數(shù)據(jù)庫,Task→Detach

點擊OK

此時發(fā)現(xiàn)數(shù)據(jù)庫列表中已經(jīng)沒有TEST01,說明數(shù)據(jù)庫分離成功了。

附加數(shù)據(jù)庫操作如下:
右擊Databases,單擊Attach

點擊Add,添加數(shù)據(jù)庫文件

選擇需要添加的文件后點擊OK

檢查添加的文件無誤后,點擊OK

此時在數(shù)據(jù)庫列表中可看到剛附件上去的數(shù)據(jù)庫TEST01

若未顯示TEST01,請刷新數(shù)據(jù)庫列表

通過 Transact-Sql 進行日志收縮
執(zhí)行如下命令:
USE [數(shù)據(jù)庫名] GO ALTER DATABASE [數(shù)據(jù)庫名] SET RECOVERY SIMPLE WITH NO_WAIT GO --設為簡單模式 ALTER DATABASE [數(shù)據(jù)庫名] SET RECOVERY SIMPLE GO USE [數(shù)據(jù)庫名] GO DBCC SHRINKFILE (N'[log文件名]', [ targetsize], TRUNCATEONLY) GO USE [數(shù)據(jù)庫名] GO ALTER DATABASE [數(shù)據(jù)庫名] SET RECOVERY FULL WITH NO_WAIT GO --還原為完全模式 ALTER DATABASE [數(shù)據(jù)庫名] SET RECOVERY FULL GO
[數(shù)據(jù)庫名]替換為具體數(shù)據(jù)庫, [ targetsize]替換為收縮目標值。
替換為本例中的數(shù)據(jù)庫修改如下:
USE TEST01 GO ALTER DATABASE TEST01 SET RECOVERY SIMPLE WITH NO_WAIT GO --設為簡單模式 ALTER DATABASE TEST01 SET RECOVERY SIMPLE GO USE TEST01 GO DBCC SHRINKFILE (N'TEST01_log', 1, TRUNCATEONLY) GO USE TEST01 GO ALTER DATABASE TEST01 SET RECOVERY FULL WITH NO_WAIT GO --還原為完全模式 ALTER DATABASE TEST01 SET RECOVERY FULL GO
到此這篇關于SQLServer日志收縮方法實現(xiàn)的文章就介紹到這了,更多相關SQL 日志收縮內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SQL Server誤區(qū)30日談 第8天 有關對索引進行在線操作的誤區(qū)
在線索引操作會在操作開始時和操作結束時對資源上短暫的鎖。這有可能導致嚴重的阻塞問題2013-01-01
SQL中遇到多條相同內容只取一條的最簡單實現(xiàn)方法
本文主要介紹SQL中遇到多條相同內容只取一條的最簡單實現(xiàn)方法,比較實用,希望能給大家做一個參考。2016-06-06
sqlserver禁止management studio的自動提交事務
默認management studio是自動提交事務,即一個語句就一個事務,那么如何禁止其自動提交呢?下面有個不錯的方法,大家可以參考下2014-06-06
SQL數(shù)據(jù)庫實例名稱找不到或遠程連接失敗并顯示錯誤error40的原因及解決辦法
這篇文章主要介紹了SQL數(shù)據(jù)庫實例名稱找不到或遠程連接失敗并顯示錯誤error40的原因及解決辦法,需要的朋友可以參考下2015-11-11
SQL?Server超詳細使用教程之從安裝到編寫SQL語句詳解
這篇文章詳細介紹了如何安裝SQL?Server和SQL?Server?Management?Studio,并通過編寫SQL語句進行數(shù)據(jù)庫操作,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-12-12
判斷一個表的數(shù)據(jù)不在另一個表中最優(yōu)秀方法
判斷一個表的數(shù)據(jù)不在另一個表中最優(yōu)秀方法2009-11-11

