INTRODUZIONE
Questo documento registra passaggi, script e ideologia alla base della manutenzione eseguita su un database di produzione tra il 22 aprile 2015 e il 23 aprile 2015. I dettagli sono specifici di un'applicazione, ma i principi possono essere utili ad altri che necessitano di eseguire operazioni simili in produzione .
SFONDO
Il database è cresciuto fino a oltre 1,44 TB con la tabella EPOEvents consumando oltre la metà di questa dimensione (792 GB). In passato sono stati compiuti sforzi per eliminare le voci in questa tabella più vecchie di 90 giorni. Sfortunatamente, si è rivelato inutile. Il lavoro pianificato per raggiungere questo obiettivo non potrebbe mai essere completato durante nessuna sessione. Il motivo erano le scarse prestazioni del database.
Dopo la discussione, è stata presa la decisione di eliminare tutti gli EPOEvents tabella troncandola. L'ulteriore decisione è stata quella di preparare correttamente il database per la crescita dei dati prevista in futuro.
Di seguito i dettagli del server di database in questione:
SERVERNAME | SVR-EPO-02 |
NOME DELL'ISTANZA | SVR-EPO-02\ENG_AVSERVER |
VERSIONE OS | Windows 2008 R2 Enterprise (SP1) a 64 bit |
VERSIONE DB | Microsoft SQL Server 2008 R2 (SP1) a 64 bit |
INDIRIZZO IP | XX.XX.XX.XX |
NOME BANCA DATI | ePO4_SVR-EPO-02 |
TABELLA EPOEVENTS
Lo script che definisce gli EPOEvents la tabella è documentata nell'Appendice I.
Vale la pena ricordare che la colonna AutoID di questa tabella è nelle relazioni di chiave esterna con le tabelle HIP8_EventInfo, HIP8_IPSEventParameter e SCOR_EVENTS. Ciò ha influito sull'approccio utilizzato per troncare la tabella EPOEvents. I dettagli di riepilogo sono nella tabella seguente:
Queste informazioni sono state estratte utilizzando la dichiarazione nel Listato 1.
USE [ePO4_SVR-EPO-02]
GO
EXEC sp_fkeys 'EPOEvents'
RIEPILOGO DELLA PROCEDURA
Riepilogo della procedura utilizzata durante la modifica:
- Distribuisci cinque unità da 200 GB
- Interrompi i servizi applicativi EPO
- Backup del database EPO
- Crea un nuovo gruppo di file
- Tronca la tabella EPOEvents
- Sposta EPOEvents nel nuovo filegroup
- Ricrea chiavi esterne sulla tabella figlio
- Script della definizione della tabella EPOEvents
- Backup del database EPO
- Riduci i file di dati nel filegroup PRIMARIO
- Backup del database EPO
- Elimina il database EPO
- Formatta unità J
- Ripristina il database EPO con MOVE
- Trasferisci TempDB su Drive Q
- Avvia i servizi per le applicazioni EPO
- Conferma che EPOEvents è popolato
Distribuisci cinque unità da 200 GB
Cinque nuove unità sono state distribuite sul server. L'elenco completo di tutte le unità sul server è il seguente:
DRIVE | UTILIZZA | NUOVO? | COMMENTO |
C | Unità di sistema | NO | Dimensione cluster predefinita (4KB) |
D | Applicazione Drive | NO | Dimensione cluster predefinita (4KB) |
Io | Dati MSSQL (OLD) | NO | Dimensione cluster predefinita (4KB) |
J | Registro MSSQL | NO | Dimensioni cluster consigliate per SQL (64K) |
M | Dati MSSQL (FG_LARGE FileGroup) | SI | Dimensioni cluster consigliate per SQL (64K) |
N | Dati MSSQL (FG_LARGE FileGroup) | SI | Dimensioni cluster consigliate per SQL (64K) |
O | Dati MSSQL (FG_LARGE FileGroup) | SI | Dimensioni cluster consigliate per SQL (64K) |
P | Dati MSSQL (Gruppo di file PRIMARIO) | SI | Dimensioni cluster consigliate per SQL (64K) |
D | DB Temp MSSQL | SI | Dimensioni cluster consigliate per SQL (64K) |
Tutte le nuove unità sono state formattate utilizzando una dimensione del cluster di 64 KB, come consigliato da Microsoft per le unità contenenti dati di MS SQL Server o file di registro[1]. Anche l'unità J è stata riformattata dopo aver eseguito un backup del database.
[1] La discussione completa è accessibile all'indirizzo https://msdn.microsoft.com/en-us/library/dd758814.aspx
Interrompi i servizi applicativi EPO
Tutti i servizi applicativi sono stati interrotti per garantire l'assenza di aggiornamenti sul database durante il periodo della modifica. I servizi applicativi interrotti (o confermati inattivi) sono i seguenti:
- Server applicazioni McAfee ePolicy Orchestrator 4.6.8
- McAfee ePolicy Orchestrator 4.6.8 Analizzatore di eventi
- Server McAfee ePolicy Orchestrator 4.6.8
Backup del database EPO
Il primo backup del database era stato eseguito prima che avvenisse qualsiasi azione sulla struttura esistente, utilizzando lo script nel Listato 2.
Listato 2:Primo backup del database ePO4_SVR-EPO-02
BACKUP DATABASE [ePO4_SVR-EPO-02] to
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_A01.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_A02.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_A03.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_A04.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_A05.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_A06.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_A07.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_A08.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_A09.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_A10.bak'
WITH STATS = 5, COMPRESSION, NAME = N'ePO4_SVR-EPO-02 First Backup Before Purge'
Crea un nuovo filegroup
È stato creato un nuovo gruppo di file chiamato FG_LARGE con l'equivalente dello script nel Listato 3. Tutti i file aggiunti al gruppo di file sono stati definiti con una dimensione iniziale di 40 GB, un incremento di 1 G e una dimensione massima di 100 GB.
Listato 3:Creazione del filegroup FG_LARGE
USE [master]
GO
ALTER DATABASE [ePO4_SVR-EPO-02] ADD FILEGROUP [FG_LARGE]
GO
USE [master]
GO
ALTER DATABASE [ePO4_SVR-EPO-02] ADD FILE ( NAME = N'ePO4_SVR-EPO_FG_LARGE_01', FILENAME = N'M:\MSSQL\DATA\ePO4_SVR-EPO_FG_LARGE_01.ndf' , SIZE = 41943040KB , MAXSIZE = 104857600KB , FILEGROWTH = 1048576KB ) TO FILEGROUP [FG_LARGE]
GO
ALTER DATABASE [ePO4_SVR-EPO-02] ADD FILE ( NAME = N'ePO4_SVR-EPO_FG_LARGE_02', FILENAME = N'M:\MSSQL\DATA\ePO4_SVR-EPO_FG_LARGE_02.ndf' , SIZE = 41943040KB , MAXSIZE = 104857600KB , FILEGROWTH = 1048576KB ) TO FILEGROUP [FG_LARGE]
GO
ALTER DATABASE [ePO4_SVR-EPO-02] ADD FILE ( NAME = N'ePO4_SVR-EPO_FG_LARGE_03', FILENAME = N'N:\MSSQL\DATA\ePO4_SVR-EPO_FG_LARGE_03.ndf' , SIZE = 41943040KB , MAXSIZE = 104857600KB , FILEGROWTH = 1048576KB ) TO FILEGROUP [FG_LARGE]
GO
ALTER DATABASE [ePO4_SVR-EPO-02] ADD FILE ( NAME = N'ePO4_SVR-EPO_FG_LARGE_04', FILENAME = N'N:\MSSQL\DATA\ePO4_SVR-EPO_FG_LARGE_04.ndf' , SIZE = 41943040KB , MAXSIZE = 104857600KB , FILEGROWTH = 1048576KB ) TO FILEGROUP [FG_LARGE]
GO
ALTER DATABASE [ePO4_SVR-EPO-02] ADD FILE ( NAME = N'ePO4_SVR-EPO_FG_LARGE_05', FILENAME = N'O:\MSSQL\DATA\ePO4_SVR-EPO_FG_LARGE_05.ndf' , SIZE = 41943040KB , MAXSIZE = 104857600KB , FILEGROWTH = 1048576KB ) TO FILEGROUP [FG_LARGE]
GO
ALTER DATABASE [ePO4_SVR-EPO-02] ADD FILE ( NAME = N'ePO4_SVR-EPO_FG_LARGE_06', FILENAME = N'O:\MSSQL\DATA\ePO4_SVR-EPO_FG_LARGE_06.ndf' , SIZE = 41943040KB , MAXSIZE = 104857600KB , FILEGROWTH = 1048576KB ) TO FILEGROUP [FG_LARGE]
GO
Tronca la tabella EPOEvents
Il Listato 4 mostra la serie completa di attività richieste per troncare correttamente la tabella EPOEvents. Lo script include note per chiarezza.
La questione fondamentale da notare è che è impossibile troncare una tabella che partecipa come genitore a una relazione di chiave esterna. Violerebbe l'integrità referenziale. L'eliminazione funzionerebbe e manterrebbe l'integrità referenziale poiché le chiavi esterne sono generalmente definite con le clausole ON DELETE CASCADE o ON DELETE SET NULL.
Listato 4:troncamento della tabella EPOEvents e trasferimento in un nuovo tablespace
/****** Check Foreign Keys Referencing EPOEvents ******/
USE [ePO4_SVR-EPO-02]
GO
EXEC sp_fkeys 'EPOEvents'
/****** Script Identified Foreign Keys ******/
USE [ePO4_SVR-EPO-02]
GO
ALTER TABLE [dbo].[HIP8_IPSEVENTPARAMETER] WITH CHECK ADD CONSTRAINT [FK_HIP8_IPSEVENTPARAMETER_EPOEVENTS] FOREIGN KEY([EVENTID])
REFERENCES [dbo].[EPOEVENTS] ([AUTOID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[HIP8_IPSEVENTPARAMETER] CHECK CONSTRAINT [FK_HIP8_IPSEVENTPARAMETER_EPOEVENTS]
GO
USE [ePO4_SVR-EPO-02]
GO
ALTER TABLE [dbo].[HIP8_EVENTINFO] WITH CHECK ADD CONSTRAINT [FK_HIP8_EVENTINFO_EPOEVENTS] FOREIGN KEY([EVENTID])
REFERENCES [dbo].[EPOEVENTS] ([AUTOID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[HIP8_EVENTINFO] CHECK CONSTRAINT [FK_HIP8_EVENTINFO_EPOEVENTS]
GO
USE [ePO4_SVR-EPO-02]
GO
ALTER TABLE [dbo].[SCOR_EVENTS] WITH CHECK ADD CONSTRAINT [SCOR_EVENTS_EPO_EVENTS] FOREIGN KEY([EPO_EVENT_AUTO_ID])
REFERENCES [dbo].[EPOEVENTS] ([AUTOID])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[SCOR_EVENTS] CHECK CONSTRAINT [SCOR_EVENTS_EPO_EVENTS]
GO
/****** Backup the Child Tables ******/
USE [ePO4_SVR-EPO-02]
GO
SELECT * INTO HIP8_IPSEVENTPARAMETER_BAK FROM HIP8_IPSEVENTPARAMETER;
SELECT * INTO HIP8_EVENTINFO_BAK FROM HIP8_EVENTINFO;
SELECT * INTO SCOR_EVENTS_BAK FROM SCOR_EVENTS;
GO
/****** Truncate Child Tables ******/
USE [ePO4_SVR-EPO-02]
GO
TRUNCATE TABLE HIP8_IPSEVENTPARAMETER;
TRUNCATE TABLE HIP8_EVENTINFO;
TRUNCATE TABLE SCOR_EVENTS;
/****** Drop Foreign Keys ******/
USE [ePO4_SVR-EPO-02]
GO
ALTER TABLE HIP8_IPSEVENTPARAMETER DROP CONSTRAINT [FK_HIP8_IPSEVENTPARAMETER_EPOEVENTS];
ALTER TABLE HIP8_EVENTINFO DROP CONSTRAINT [FK_HIP8_EVENTINFO_EPOEVENTS];
ALTER TABLE SCOR_EVENTS DROP CONSTRAINT [SCOR_EVENTS_EPO_EVENTS];
/***** Truncate EPOEvents Table ******/
USE [ePO4_SVR-EPO-02]
GO
TRUNCATE TABLE EPOEVENTS;
Sposta EPOEvents nel nuovo filegroup
La tabella EPOEvents è stata spostata nel Filegroup FG_LARGE utilizzando lo script nel Listato 5.
Listato 5:spostamento del filegroup EPOEvents FG_LARGE
/***** Move EPOEvents to the New Filegroup FG_LARGE ******/
-- This is achieved by recreating the Clustered Index used by Primary Key on this table
-- First Step is to Script the Clustered Index
USE [ePO4_SVR-EPO-02]
GO
ALTER TABLE [dbo].[EPOEvents] ADD CONSTRAINT [PK_EPOEvents_AutoID] PRIMARY KEY CLUSTERED
(
[AutoID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
-- Second Step is to drop and recreate the Clustered Index after changing
-- the Filegroup the Script (observe the ON Clause in the create statement below:
-- Filegroup was previously PRIMARY and is now FG_LARGE)
-- Drop Statement
USE [ePO4_SVR-EPO-02]
GO
ALTER TABLE [dbo].[EPOEvents] DROP CONSTRAINT [PK_EPOEvents_AutoID]
-- Create Statement
USE [ePO4_SVR-EPO-02]
GO
ALTER TABLE [dbo].[EPOEvents] ADD CONSTRAINT [PK_EPOEvents_AutoID] PRIMARY KEY CLUSTERED
(
[AutoID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [FG_LARGE]
GO
Ricrea chiavi esterne su tabelle figli
Le chiavi esterne sulle tabelle figlio identificate nel passaggio 4.1.5 sono state ricreate con lo script nel Listato 6.
Listato 6:troncamento della tabella EPOEvents e trasferimento in un nuovo filegroup
USE [ePO4_SVR-EPO-02]
GO
ALTER TABLE [dbo].[HIP8_IPSEVENTPARAMETER] WITH CHECK ADD CONSTRAINT [FK_HIP8_IPSEVENTPARAMETER_EPOEVENTS] FOREIGN KEY([EVENTID])
REFERENCES [dbo].[EPOEVENTS] ([AUTOID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[HIP8_IPSEVENTPARAMETER] CHECK CONSTRAINT [FK_HIP8_IPSEVENTPARAMETER_EPOEVENTS]
GO
ALTER TABLE [dbo].[HIP8_EVENTINFO] WITH CHECK ADD CONSTRAINT [FK_HIP8_EVENTINFO_EPOEVENTS] FOREIGN KEY([EVENTID])
REFERENCES [dbo].[EPOEVENTS] ([AUTOID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[HIP8_EVENTINFO] CHECK CONSTRAINT [FK_HIP8_EVENTINFO_EPOEVENTS]
GO
ALTER TABLE [dbo].[SCOR_EVENTS] WITH CHECK ADD CONSTRAINT [SCOR_EVENTS_EPO_EVENTS] FOREIGN KEY([EPO_EVENT_AUTO_ID])
REFERENCES [dbo].[EPOEVENTS] ([AUTOID])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[SCOR_EVENTS] CHECK CONSTRAINT [SCOR_EVENTS_EPO_EVENTS]
GO
Script della definizione della tabella EPOEvents
Come backup, era l'ideale per lo scripting dell'estratto del DDL della tabella EPOEvents. Ciò è stato fatto facendo clic con il pulsante destro del mouse e selezionando l'opzione Tabella script come> CREA in> Nuova finestra dell'editor di query da Esplora oggetti di SSMS[1]. Lo script risultante può essere salvato in un .sql file.
Backup del database EPO
È stato eseguito un secondo backup del database EPO con lo script nel Listato 7 per prepararsi alla fase successiva (riduzione del file di dati).
Listato 7:Secondo backup del database EPO
BACKUP DATABASE [ePO4_SVR-EPO-02] TO
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_C01.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_C02.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_C03.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_C04.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_C05.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_C06.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_C07.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_C08.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_C09.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_C10.bak'
WITH STATS = 5, COMPRESSION, NAME = N'ePO4_SVR-EPO-02 Backup After Purge'
Riduci i file di dati nel filegroup PRIMARIO
Il restringimento è necessario per recuperare lo spazio liberato troncando la tabella EPOEvents. Anche in questo caso era fondamentale, poiché i file di dati richiedevano il trasferimento su un'unità più piccola.
I file di dati sono stati trasferiti dall'unità I:un'unità da 3 TB all'unità P, un'unità da 200 GB.
I tre file di dati nel filegroup PRIMARY sono stati logicamente denominati ePO4_SVR-EPO-01 (~300 GB), ePO4_SVR-EPO-02 (~500 GB) e ePO4_SVR-EPO-03 (~400 GB).
L'obiettivo era ridurre tutti i file a 40000 MB ciascuno. L'attività richiedeva da cinque a sette iterazioni, ciascuna delle quali rimuoveva 50000 MB.
Listato 8:Ridurre i file di dati nel filegroup PRIMARY
USE [ePO4_SVR-EPO-02]
GO
DBCC SHRINKFILE (N'ePO4_SVR-EPO-01' , 40000)
DBCC SHRINKFILE (N'ePO4_SVR-EPO-02' , 40000)
DBCC SHRINKFILE (N'ePO4_SVR-EPO-03' , 40000)
GO
Backup del database EPO
È stato eseguito un secondo backup del database EPO utilizzando lo script nel Listato 5 per prepararsi alla fase successiva (eliminazione del database esistente). Lo script è presente nel Listato 9 .
Listato 9:Primo backup del database ePO4_SVR-EPO-02
BACKUP DATABASE [ePO4_SVR-EPO-02] TO
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E01.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E02.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E03.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E04.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E05.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E06.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E07.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E08.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E09.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E10.bak'
WITH STATS = 5, COMPRESSION, NAME = N'ePO4_SVR-EPO-02 Backup After Shrink'
Elimina il database EPO
Il database è stato eliminato utilizzando la GUI di SSMS:fare clic con il pulsante destro del mouse sul database e selezionare l'opzione "elimina" dal menu a discesa. L'SQL equivalente è nel Listato 10 .
Listato 10:elimina il database EPO
USE [master]
GO
DROP DATABASE [ePO4_SVR-EPO-02]
GO
Formatta Drive J
Questo passaggio formatta l'unità J, utilizzando la dimensione del cluster di 64 KB, come consigliato da Microsoft per prestazioni di I/O ottimali. Questa attività è stata precedentemente eseguita sulle nuove unità distribuite nel passaggio 4.1.1.
La Figura 3 mostra l'opzione selezionata nella finestra di dialogo Formato....
Ripristina il database EPO con MOVE
L'operazione di ripristino si è resa necessaria per tre motivi:
- Per formattare l'unità J contenente i file di registro delle transazioni (come sopra).
- Per rimuovere qualsiasi frammentazione causata dall'operazione di restringimento.
- Per riposizionare il database su nuove unità.
Lo script nel Listato 11 serve per restaurare. Si noti che il set di backup utilizzato per questo ripristino è l'ultimo backup eseguito nel passaggio 4.1.8. Inoltre, osserva che l'opzione MOVE serve a riposizionare i file di dati nel filegroup PRIMARY per guidare P.
Listato 11:elimina il database EPO
RESTORE DATABASE [ePO4_SVR-EPO-02] FROM
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E01.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E02.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E03.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E04.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E05.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E06.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E07.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E08.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E09.bak',
DISK = 'I:\MSSQL\BACKUP\ePO4_SVR-EPO-02_22Apr2015_E10.bak'
WITH STATS = 5,
MOVE 'ePO4_SVR-EPO-02' TO 'P:\MSSQL\DATA\ePO4_SVR-EPO-02.mdf',
MOVE 'ePO4_SVR-EPO-01' TO 'P:\MSSQL\DATA\ePO4_SVR-EPO-01.ndf',
MOVE 'ePO4_SVR-EPO-03' TO 'P:\MSSQL\DATA\ePO4_SVR-EPO-03.ndf'
Trasferisci TempDB su Drive Q
Per prestazioni ottimali di database di grandi dimensioni, si consiglia inoltre di individuare i file TempDB su un'unità dedicata.
Utilizzando lo script nel Listato 9, TempDB è stato riposizionato nell'unità Q. Si noti che i file di dati TempDB ridondanti sono stati rimossi durante questa operazione. Il numero di file di dati TempDB deve corrispondere al numero di CPU fisiche disponibili per SQL Server.
Listato 12:Relocate TempDB
-- Drop unnecessary TempDB files
-- The following script was run several times and required several restarts of the -- SQL instance
USE [tempdb]
GO
ALTER DATABASE [tempdb] REMOVE FILE [tempdev_xx]
GO
-- Relocate TempDB files
USE master;
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = 'Q:\MSSQL\DATA\tempdev.mdf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev_01, FILENAME = 'Q:\MSSQL\DATA\tempdev_01.mdf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = 'J:\MSSQL\LOG\templog.ldf');
GO
-- Restart SQL Server
-- Confirm the location of TempDB files
SELECT name as 'File Name', physical_name as 'File Directory'
FROM sys.master_files
WHERE database_id = DB_ID('tempdb');
GO
Avvia i servizi per le applicazioni EPO
Tutti i servizi delle applicazioni sono stati avviati dopo che l'istanza di SQL Server è stata confermata OK. I servizi applicativi avviati sono i seguenti:
- Server applicazioni McAfee ePolicy Orchestrator 4.6.8
- McAfee ePolicy Orchestrator 4.6.8 Analizzatore di eventi
- Server McAfee ePolicy Orchestrator 4.6.8
Conferma che le tabelle sono popolate
Lo script elenca 13 conferma che la tabella EPOEvents e le tabelle figlio vengono popolate al termine dell'intero processo.
Listato 13:Relocate TempDB
USE [ePO4_SVR-EPO-02]
GO
SELECT COUNT(*) EPOEvents_CNT FROM EPOEvents;
SELECT COUNT(*) HIP8_EventInfo_CNT FROM HIP8_EventInfo;
SELECT COUNT(*) HIP8_IPSEventParameter_CNT FROM HIP8_IPSEventParameter;
SELECT COUNT(*) SCOR_EVENTS_CNT FROM SCOR_EVENTS;
ATTIVITÀ POST CAMBIO
Riepilogo delle attività di post modifica
1 Il lavoro Eventi EPO Custom_Purge è stato creato per mantenere il numero di eventi acquisiti entro 100 giorni. È fondamentale garantire che questo lavoro abbia sempre successo.
2 È possibile recuperare spazio eccessivo precedentemente allocato al server del database EPO, in particolare l'unità I, attualmente 1 TB.
3 Un processo di backup Backup_giornaliero_personalizzato è stato creato durante il cambiamento. I backup eseguiti da questo processo rilasceranno i set di backup in I:/MSSQL/Backup/ . È essenziale modificare questo percorso se l'unità verrà rimossa dal sistema. È inoltre necessario preservare questi backup in base ai criteri di backup di gruppo.
APPENDICI
APPENDICE I
DDL TABELLA EPOEVENTS
USE [ePO4_SVR-EPO-02]
GO
/****** Object: Table [dbo].[EPOEvents] Script Date: 04/23/2015 01:40:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[EPOEvents](
[AutoID] [int] IDENTITY(1,1) NOT NULL,
[AutoGUID] [uniqueidentifier] NOT NULL,
[ServerID] [nvarchar](16) NOT NULL,
[ReceivedUTC] [datetime] NOT NULL,
[DetectedUTC] [datetime] NOT NULL,
[AgentGUID] [uniqueidentifier] NOT NULL,
[Analyzer] [nvarchar](16) NOT NULL,
[AnalyzerName] [nvarchar](64) NOT NULL,
[AnalyzerVersion] [nvarchar](20) NOT NULL,
[AnalyzerHostName] [nvarchar](128) NULL,
[AnalyzerIPV4] [int] NULL,
[AnalyzerIPV6] [binary](16) NULL,
[AnalyzerMAC] [nvarchar](16) NULL,
[AnalyzerDATVersion] [nvarchar](20) NULL,
[AnalyzerEngineVersion] [nvarchar](20) NULL,
[AnalyzerDetectionMethod] [nvarchar](128) NULL,
[SourceHostName] [nvarchar](266) NULL,
[SourceIPV4] [int] NULL,
[SourceIPV6] [binary](16) NULL,
[SourceMAC] [nvarchar](16) NULL,
[SourceUserName] [nvarchar](128) NULL,
[SourceProcessName] [nvarchar](128) NULL,
[SourceURL] [nvarchar](1024) NULL,
[TargetHostName] [nvarchar](266) NULL,
[TargetIPV4] [int] NULL,
[TargetIPV6] [binary](16) NULL,
[TargetMAC] [nvarchar](16) NULL,
[TargetUserName] [nvarchar](128) NULL,
[TargetPort] [int] NULL,
[TargetProtocol] [nvarchar](16) NULL,
[TargetProcessName] [nvarchar](128) NULL,
[TargetFileName] [nvarchar](266) NULL,
[ThreatCategory] [nvarchar](128) NOT NULL,
[ThreatEventID] [int] NOT NULL,
[ThreatSeverity] [tinyint] NOT NULL,
[ThreatName] [nvarchar](128) NOT NULL,
[ThreatType] [nvarchar](32) NOT NULL,
[ThreatActionTaken] [nvarchar](24) NOT NULL,
[ThreatHandled] [bit] NULL,
[TheTimestamp] [timestamp] NOT NULL,
CONSTRAINT [PK_EPOEvents_AutoID] PRIMARY KEY CLUSTERED
(
[AutoID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[EPOEvents] ADD CONSTRAINT [DF_EPOEvents_EventID] DEFAULT (newid()) FOR [AutoGUID]
GO
ALTER TABLE [dbo].[EPOEvents] ADD CONSTRAINT [DF_EPOEvents_ServerID] DEFAULT (N'SVR-EPO-02') FOR [ServerID]
GO
ALTER TABLE [dbo].[EPOEvents] ADD CONSTRAINT [DF_EPOEvents_ReceivedUTC] DEFAULT (getutcdate()) FOR [ReceivedUTC]
GO
ALTER TABLE [dbo].[EPOEvents] ADD CONSTRAINT [DF_EPOEvents_ThreatSeverity] DEFAULT ((1)) FOR [ThreatSeverity]
GO
ALTER TABLE [dbo].[EPOEvents] ADD CONSTRAINT [DF_EPOEvents_ThreatActionTaken] DEFAULT ('none') FOR [ThreatActionTaken]
GO
APPENDICE II
EVENTI EPO JOB CUSTOM_PURGE
USE [msdb]
GO
/****** Object: Job [Custom_Purge EPO Events] Script Date: 04/25/2015 19:47:51 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 04/25/2015 19:47:51 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Custom_Purge EPO Events',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'No description available.',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Step 1] Script Date: 04/25/2015 19:47:51 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'Step 1',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'DECLARE @NbLignes int ;
SELECT @NbLignes = COUNT(*) FROM EPOEvents WHERE DATEDIFF(day, DetectedUTC, GETDATE()) > ''100'';
PRINT ''Total number of lines to delete:'';
PRINT @NbLignes;
WHILE (@NbLignes > 0)
BEGIN
PRINT ''Total number of lines LEFT to delete: :'';
PRINT @NbLignes;
PRINT ''Start deleting 50000 lines'';
BEGIN TRAN DEL_SET;
DELETE TOP(500000) FROM EPOEvents WHERE DATEDIFF(day, DetectedUTC, GETDATE()) > ''100'';
COMMIT;
SET @NbLignes = @NbLignes - ''50000'';
WAITFOR DELAY ''00:05'';
END
PRINT ''End of Maintenance'' ;
',
@database_name=N'ePO4_SVR-EPO-02',
@output_file_name=N'D:\MSSQL\JOBLOG\purgeepoevents.txt',
@flags=2
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @[email protected], @name=N'Purge Schedule',
@enabled=1,
@freq_type=4,
@freq_interval=1,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=1,
@freq_recurrence_factor=0,
@active_start_date=20130312,
@active_end_date=99991231,
@active_start_time=200000,
@active_end_time=235959,
@schedule_uid=N'3d0b8826-691d-4d3c-aca9-00cb5ce246b2'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO