# 清除SQL Server Log檔 (交易紀錄) ## 明明資料表都刪完了,但檔案還是很大? 試試看檢查以及清除交易紀錄 資料庫使用久了,Log檔(交易紀錄)也會持續增加,如果沒有限制Log的成長,某天可能會發現硬碟滿了,資料庫會出現下面這樣的錯誤訊息 --- :::info 訊息 9002 .... 資料庫 'TestDB' 的交易記錄已滿。如果要了解為何無法重複使用記錄中的空間,請參閱 sys.databases 中的 log_reuse_wait_desc 資料行。 ::: --- ## 查看資料庫的 資料 和 交易紀錄 兩者的磁碟使用量 如果想知道資料庫用掉多少容量,可以透過 報表 檢查磁碟使用量,在資料庫上按右鍵 > 報表 > 標準報表 > 磁碟使用量 ![](https://i.imgur.com/D2zVnDL.png) 在報表看到保留的交易紀錄空間 就是可以清除的檔案 ![](https://i.imgur.com/31k1Ohp.png) 交易紀錄也可以用來查看資料庫執行的各種操作紀錄 例如 RiCo寫的[透過交易紀錄檔找出誰刪除資料表](https://dotblogs.com.tw/ricochen/2012/10/03/75261) --- ## 使用指令清除交易紀錄 Log 檔案 有時候操作久了,實際資料沒有很大,但LOG檔高達幾十GB都有可能,在SQL Server 2008以上都可以使用以下的指令來做清除 目前實測 Server 2008~2019 都可以使用 如果已經是在指定的資料庫,可以直接執行這一段語法,就會清除該資料庫的紀錄 ```=sql DECLARE @LogicalName nvarchar(128) DECLARE @DataBaseName nvarchar(128) SELECT @LogicalName = f.name, @DataBaseName = d.name FROM sys.master_files f INNER JOIN sys.databases d ON d.database_id = f.database_id where d.name = DB_NAME() ALTER DATABASE CURRENT SET RECOVERY SIMPLE WITH NO_WAIT DBCC SHRINKFILE(@LogicalName, 1) ALTER DATABASE CURRENT SET RECOVERY FULL WITH NO_WAIT ``` 上述的作法會取得目前的資料庫與邏輯紀錄檔名稱,假設要手動指定資料庫也可以,將下列的資料庫名稱與記錄檔邏輯名稱換掉即可 ```=sql USE [資料庫名稱] GO ALTER DATABASE [資料庫名稱] SET RECOVERY SIMPLE WITH NO_WAIT DBCC SHRINKFILE(記錄檔邏輯名稱, 1) ALTER DATABASE [資料庫名稱] SET RECOVERY FULL WITH NO_WAIT GO ``` 換完之後大概長這樣 ```=sql USE [TestDB] GO ALTER DATABASE [TestDB] SET RECOVERY SIMPLE WITH NO_WAIT DBCC SHRINKFILE(TestDB_log, 1) ALTER DATABASE [TestDB] SET RECOVERY FULL WITH NO_WAIT GO ``` 邏輯名稱可在資料庫上按右鍵=>[屬性]=>[檔案]中查看 ![](https://i.imgur.com/Y41FTjW.png) 注意資料和紀錄的兩個邏輯名稱預設通常不相同,例如: * TestDB * TestDB_log ![](https://i.imgur.com/sPQyinD.png) 也可以直接使用這段sql語法,取出所有的資料庫名稱、邏輯名稱、實體路徑等資料 ```=sql SELECT d.name DatabaseName, f.name LogicalName, f.physical_name AS PhysicalName, f.type_desc TypeofFile FROM sys.master_files f INNER JOIN sys.databases d ON d.database_id = f.database_id GO ``` ## 清除交易紀錄,容量前後差多少? * 這個清除就真的是清空,我有一個資料庫約使用半年,交易紀錄146MB,清除完就剩1MB ![image](https://hackmd.io/_uploads/Hk0gwg1UT.png) --- ## 參考來源 * 清除 SQL Server Log 檔 https://emn178.pixnet.net/blog/post/76202708 * SELECT @local_variable (Transact-SQL) https://docs.microsoft.com/zh-tw/sql/t-sql/language-elements/select-local-variable-transact-sql?view=sql-server-ver15 * How can I retrieve the logical file name of the database from backup file https://stackoverflow.com/questions/7089627/how-can-i-retrieve-the-logical-file-name-of-the-database-from-backup-file * ALTER current database without using its name https://stackoverflow.com/questions/14275935/alter-current-database-without-using-its-name ###### tags: `資料庫`