首先解釋一下數據庫的版本是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') --收縮數據庫
或者用圖形界面操作【任務】-【收縮】-【數據庫】。不過因為數據量比較大,所以時間還是比較長的。
總結:對於數據庫還有很多不太清楚的地方,如收縮數據庫語句,日志的清理語句。以后慢慢研究吧