Filegroup–Considerações e Curiosidades–(Mito)

Posted on outubro 29, 2013

2


Introdução

O Filegroup é um ótimo recurso quando queremos otimizar nossa rotina de backup ou aumentar a alta disponibilidade de um banco de dados. Porém muitas pessoas possuem conceitos errados sobre esse recurso. Por padrão, temos o FILEGROUP chamado de PRIMARY é nele aonde o arquivo .MDF está localizado. É possível criar N arquivos .NDF, que são arquivos secundários do banco de dados apontando para diferentes locais. Saiba mais aqui – http://www.devmedia.com.br/trabalhando-com-filegroups-no-sql-server/13723 .

O Cenário

A equipe de banco de dados recebeu um grande desafio, novas tabelas seriam criadas dentro do banco de dados, tabelas críticas para o negócio e teriam milhões de inserções por dia. Para isso, foi adicionado uma nova unidade no servidor, a unidade E:, a idéia da equipe foi realizar a criação de um novo FILEGROUP para hospedar essas novas tabelas e com isso apontar os arquivos desse novo FILEGROUP chamado SECONDARY para a unidade E:. Os arquivos anteriores do banco de dados estão armazenados na unidade C: e foi reportado que esse disco possue pouco espaço em HD.

O Problema

Inicialmente o banco de dados possuia somente um arquivo .MDF que estava ficando sem espaço.

Foto2

(Figura 1 – Arquivo .MDF com pouco espaço disponível.)

Com isso a Equipe viu tambêm que o arquivo estava limitado para crescimento e resolveu criar um novo arquivo dentro do FILEGROUP PRIMARY.

Foto4

(Figura 2 – Criação do novo arquivo dentro do FILEGROUP PRIMARY, porém o HD possue quase nenhum espaço disponível.)

A idéia da Equipe então foi fazer o que realmente foi programado, realizar a criação de um novo FILEGROUP chamado SECONDARY e com isso criar um arquivo dentro da unidade E: e marcar o FILEGROUP como DEFAULT, e assim todas as operações seriam direcionadas para esse novo arquivo, não se preocupando mais com o FILEGROUP PRIMARY.

Foto4

(Figura 3 – Criação do novo arquivo dentro do FILEGROUP SECONDARY.)

Foto4

(Figura 4 – Marcando o novo FILEGROUP como DEFAULT.)

Durante a madrugada, uma importante rotina é executada para atualização de todos os saldos e créditos de todos os conveniados. Logo pela manhã a equipe é reportada que essa atualização não foi feita e mais, o banco de dados está inacessível.

O erro gerado –

–** An error was encountered during execution of batch. Continuing.
–Msg 1105, Level 17, State 2, Line 28
–Could not allocate space for object ‘dbo.DadosCliente’ in database ‘Dados’ because the ‘PRIMARY’ filegroup is full.
–Create disk space by deleting unneeded files, dropping objects in the filegroup,
–adding additional files to the filegroup,or setting autogrowth on for existing files in the filegroup.

A Equipe de banco de dados não conseguia entender, eles haviam criado um novo FILEGROUP chamado de SECONDARY e haviam marcado o mesmo como DEFAULT, qual seria o problema afinal ?

O Solução

O Problema é a concepção errada da opção DEFAULT do FILEGROUP. A opção DEFAULT é simplesmente para que todas as novas criações de objetos sejam criadas sem que seja necessário a especificação do ON NomedoFilegroup

Se realizarmos a criação de um novo objeto veremos que não será lançado nenhum erro porque o DEFAULT está marcado para o novo FILEGROUP e os arquivos estão apontados para o disco E: que possue espaço.

CREATE TABLE DadosClienteFilegroupSecondary

(

            ID INT IDENTITY NOT NULL,

            Nome VARCHAR(50) NOT NULL

)

 

INSERT INTO DadosClienteFilegroupSecondary (Nome)

VALUES (‘LuanMorenoMedeirosMaciel’)

GO 10000

 

Foto4

(Figura 5 – Arquivo do FILEGROUP SECONDARY crescendo pelas inserções dentro da tabela DadosClienteFilegroupSecondary que está no FILEGROUP SECONDARY.)

Se tentarmos novamente realizar a inserção de registros na tabela na qual está vinculada no PRIMARY FILEGROUP teremos o mesmo erro gerado anteriormente

INSERT INTO DadosCliente (Nome1,Nome2)

SELECT REPLICATE(‘LuanMorenoMedeirosMaciel’,150),REPLICATE(‘CassiaNunesSilva’,150)

 

O erro gerado –

–** An error was encountered during execution of batch. Continuing.
–Msg 1105, Level 17, State 2, Line 28
–Could not allocate space for object ‘dbo.DadosCliente’ in database ‘Dados’ because the ‘PRIMARY’ filegroup is full.
–Create disk space by deleting unneeded files, dropping objects in the filegroup,
–adding additional files to the filegroup,or setting autogrowth on for existing files in the filegroup.

Para solucionar o problema é necessário somente realizar a criação de um novo arquivo na unidade E: dentro do PRIMARY FILEGROUP.

ALTER DATABASE Dados

ADD FILE

(

            NAME = Dados4,

    FILENAME = ‘E:\basesdados\Dados4.ndf’,

    SIZE = 300MB,

    MAXSIZE = 350MB,

    FILEGROWTH = 50MB

)

TO FILEGROUP [Primary]

GO

 

Se tentarmos realizar a inserção teremos agora…

 

INSERT INTO DadosCliente (Nome1,Nome2)

SELECT REPLICATE(‘LuanMorenoMedeirosMaciel’,150),REPLICATE(‘CassiaNunesSilva’,150)

(1 row(s) affected)

Conclusão

Esse ocorrido é um fato veridico, a empresa ficou com a base inoperante durante 4 horas. O que podemos tirar de aprendizado é sempre prestarmos muita atenção no que estamos fazendo mais principalmente entender no que estamos mexendo. Em um detalhe pequeno podemos comprometer toda uma organização, portante quando forem realizar qualquer alteração estudem e se preparem para isso.