VMware : แก้ปัญหา DB MSSQL ของ vCenter เต็ม 4 GB
อาทิตย์ที่ผ่านมาไป Training ที่ SG กะกว่าจะ Remote มา Test งานที่ Office พอเข้ามาได้ เจอปัญหาว่าไม่สามารถใช้งาน vCenter ไม่ได้ .. -_-” ก็หาดูว่าเกิดปัญหาที่ส่วนไหน ก็เริ่มหาสาเหตุ ?
1. ลองดูที่ Service ของ VMware ก่อน .. มัน Stop นี่น่าาา สั่ง Start สิ .. ฮ่าาา
2. งั้น Connect ใหม่ ดู ก็ไม่สำเร็จ Service เจ้ากรรม ก็ดัน หยุด หายยย ! ซะงั้น …
3. เอาไงดี .. งั้นไปดูที่ Event Log ก็พบว่า ..
CREATE DATABASE or ALTER DATABASE failed because the resulting cumulative database size would exceed your licensed limit of 4096 MB per database.
4. เอาไงดีเนี่ย Data Base ของ MSSQL Express มันรองรับ Database สูงสุดที่ 4 GB ..
5. คิดได้ก็จัดการลบไฟล์ Data มันสิ .. แต่ ๆๆๆๆ แล้วลบอันไหนดี เลยค้นหา ใน Google ไปพบว่า Table ที่ใช้งานเยอะจะเป็น Table vpx_event_arg
6. รู้แบบนี้ก็จัดการลบข้อมูลมันซะ เพราะว่ามันแค่เก็บ Event Log เอง .. จัดการด้วยคำสั่ง
use “VIM_VCDB”
truncate table vpx_event_arg;
delete from vpx_event;
7. เย้ ในที่สุดก็ Start Database ได้และ Connect vCenter ได้แล้ว ก็เลยมาจัดการเรื่อง Log ต่อให้มันเก็บน้อย ๆ หน่อย … ถือว่าจบแล้วว …
อัพเดท 2012.03.14
วันนี้เจอลูกค้าที่มีปัญหาแบบเดียวกันนี้ แต่ เมื่อรันคำสั่งด้านบนแล้วไม่สามารถแก้ไขได้ เนื่องจากไฟล์ของ Log มีขนาดใหญ่ขึ้นมาก จึงต้องทำให้เข้าไปค้นใน Google ก็ได้พบวิธีแก้ไข .. โดยมีการทำ 2 ส่วนตามนี้นะครับ ..
1. ก่อนทำ .. ให้ Copy Database ของ vCenter เก็บไว้ก่อน !!!!!! เฝื่อในกรณีที่ทำแล้วติดปัญหาจะได้สามารถนำกลับมาใช้งานได้2. ดาวน์โหลดไฟล์ VCDB_table_cleanup_MSSQL_V4.X3. เปิดโปรแกรม Microsoft SQL Server Management Studio Express.4. สั่ง Clear Database ทำตาม Link นี้ http://www.virtualsmb.net/?p=135 ได้เลยครับ5. Start Service และ Connect vClient เข้าที vCenter Server
แต่ถ้ายังไม่สามารถใช้งานได้ให้รันคำสั่งนี้อีกครั้ง
alter table VPX_EVENT_ARG drop constraint FK_VPX_EVENT_ARG_REF_EVENT, FK_VPX_EVENT_ARG_REF_ENTITY alter table VPX_ENTITY_LAST_EVENT drop constraint FK_VPX_LAST_EVENT_EVENTtruncate table VPX_TASKtruncate table VPX_ENTITY_LAST_EVENTtruncate table VPX_EVENTtruncate table VPX_EVENT_ARGalter table VPX_EVENT_ARG addconstraint FK_VPX_EVENT_ARG_REF_EVENT foreign key(EVENT_ID) references VPX_EVENT (EVENT_ID) on delete cascade, constraint FK_VPX_EVENT_ARG_REF_ENTITY foreign key (OBJ_TYPE) references VPX_OBJECT_TYPE (ID)alter table VPX_ENTITY_LAST_EVENT addconstraint FK_VPX_LAST_EVENT_EVENT foreign key(LAST_EVENT_ID) references VPX_EVENT (EVENT_ID) on delete cascade
ที่ผมลองทำ 2 ส่วนนี้เพิ่มเติมก็จะสามารถลด Database ให้ลดลงได้และสามารถกลับมาใช้งาน vCenter ดีอีกครัง โล่ง !!!!! (คนที่ขอช่วยนะ) …
--------------------------------------------------------------------------------------------------------------------------------
Sql File
/*
VCDB_table_cleanup_MSSQL_V4.X.sql,v 4.0 2010/08/12
This script will delete data from designated tables in the VirtualCenter DB
for vc4.x 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 ####################
-- PERFORM SOME ERROR CHECKING TO ENSURE DB ACCESS
SELECT @VCUSERID = UID FROM SYSOBJECTS
WHERE NAME = 'VPX_VERSION'
IF @@ROWCOUNT < 1
BEGIN
PRINT 'The ' + DB_NAME() + ' database does not appear to contain VirtualCenter tables.'
PRINT 'Please ensure you are connected to the correct database.'
RETURN -- stop execution of this script
END
SELECT @VCUSER = NAME FROM SYSUSERS
WHERE UID = @VCUSERID
PRINT 'VirtualCenter database user: ' + @VCUSER
PRINT 'Logged in user: ' + CURRENT_USER
IF (@VCUSER <> CURRENT_USER) AND (@VCUSER <> 'dbo')
BEGIN
PRINT '***************************************************************'
PRINT 'You do not appear to be logged in as the VirtualCenter DB user.'
PRINT 'Please log in as ''' + @VCUSER + ''' to execute this SQL script.'
PRINT '***************************************************************'
RETURN
END
-- DONE WITH ERROR CHECKING
-- CONVERT THIS DATE TO A STRING WITH QUOTES FOR EFFICIENCY LATER
SET @CUTOFF_DATE_S = '''' + CONVERT(NVARCHAR, @CUTOFF_DATE, 111) + ''''
PRINT 'Cutoff date: ' + @CUTOFF_DATE_S
PRINT 'Batch size: ' + CONVERT(NVARCHAR, @BATCH_SIZE)
PRINT CONVERT(NVARCHAR, getdate(), 120) + ' starting...'
CREATE TABLE #CLEANUP_VCDB (VPXTABLE NVARCHAR(40), CRITERIA NVARCHAR(250), INITIAL_CNT INT, DELETE_CNT INT)
IF ((SELECT VER_ID FROM VPX_VERSION)< 4)
BEGIN
INSERT #CLEANUP_VCDB VALUES ('VPX_HIST_STAT', 'SAMPLE_ID IN (SELECT ID FROM VPX_SAMPLE WHERE SAMPLE_TIME < ' + @CUTOFF_DATE_S + ')', 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_SAMPLE', 'SAMPLE_TIME < ' + @CUTOFF_DATE_S, 0, 0 )
END
ELSE
BEGIN
INSERT #CLEANUP_VCDB VALUES ('VPX_HIST_STAT1', 'TIME_ID IN (SELECT TIME_ID FROM VPX_SAMPLE_TIME1 WHERE SAMPLE_TIME < ' + @CUTOFF_DATE_S + ')', 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_SAMPLE_TIME1', 'SAMPLE_TIME < ' + @CUTOFF_DATE_S, 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_HIST_STAT2', 'TIME_ID IN (SELECT TIME_ID FROM VPX_SAMPLE_TIME2 WHERE SAMPLE_TIME < ' + @CUTOFF_DATE_S + ')', 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_SAMPLE_TIME2', 'SAMPLE_TIME < ' + @CUTOFF_DATE_S, 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_HIST_STAT3', 'TIME_ID IN (SELECT TIME_ID FROM VPX_SAMPLE_TIME3 WHERE SAMPLE_TIME < ' + @CUTOFF_DATE_S + ')', 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_SAMPLE_TIME3', 'SAMPLE_TIME < ' + @CUTOFF_DATE_S, 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_HIST_STAT4', 'TIME_ID IN (SELECT TIME_ID FROM VPX_SAMPLE_TIME4 WHERE SAMPLE_TIME < ' + @CUTOFF_DATE_S + ')', 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_SAMPLE_TIME4', 'SAMPLE_TIME < ' + @CUTOFF_DATE_S, 0, 0 )
END
DECLARE curse CURSOR FOR
SELECT VPXTABLE, CRITERIA FROM #CLEANUP_VCDB
OPEN curse
FETCH NEXT FROM curse INTO @FROM_VAL, @WHERE_VAL
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @SQL = 'SELECT @CNT= COUNT(1) FROM ' + @FROM_VAL + ' WHERE ' + @WHERE_VAL
-- this is required to get result into a variable
EXEC sp_executesql @SQL, N'@CNT INT OUTPUT', @CNT = @CNT OUTPUT
SET @SQL = 'UPDATE #CLEANUP_VCDB SET INITIAL_CNT = ' + CONVERT(NVARCHAR, @CNT) + ' WHERE CURRENT OF curse '
EXEC(@SQL)
IF (@CNT = 0)
BEGIN
PRINT CONVERT(NVARCHAR, getdate(), 120) + ' ' + @FROM_VAL + ': no matching rows to delete.'
FETCH NEXT FROM curse INTO @FROM_VAL, @WHERE_VAL
CONTINUE
END
PRINT CONVERT(NVARCHAR, getdate(), 120) + ' ' + @FROM_VAL + ': will attempt to delete ' + CONVERT(NVARCHAR, @CNT) + ' rows.'
IF @DELETE_DATA = 1
BEGIN
SET @CNT = 0
SET @TOT = 0
SET ROWCOUNT @BATCH_SIZE
WHILE 1=1
BEGIN
BEGIN TRAN
SET @SQL = 'DELETE FROM ' + @FROM_VAL + ' WHERE ' + @WHERE_VAL
EXEC(@SQL)
SET @CNT = @@ROWCOUNT
SET @TOT = @TOT + @CNT
COMMIT TRAN
IF @CNT < @BATCH_SIZE BREAK
PRINT CONVERT(NVARCHAR, getdate(), 120) + ' completed ' + CONVERT(nvarchar, @TOT) + ' rows...'
END --ROW BATCH LOOP
SET ROWCOUNT 0
PRINT CONVERT(NVARCHAR, getdate(), 120) + ' ' + @FROM_VAL + ': deleted ' + CONVERT(nvarchar, @TOT) + ' total rows.'
SET @SQL = 'UPDATE #CLEANUP_VCDB SET DELETE_CNT = ' + CONVERT(NVARCHAR, @TOT) + ' WHERE CURRENT OF curse '
EXEC(@SQL)
END -- DELETE DATA SECTION
ELSE
BEGIN
PRINT CONVERT(NVARCHAR, getdate(), 120) + ' This is a test run, no data was deleted.'
END
FETCH NEXT FROM curse INTO @FROM_VAL, @WHERE_VAL
END -- END CURSOR LOOP
CLOSE curse
DEALLOCATE curse
IF @DELETE_DATA = 1
BEGIN
PRINT ' '
PRINT '****************** SUMMARY *******************'
DECLARE curse CURSOR FOR
SELECT VPXTABLE, INITIAL_CNT, DELETE_CNT FROM #CLEANUP_VCDB
DECLARE @INITIAL_VAL INT, @DELETE_VAL INT
OPEN curse
FETCH NEXT FROM curse INTO @FROM_VAL, @INITIAL_VAL, @DELETE_VAL
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (@INITIAL_VAL <> @DELETE_VAL)
BEGIN
PRINT 'Potential problem: attempted to delete ' + CONVERT(NVARCHAR, @INITIAL_VAL)
+ ' rows, but only ' + CONVERT(NVARCHAR, @DELETE_VAL) + ' deleted.'
END
ELSE
BEGIN
PRINT 'Deleted ' + CONVERT(NVARCHAR, @DELETE_VAL)
+ ' rows from ' + CONVERT(NVARCHAR, @FROM_VAL) + ' table.'
END
FETCH NEXT FROM curse INTO @FROM_VAL, @INITIAL_VAL, @DELETE_VAL
END
CLOSE curse
DEALLOCATE curse
END --DELETE DATA CHECK
DROP TABLE #CLEANUP_VCDB
ที่มา http://www.vmware.in.th/pumpith/vmware-clean-data-%E0%B8%82%E0%B8%AD%E0%B8%87-vcenter.html