INTRODUÇÃO
Este documento registra etapas, scripts e ideologia por trás da manutenção realizada em um banco de dados de produção entre 22 de abril de 2015 e 23 de abril de 2015. Os detalhes são específicos para um aplicativo, mas os princípios podem ser úteis para outras pessoas que precisam fazer operações semelhantes em produção .
FUNDO
O banco de dados cresceu para mais de 1,44 TB com a tabela EPOEvents consumindo mais da metade desse tamanho (792 GB). Esforços foram feitos no passado para excluir entradas nesta tabela com mais de 90 dias. Infelizmente, provou-se inútil. O trabalho agendado para conseguir isso nunca pôde ser concluído durante nenhuma sessão. O motivo foi o baixo desempenho do banco de dados.
Após discussão, foi tomada a decisão de eliminar todos os EPOEvents tabela truncando-a. A decisão adicional foi preparar o banco de dados corretamente para o crescimento de dados esperado no futuro.
Os detalhes do servidor de banco de dados em questão estão abaixo:
NOME DO SERVIDOR | SVR-EPO-02 |
NOME DA INSTÂNCIA | SVR-EPO-02\ENG_AVSERVER |
VERSÃO DO SO | Windows 2008 R2 Enterprise (SP1) 64 bits |
VERSÃO DB | Microsoft SQL Server 2008 R2 (SP1) 64 bits |
ENDEREÇO IP | XX.XX.XX.XX |
NOME DO BANCO DE DADOS | ePO4_SVR-EPO-02 |
TABELA DE EPOEVENTOS
O script que define os EPOEvents tabela está documentada no Apêndice I.
Vale ressaltar que a coluna AutoID desta tabela está em relacionamentos de Chave Estrangeira com as tabelas HIP8_EventInfo, HIP8_IPSEventParameter e SCOR_EVENTS. Isso afetou a abordagem usada para truncar a tabela EPOEvents. Os detalhes do resumo estão na tabela abaixo:
Essas informações foram extraídas usando a instrução na Listagem 1.
USE [ePO4_SVR-EPO-02]
GO
EXEC sp_fkeys 'EPOEvents'
RESUMO DO PROCEDIMENTO
Resumo do procedimento usado durante a mudança:
- Implante cinco unidades de 200 GB
- Parar os serviços do aplicativo EPO
- Fazer backup do banco de dados EPO
- Criar um novo grupo de arquivos
- Truncar os EPOEvents da tabela
- Mover EPOEvents para o novo grupo de arquivos
- Recriar chaves estrangeiras na tabela filha
- Script a definição da tabela EPOEvents
- Fazer backup do banco de dados EPO
- Reduzir arquivos de dados no grupo de arquivos PRIMARY
- Fazer backup do banco de dados EPO
- Solte o banco de dados EPO
- Formatar unidade J
- Restaure o banco de dados EPO com MOVE
- Relocalizar TempDB para Drive Q
- Iniciar serviços de aplicativos EPO
- Confirmar que o EPOEvents está preenchido
Implante cinco unidades de 200 GB
Cinco novas unidades foram implantadas no servidor. A lista completa de todas as unidades no servidor é a seguinte:
DRIVE | USE | NOVO? | COMENTÁRIO |
C | Unidade do sistema | NÃO | Tamanho padrão do cluster (4 KB) |
D | Unidade de aplicativo | NÃO | Tamanho padrão do cluster (4 KB) |
Eu | Dados MSSQL (ANTIGO) | NÃO | Tamanho padrão do cluster (4 KB) |
J | Log MSSQL | NÃO | Tamanho de cluster recomendado para SQL (64 K) |
M | Dados MSSQL (FG_LARGE FileGroup) | SIM | Tamanho de cluster recomendado para SQL (64 K) |
N | Dados MSSQL (FG_LARGE FileGroup) | SIM | Tamanho de cluster recomendado para SQL (64 K) |
O | Dados MSSQL (FG_LARGE FileGroup) | SIM | Tamanho de cluster recomendado para SQL (64 K) |
P | Dados MSSQL (grupo de arquivos PRIMÁRIO) | SIM | Tamanho de cluster recomendado para SQL (64 K) |
P | MSSQL TempDB | SIM | Tamanho de cluster recomendado para SQL (64 K) |
Todas as novas unidades foram formatadas usando tamanho de cluster de 64 K, conforme recomendado pela Microsoft para unidades contendo dados do MS SQL Server ou arquivos de log[1]. A unidade J também foi reformatada após fazer um backup do banco de dados.
[1] A discussão completa está acessível em https://msdn.microsoft.com/en-us/library/dd758814.aspx
Parar os serviços do aplicativo EPO
Todos os serviços de aplicativos foram interrompidos para garantir que não houvesse atualização no banco de dados durante o período da alteração. Os Serviços de Aplicativos parados (ou confirmados como inativos) são os seguintes:
- Servidor de aplicativos McAfee ePolicy Orchestrator 4.6.8
- Analisador de eventos do McAfee ePolicy Orchestrator 4.6.8
- Servidor McAfee ePolicy Orchestrator 4.6.8
Faça backup do banco de dados EPO
O primeiro backup do banco de dados foi feito antes de qualquer ação na estrutura existente, usando o script da Listagem 2.
Lista 2:Primeiro backup do banco de dados 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'
Criar um novo grupo de arquivos
Um novo grupo de arquivos chamado FG_LARGE foi criado com o equivalente do script na Listagem 3. Todos os arquivos adicionados ao grupo de arquivos foram definidos com um tamanho inicial de 40 GB, incremento de 1 G e tamanho máximo de 100 GB.
Listagem 3:Criação do grupo de arquivos 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
Truncar os eventos EPOE da tabela
A Listagem 4 mostra o conjunto completo de tarefas necessárias para truncar a tabela EPOEvents com êxito. O script inclui notas para maior clareza.
A questão fundamental a ser observada é que é impossível truncar uma tabela que participa como pai em um relacionamento de chave estrangeira. Isso violaria a integridade referencial. A exclusão funcionaria e preservaria a integridade referencial, pois as Chaves Estrangeiras são normalmente definidas com as cláusulas ON DELETE CASCADE ou ON DELETE SET NULL.
Lista 4:Truncando a tabela EPOEvents e realocando para um novo 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;
Mover EPOEvents para o novo grupo de arquivos
A tabela EPOEvents foi movida para o grupo de arquivos FG_LARGE usando o script na Listagem 5.
Listagem 5:Movendo o grupo de arquivos de eventos EPOE 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
Recriar chaves estrangeiras em tabelas filhas
As chaves estrangeiras em tabelas filhas identificadas na etapa 4.1.5 foram recriadas com o script na Listagem 6.
Listagem 6:Truncando a tabela EPOEvents e realocando para um novo grupo de arquivos
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 a definição da tabela EPOEvents
Como backup, foi ideal para scripting da extração do DDL da tabela EPOEvents. Isso foi feito clicando com o botão direito do mouse e selecionando a opção Script Table as> CREATE To> New Query Editor Window do Pesquisador de Objetos do SSMS[1]. O script resultante pode ser salvo em um .sql Arquivo.
Faça backup do banco de dados EPO
Um segundo backup do banco de dados do EPO foi feito com o script na Listagem 7 para preparar o próximo estágio (redução do arquivo de dados).
Lista 7:Segundo backup do banco de dados 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'
Reduza os arquivos de dados no grupo de arquivos PRIMARY
A redução é necessária para recuperar o espaço liberado truncando a tabela EPOEvents. Também foi crucial neste caso, pois os arquivos de dados exigiam a realocação para uma unidade menor.
Os arquivos de dados foram realocados da unidade I – uma unidade de 3 TB para a unidade P, uma unidade de 200 GB.
Os três arquivos de dados no grupo de arquivos PRIMARY foram nomeados logicamente ePO4_SVR-EPO-01 (~300 GB), ePO4_SVR-EPO-02 (~500 GB) e ePO4_SVR-EPO-03 (~400 GB).
O objetivo era reduzir todos os arquivos para 40.000 MB cada. A tarefa exigiu de cinco a sete iterações, cada uma removendo 50.000 MB.
Listagem 8:Reduzindo arquivos de dados no grupo de arquivos 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
Faça backup do banco de dados EPO
Um segundo backup do banco de dados do EPO foi feito usando o script na Listagem 5 para se preparar para o próximo estágio (descartando o banco de dados existente). O script está presente na Listagem 9 .
Listagem 9:Primeiro backup do banco de dados 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'
Eliminar o banco de dados EPO
O banco de dados foi descartado usando a GUI do SSMS - clique com o botão direito do mouse no banco de dados e selecione a opção "excluir" no menu suspenso. O SQL equivalente está na Listagem 10 .
Listagem 10:Elimine o banco de dados EPO
USE [master]
GO
DROP DATABASE [ePO4_SVR-EPO-02]
GO
Formatar unidade J
Esta etapa formata a unidade J, usando o tamanho de cluster de 64 K, conforme recomendado pela Microsoft para um desempenho de E/S ideal. Essa tarefa foi executada anteriormente nas novas unidades implantadas na etapa 4.1.1.
A Figura 3 mostra a opção selecionada na caixa de diálogo Formatar….
Restaure o banco de dados EPO com MOVE
A operação de restauração foi necessária por três motivos:
- Para formatar a unidade J que contém os arquivos de log da transação (como acima).
- Para remover qualquer fragmentação causada pela operação de redução.
- Para realocar o banco de dados para novas unidades.
O script na Listagem 11 serve para restaurar. Observe que o conjunto de backup usado para essa restauração é o último backup feito na etapa 4.1.8. Além disso, observe que a opção MOVE serve para realocar os arquivos de dados no grupo de arquivos PRIMARY para a unidade P.
Listagem 11:Elimine o banco de dados 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'
Relocalizar TempDB para Drive Q
Para o desempenho ideal de grandes bancos de dados, também é recomendável localizar os arquivos TempDB em uma unidade dedicada.
Usando o script na Listagem 9, o TempDB foi realocado para a unidade Q. Observe que os arquivos de dados redundantes do TempDB foram removidos durante esta operação. O número de arquivos de dados TempDB deve corresponder ao número de CPUs físicas disponíveis para o SQL Server.
Listagem 12:realocar 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
Iniciar serviços de aplicativos EPO
Todos os serviços de aplicativo foram iniciados assim que a instância do SQL Server foi confirmada como OK. Os serviços de aplicativos iniciados são os seguintes:
- Servidor de aplicativos McAfee ePolicy Orchestrator 4.6.8
- Analisador de eventos do McAfee ePolicy Orchestrator 4.6.8
- Servidor McAfee ePolicy Orchestrator 4.6.8
Confirme que as tabelas estão preenchidas
O script que está listando 13 confirma que a tabela EPOEvents e as tabelas filhas estão sendo preenchidas após a conclusão de todo o processo.
Listagem 13:realocar 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;
TAREFAS DE PÓS MUDANÇA
Resumo das tarefas pós-alteração
1 O trabalho Custom_Purge EPO Events foi criado para manter o número de eventos capturados em 100 dias. É crucial garantir que este trabalho seja sempre bem-sucedido.
2 O espaço excessivo anteriormente alocado para o servidor de banco de dados EPO pode ser recuperado, principalmente a unidade I – atualmente 1 TB.
3 Um trabalho de backup Custom_Daily_Backup foi criado durante a mudança. Os backups feitos por esta tarefa descartarão os conjuntos de backup para I:/MSSQL/Backup/ . É essencial alterar esse caminho se a unidade I for removida do sistema. Também é necessário preservar esses backups de acordo com a Diretiva de Backup de Grupo.
APÊNDICES
APÊNDICE I
TABELA DE EPOEVENTOS DDL
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
APÊNDICE II
JOB CUSTOM_PURGE EPO DE 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