WPROWADZENIE
Ten dokument rejestruje kroki, skrypty i ideologię konserwacji przeprowadzonej na produkcyjnej bazie danych w okresie od 22 kwietnia 2015 r. do 23 kwietnia 2015 r. Szczegóły są specyficzne dla aplikacji, ale zasady mogą być przydatne dla innych osób, które potrzebują wykonać podobne operacje w środowisku produkcyjnym .
TŁO
Baza danych wzrosła do ponad 1,44 TB z tabelą EPOEvents zużywa ponad połowę tego rozmiaru (792 GB). W przeszłości podjęto wysiłki w celu usunięcia wpisów w tej tabeli starszych niż 90 dni. Niestety okazało się to bezowocne. Zadanie zaplanowane, aby to osiągnąć, nigdy nie mogło zostać ukończone podczas żadnej sesji. Powodem była słaba wydajność bazy danych.
Po dyskusji podjęto decyzję o wyczyszczeniu wszystkich EPOEvents tabeli, obcinając ją. Kolejną decyzją było prawidłowe przygotowanie bazy danych do przewidywanego wzrostu ilości danych w przyszłości.
Szczegóły serwera bazy danych, o którym mowa, znajdują się poniżej:
NAZWA SERWERA | SVR-EPO-02 |
NAZWA INSTANCJI | SVR-EPO-02\ENG_AVSERVER |
WERSJA OS | Windows 2008 R2 Enterprise (SP1) 64-bitowy |
WERSJA DB | Microsoft SQL Server 2008 R2 (SP1) 64-bitowy |
ADRES IP | XX.XX.XX.XX |
NAZWA BAZY DANYCH | ePO4_SVR-EPO-02 |
TABELA WYDARZEŃ EPO
Skrypt definiujący EPOEvents tabela jest udokumentowana w Załączniku I.
Warto wspomnieć, że kolumna AutoID tej tabeli jest w relacji klucza obcego z tabelami HIP8_EventInfo, HIP8_IPSEventParameter i SCOR_EVENTS. Wpłynęło to na podejście stosowane do obcinania tabeli EPOEvents. Szczegóły podsumowania znajdują się w poniższej tabeli:
Te informacje zostały wyodrębnione przy użyciu oświadczenia z Listingu 1.
USE [ePO4_SVR-EPO-02]
GO
EXEC sp_fkeys 'EPOEvents'
PODSUMOWANIE PROCEDURY
Podsumowanie procedury zastosowanej podczas zmiany:
- Wdróż pięć dysków 200 GB
- Zatrzymaj usługi aplikacji EPO
- Utwórz kopię zapasową bazy danych EPO
- Utwórz nową grupę plików
- Przytnij tabelę EPOEvents
- Przenieś zdarzenia EPOEvent do nowej grupy plików
- Odtwórz klucze obce w tabeli podrzędnej
- Skryptuj definicję tabeli EPOEvents
- Utwórz kopię zapasową bazy danych EPO
- Zmniejsz pliki danych w podstawowej grupie plików
- Utwórz kopię zapasową bazy danych EPO
- Upuść bazę danych EPO
- Sformatuj dysk J
- Przywróć bazę danych EPO za pomocą MOVE
- Przenieś TempDB na dysk Q
- Uruchom usługi aplikacji EPO
- Potwierdź, że zdarzenia EPOEvents są zapełnione
Wdróż pięć dysków 200 GB
Na serwerze wdrożono pięć nowych dysków. Pełna lista wszystkich dysków na serwerze jest następująca:
DYSK | UŻYJ | NOWOŚĆ? | KOMENTARZ |
C | Dysk systemowy | NIE | Domyślny rozmiar klastra (4 KB) |
D | Dysk aplikacji | NIE | Domyślny rozmiar klastra (4 KB) |
Ja | Dane MSSQL (STARY) | NIE | Domyślny rozmiar klastra (4 KB) |
J | Dziennik MSSQL | NIE | Zalecany rozmiar klastra dla SQL (64 KB) |
M | Dane MSSQL (FG_LARGE FileGroup) | TAK | Zalecany rozmiar klastra dla SQL (64 KB) |
N | Dane MSSQL (FG_LARGE FileGroup) | TAK | Zalecany rozmiar klastra dla SQL (64 KB) |
O | Dane MSSQL (FG_LARGE FileGroup) | TAK | Zalecany rozmiar klastra dla SQL (64 KB) |
P | Dane MSSQL (PRIMARY FileGroup) | TAK | Zalecany rozmiar klastra dla SQL (64 KB) |
P | MSSQL TempDB | TAK | Zalecany rozmiar klastra dla SQL (64 KB) |
Wszystkie nowe dyski zostały sformatowane przy użyciu klastra o rozmiarze 64 KB, zgodnie z zaleceniami firmy Microsoft dla dysków zawierających dane lub pliki dziennika MS SQL Server[1]. Dysk J został również ponownie sformatowany po wykonaniu kopii zapasowej bazy danych.
[1] Pełna dyskusja jest dostępna pod adresem https://msdn.microsoft.com/en-us/library/dd758814.aspx
Zatrzymaj usługi aplikacji EPO
Wszystkie usługi aplikacji zostały zatrzymane, aby zapewnić brak aktualizacji bazy danych w okresie zmiany. Usługi aplikacji zatrzymane (lub potwierdzone) są następujące:
- Serwer aplikacji McAfee ePolicy Orchestrator 4.6.8
- McAfee ePolicy Orchestrator 4.6.8 Analizator zdarzeń
- Serwer McAfee ePolicy Orchestrator 4.6.8
Utwórz kopię zapasową bazy danych EPO
Pierwsza kopia zapasowa bazy danych została wykonana przed podjęciem jakichkolwiek działań na istniejącej strukturze, przy użyciu skryptu z Listingu 2.
Listing 2:Pierwsza kopia zapasowa bazy danych 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'
Utwórz nową grupę plików
Utworzono nową grupę plików o nazwie FG_LARGE z odpowiednikiem skryptu z Listingu 3. Wszystkie pliki dodane do grupy plików zostały zdefiniowane z początkowym rozmiarem 40 GB, przyrostem 1 GB i maksymalnym rozmiarem 100 GB.
Listing 3:Tworzenie grupy plików 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
Obetnij tabelę EPOEvents
Listing 4 przedstawia pełny zestaw zadań wymaganych do pomyślnego obcięcia tabeli EPOEvents. Skrypt zawiera uwagi dla jasności.
Podstawową kwestią, na którą należy zwrócić uwagę, jest to, że niemożliwe jest obcięcie tabeli uczestniczącej jako nadrzędna w relacji klucza obcego. Naruszyłoby to integralność referencyjną. Usunięcie zadziała i zachowa integralność referencyjną, ponieważ klucze obce są zwykle definiowane za pomocą klauzul ON DELETE CASCADE lub ON DELETE SET NULL.
Listing 4:Obcinanie tabeli EPOEvents i przenoszenie do nowej przestrzeni tabel
/****** 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;
Przenieś zdarzenia EPOEvent do nowej grupy plików
Tablica EPOEvents została przeniesiona do grupy plików FG_LARGE za pomocą skryptu z Listingu 5.
Listing 5:Przenoszenie grupy plików 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
Odtwórz klucze obce w tabelach podrzędnych
Klucze obce w tabelach podrzędnych zidentyfikowane w kroku 4.1.5 zostały odtworzone za pomocą skryptu z Listingu 6.
Listing 6:Obcinanie tabeli EPOEvents i przenoszenie do nowej grupy plików
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
Skryptuj definicję tabeli EPOEvents
Jako kopia zapasowa była idealna do skryptowania ekstraktu DDL z tabeli EPOEvents. Dokonano tego, klikając prawym przyciskiem myszy i wybierając opcję Tabela skryptów jako> UTWÓRZ w> Nowe okno edytora zapytań z Eksploratora obiektów SSMS[1]. Wynikowy skrypt można zapisać w pliku .sql plik.
Utwórz kopię zapasową bazy danych EPO
Wykonano drugą kopię zapasową bazy danych EPO za pomocą skryptu z Listingu 7, aby przygotować się do następnego etapu (zmniejszanie pliku danych).
Listing 7:Druga kopia zapasowa bazy danych 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'
Zmniejszanie plików danych w grupie plików PRIMARY
Zmniejszenie jest konieczne, aby odzyskać miejsce zwolnione przez obcięcie tabeli EPOEvents. Było to również kluczowe w tym przypadku, ponieważ pliki danych wymagały przeniesienia na mniejszy dysk.
Pliki danych zostały przeniesione z dysku I – z dysku 3 TB na dysk P, z dysku o pojemności 200 GB.
Trzy pliki danych w grupie plików PRIMARY zostały nazwane logicznie ePO4_SVR-EPO-01 (~300 GB), ePO4_SVR-EPO-02 (~500 GB) i ePO4_SVR-EPO-03 (~400 GB).
Celem było zmniejszenie wszystkich plików do 40000 MB każdy. Zadanie wymagało od pięciu do siedmiu iteracji, z których każda usuwała 50000 MB.
Listing 8:Zmniejszanie plików danych w grupie plików 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
Utwórz kopię zapasową bazy danych EPO
Druga kopia zapasowa bazy danych EPO została wykonana przy użyciu skryptu z Listing 5 przygotować się do kolejnego etapu (usunięcie istniejącej bazy danych). Skrypt znajduje się na Listing 9 .
Listing 9:Pierwsza kopia zapasowa bazy danych 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'
Upuść bazę danych EPO
Baza danych została usunięta za pomocą GUI SSMS – kliknij prawym przyciskiem myszy bazę danych i wybierz opcję „usuń” z rozwijanego menu. Odpowiednik SQL znajduje się na Listingu 10 .
Listing 10:Usuń bazę danych EPO
USE [master]
GO
DROP DATABASE [ePO4_SVR-EPO-02]
GO
Sformatuj dysk J
Ten krok formatuje dysk J przy użyciu rozmiaru klastra 64 KB, zgodnie z zaleceniami firmy Microsoft w celu uzyskania optymalnej wydajności we/wy. To zadanie zostało wcześniej wykonane na nowych dyskach wdrożonych w kroku 4.1.1.
Rysunek 3 pokazuje opcję wybraną w oknie dialogowym Format….
Przywróć bazę danych EPO za pomocą MOVE
Operacja przywracania była konieczna z trzech powodów:
- Aby sformatować dysk J zawierający pliki dziennika transakcji (jak powyżej).
- Aby usunąć fragmentację spowodowaną operacją zmniejszania.
- Aby przenieść bazę danych na nowe dyski.
Skrypt z Listingu 11 służy do przywracania. Należy zauważyć, że zestaw kopii zapasowych używany do tego przywracania jest ostatnią kopią zapasową wykonaną w kroku 4.1.8. Zwróć także uwagę, że opcja PRZENIEŚ służy do przenoszenia plików danych w podstawowej grupie plików do napędu P.
Listing 11:Usuń bazę danych 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'
Przenieś TempDB na dysk Q
Aby uzyskać optymalną wydajność dużych baz danych, zaleca się również umieszczenie plików TempDB na dedykowanym dysku.
Używając skryptu z Listingu 9, TempDB zostało przeniesione na dysk Q. Należy zauważyć, że nadmiarowe pliki danych TempDB zostały usunięte podczas tej operacji. Liczba plików danych TempDB powinna odpowiadać liczbie fizycznych procesorów dostępnych dla SQL Server.
Listing 12:Przenieś bazę danych 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
Uruchom usługi aplikacji EPO
Wszystkie usługi aplikacji zostały uruchomione po potwierdzeniu poprawności wystąpienia SQL Server. Uruchomione usługi aplikacji są następujące:
- Serwer aplikacji McAfee ePolicy Orchestrator 4.6.8
- McAfee ePolicy Orchestrator 4.6.8 Analizator zdarzeń
- Serwer McAfee ePolicy Orchestrator 4.6.8
Potwierdź, że tabele są wypełnione
Skrypt na liście 13 potwierdza, że tabela EPOEvents i tabele podrzędne są wypełniane po zakończeniu całego procesu.
Listing 13:Przenieś bazę danych 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;
PUBLIKUJ ZADANIA ZMIANY
Podsumowanie zadań po zmianie
1 Zadanie Custom_Purge EPO Events został stworzony, aby zachować liczbę zdarzeń przechwyconych w ciągu 100 dni. Bardzo ważne jest, aby ta praca zawsze była udana.
2 Nadmiar miejsca wcześniej przydzielonego do serwera bazy danych EPO można odzyskać, w szczególności dysk I – obecnie 1 TB.
3 Zadanie kopii zapasowej Custom_Daily_Backup powstał podczas zmiany. Kopie zapasowe wykonane przez to zadanie spowodują upuszczenie zestawów kopii zapasowych do I:/MSSQL/Backup/ . Konieczna jest zmiana tej ścieżki, jeśli dysk zostanie usunięty z systemu. Konieczne jest również zachowanie tych kopii zapasowych zgodnie z zasadami grupowych kopii zapasowych.
ZAŁĄCZNIKI
ZAŁĄCZNIK I
TABELA DDL 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
ZAŁĄCZNIK II
JOB CUSTOM_PURGE WYDARZENIA EPO
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