MSSQL清理日志\刪除數據\收縮數據庫


  首先解釋一下數據庫的版本是SQL Server 2012。清除的數據庫800多G,磁盤空間就剩10多G,數據量最多的表有2億。目的就是清楚去年的數據(2017年之前),遇到了一些問題,總結起來就是三方面問題:

  1.如何清理日志文件。

  2.刪除千萬級別的數據。

  3.數據庫的收縮操作。

 

一、清除日志文件

   剛開始直接用delete語句刪除給報了兩次錯誤:“The transaction log for database 'DB' is full due to 'ACTIVE_TRANSACTION'. ”。我看了一下原來是數據庫磁盤空間不足了(還剩9M),數據庫日志文件的空間是不夠的,所以要先清一下日志文件,騰出來點空間。

  1.分離數據庫,在數據庫上右鍵-【任務】-【分離】,將數據庫刪除連接。

 

  

  2.找到數據庫DB的所對應的文件日志--DB_log.ldf,之后把這個文件刪掉。

  

  3.附加數據庫,在數據庫上右擊-【附加】。

  

  

 

 4。假如直接選擇數據庫文件附加上去,就會直接報上圖的錯誤。

 這個時候我們就要新建一個日志文件,執行下邊命令即可。

 這個地方用命令執行。

use master; exec sp_detach_db @dbname='DB'; exec sp_attach_single_file_db @dbname='DB',@physname='C:\Program Files (x86)\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\DB.mdf'

至此,數據庫就能附加上去了,這樣節省出來空間20多個G。

 

問題二:刪除大量數據(千萬級別)

  以前刪除數據都是用Delete直接刪除,Delete操作會被記錄到日志里,所以說會很耗硬盤空間和時間。如果刪除中間發生中斷,一切刪除會回滾。

所以說,對於這種情況有兩種做法,一種是把數據分成多個批次進行刪除;第二種是將需要的數據給查出來存到新的臨時表里,之后將原來的數據表刪除,最后將臨時表的名字改成原來的名字。

--方法一、通過top方法
WHILE
1 = 1 BEGIN DELETE TOP (5000) FROM Orders WHERE orderdate < '20170101'; IF @@rowcount < 5000 BREAK; END GO
--方法二 --①先讀取需要的數據到臨時表
 Select * into  ordersnew from Orders Where orderdate>='2017-01-01'

--②先清空,后刪除。Truncate這個不會有日志記錄。或者直接用圖形界面刪。 Truncate table Orders delete from Orders
--③對ordersnew 表進行重命名 exec sp_rename 'ordersnew' ,'Orders'

注意:第二種方法,數據表的主鍵,外鍵,索引這些東西會消失,所以說,清完數據后,要重新建立。

三:數據庫的收縮

  在對幾個大表進行數據清除后,發現磁盤還是10個G左右,並沒有像想象中的增大。原來是因為刪除數據(delete或truncate)是不會收縮文件的物理空間的。刪除數據后的空閑空間,將會留給以后數據增長時使用。如果想要收縮文件的物理空間大小,可以使用收縮數據庫和收縮文件。對應是DBCC SHRINKDB和DBCC SHRINKFILE兩個命令。

 

DBCC  SHRINKDATABASE('DB') --收縮數據庫

 

或者用圖形界面操作【任務】-【收縮】-【數據庫】。不過因為數據量比較大,所以時間還是比較長的。

 

 

 

 總結:對於數據庫還有很多不太清楚的地方,如收縮數據庫語句,日志的清理語句。以后慢慢研究吧

 

 


免責聲明!

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



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