SchlagwortDISK

VMWare – Shrink/Compact Disk eines Linux Gastes

Im Zeitalter von SSDs ist man wieder mehr darauf bedacht, Speicherplatz zu sparen. Im Normalfall hat man seine VMs ja heutzutage auf eher kleineren SSD liegen, so dass man sicher stellen muss, dass diese Files von Zeit zu Zeit “ge-shrinked” werden.

Ein einfaches schrinken des Diskfiles unter VMWare führt in den meisten fällen nicht zu gewünschten Ergebnis.

So sind beispielsweise nur ~13GB im Gast belegt, das Diskfile ist jedoch ganze 100GB groß. Um für VMWare den freien Speicherplatz zu markieren, muss dieser mit NULL/Zero vollgeschrieben werden. Dies mach aber auch nur sinn, wenn vorher alle Daten an den Anfang des Files verschoben wurden. Somit besteht die Prozedur aus 1. dem Defragmentieren und 2. dem Wipen der Disk, wo sich keine Daten befinden.

# 1. Defragmentieren (no need to un/remount anything)
sudo e4defrag /

#Fehler können ignoriert werden. Symlinks & Devices können nicht defragmentiert werden.

#2. Wipe the unused disk.
dd if=/dev/zero of=wipefile bs=1M; sync; rm wipefile

#3. Starte den VMWare Shrink Prozess
sudo vmware-toolbox-cmd disk shrinkonly

Danach wurden knapp 87GB wieder freigegeben, da diese nicht benutzt wurden.

Shrink MSSQL Server LDF File

Heute fiel mir auf meinem DB Server auf, dass die LDF Datei extrem angewachsen war. Warum wurde ich darauf aufmerksam? Weil meine Platte voll war :/ Ein Tool, dass zur Festplattenauslastung benutzt werden kann ist Treesize.

Um nun die LDF zu shrinken, einfach aus dem Management Studio, folgendes Skript ausführen. Dabei ist darauf zu achten, das ihr FTSDB durch euren Datenbank ersetzt.

SET NOCOUNT ON 
DECLARE @OFF_DB sysname = 'FTSDB' 

Begin 
 declare @database          sysname 
       ,@Login           sysname 
       ,@Host            sysname 
       ,@OsUser          sysname 
       ,@SP_ID           smallint 
       ,@CRLF            varchar(2) 
       ,@SQL_Stmt        nVarchar(500) 
       ,@NotifyMsg       nVarchar(500) 

 declare cr_processes cursor for 
     select spid, 
         db_name(dbid) as DbName, 
         loginame      as Login, 
         hostname      as Host, 
         nt_username   as OSUser 
     from master..sysprocesses   
     where spid >=50 AND spid <> @@SPID 

 -- close/kill all connections for this database 
 open cr_processes 
 while 1 = 1 begin 
     fetch cr_processes INTO @SP_ID, @database, @Login, @Host, @OSUser 
     if @@FETCH_STATUS <> 0 break   

     IF lower(@database) = lower(@OFF_DB) BEGIN 
         select @SQL_Stmt = N'kill ' + cast( @SP_ID as varchar(10)) 
         print 'Killing Process : ' + cast( @SP_ID as varchar(10)) + ' for db=' + @Database 
         execute sp_executesql @SQL_Stmt 
     END 
 end 
 close cr_processes 
 deallocate cr_processes 
End 


ALTER DATABASE [FTSDB] SET RECOVERY SIMPLE 
DBCC SHRINKDATABASE ('FTSDB') 
ALTER DATABASE [FTSDB] SET RECOVERY FULL