In einem Projekt mit einem vCenter System und nur insgesamt vier ESX Servern hatten wir uns für die kostenfreie Variante des SQL Servers SQL 2008 Express Edition entschieden, da die gesamte zu erwartende Datenbankgröße vom vCenter auf unter 3,0GB angegeben wurde. Leider wuchs die SQL Datenbank schneller als berechnet und erwartet, so dass der vCenter Dienst nicht mehr startbar war und ein Purgen von Tasks und Events über das vCenter System selber nicht mehr möglich war.
Das Dilemma, eine Komprimierung der SQL Datenbank führte zwar zu dem gewünschten Ergebnis (DB < 2GB) aber die Express Variante startet keine komprimierten SQL DBs! Eine Einschränkung, die mir auch neu war. Daher half nur Folgendes:
- Neue Windows VM anlegen
- Testvariante SQL Server 2008 EE kostenfrei bei MS herunterladen
- SQL Server installieren
- VMDKs mit der SQL DB, TransAktLogs und Backup an den temporären SQL mounten
- SQL Benutzer und -berechtigungen anlegen
- VCDB_table_cleanup_MSSQL.sql Skript anpassen und ausführen
- VMDKs wieder zurückmounten
- DB starten, vCenter Dienst starten!
Das Skript beinhaltet einen konfigurierbaren Teil:
/*
VCDB_table_cleanup_MSSQL.sql,v 3.0 2009/08/31
This script will delete data from designated tables in the VirtualCenter DB
for 2.0.x , 2.5.x and vc4.0 versions.
You are strongly advised to shut down the VirtualCenter server and make
a complete backup of your database before running this script.
VirtualCenter Server must be stopped while this script is running.
Please see USER CONFIGURABLE PARAMETERS section below for options.
In particular, you must set @DELETE_DATA = 1 in order to actually delete rows;
this is a safety precaution.
Directions: open this file with one of the following and execute:
SQL Query Analyzer (SQL Server 2000) or
SQL Server Management Studio (SQL Server 2005)
SQL Server Management Studio (SQL Server 2008)
Connect using the same DB login that VirtualCenter uses.
The transaction log may fill up during this procedure if sufficient space
is not available. Monitor the transaction log size and usage with this command:
dbcc sqlperf (logspace)
*/
IF OBJECT_ID('tempdb..#CLEANUP_VCDB') IS NOT NULL
DROP TABLE #CLEANUP_VCDB
GO
SET NOCOUNT ON
DECLARE @VCUSER NVARCHAR(60)
DECLARE @VCUSERID INT
DECLARE @BATCH_SIZE INT
DECLARE @CUTOFF_DATE SMALLDATETIME
DECLARE @CUTOFF_DATE_S NVARCHAR(60)
DECLARE @DELETE_DATA BIT
DECLARE @CNT INT
DECLARE @TOT INT
DECLARE @SQL NVARCHAR(900)
DECLARE @FROM_VAL NVARCHAR(60)
DECLARE @WHERE_VAL NVARCHAR(900)
-- ######### USER CONFIGURABLE PARAMETERS ########################
-- 0 = COUNT ONLY; 1 = DELETE ROWS
SET @DELETE_DATA = 0
-- Use one of these methods to specifiy the data cutoff date
SET @CUTOFF_DATE = GETUTCDATE()-180
--SET @CUTOFF_DATE = '2007/01/01'
-- Number of rows to delete per transaction
SET @BATCH_SIZE = 10000
-- ######### END USER CONFIGURABLE PARAMETERS ####################
...
In diesem Fall dürfen es auch ein paar Nullen am Ende mehr sein, je nachdem wie viele Zeilen in dieser tabelle enthalten sind. Ferner ist die Variable zum Löschen auf den Wert "1" zu setzen.
Das Skript ruft man besten über die SQL Management Studio Anwendung auf. Da die Änderungen zunächst in den Transaktions-Logs abgelegt werden, sollte auf den entsprchenden VMDKs genügend (> 5GB) Speicherplatz zur Verfügung stehen.
Der Vorgang dauert allerdings ja nach Rechenleistung bis zu mehreren Stunden! Das muss man schon berücksichtigen, da das vCenter für diese Zeit nicht zur Verfügung steht.
Das Skript kann ich gerne per E-Mail weiterleiten, der Link auf der VMware Website ist leider verschwunden... .