Skip to content

Erro ao trocar base AspState da aplicação ASP.NET

Senhores, bom dia.

Hoje eu venho falar de um problema que veio a acontecer em meu trabalho e por isso o texto é rápido e nem considero como um artigo, mas como dica.

Recentemente observarmos que nossa base AspState (Onde guarda as sessões do Asp.Net em modo SQL Server) está extremamente grande, o motivo é por que foi feito a troca de servidor e a base foi restaurada e não foi restaurado o Job que efetua a limpeza de sessões que já expirarão. Pensando na solução a ideia foi colocar uma nova base AspState, mas com outro nome e fazer com que a solução aponte para essa nova base de sessões, depois era só excluir a base antiga.

Para não fazer em produção sem testar, criamos um laboratório que simulava nosso ambiente e ai começou nosso problema! Ao criar a nova base, AspStateNew restore do backup da base AspState, e configurar no web.config (<sessionState mode=”SQLServer” sqlConnectionString=”Initial Catalog=AspstateNew;Data Source=localhost;UID=user;password=senha” allowCustomSqlDatabase=”true” cookieless=”false” timeout=”20″ />) e excluir a antiga o sistema retornou a seguinte mensagem: Invalid object name ‘ASPState.dbo.ASPStateTempApplications’.

Como podemos receber está mensagem se estou apontando para uma nova base?

Pesquisando sobre o problema descobri que quando é gerada a base AspState pelo aspnet_regsql as chamadas nas PROCEDURES para as tabelas utiliza o nome da base gerada, por exemplo ASPState.dbo.ASPStateTempApplications, onde ASPState é a base e ASPStateTempApplications é a tabela. Ou seja, não adianta eu ter criado a base AspStateNew, pois internamente ela continua a chamar a base AspState por ser uma cópia do backup.

Sinceramente acho isso um erro do framework. Espero que alguém possa me elucidar em uma vantagem de assim ser utilizado. Não acho que seja necessário as tabelas serem chamadas também com o nome da base. Mas, como eu disse, pode haver um motivo.

Bom, mas isso não atrapalhou o nosso plano e com isso efetuei a criação da minha nova base através do utilitário aspnet_regsql que se encontra no caminho: C:\Windows\Microsoft.NET\Framework\v4.0.30319. Pelo CMD fiz a seguinte execução e a nova base foi gerada com um novo nome, dessa vez AspStateCurrent:

C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regsql.exe -ssadd -sstype c -d “AspStateName” -S “server\instance” -U “user” -P “password”

Após isso a seguinte mensagem apareceu e o banco foi criado no servidor escolhido:

Start adding session state.
.
Finished.

To use this custom session state database in your web application, please specif
y it in the configuration file by using the ‘allowCustomSqlDatabase’ and ‘sqlCon
nectionString’ attributes in the <system.web>\<sessionState> section.

Atualização 10/03/2014: Esta base de dados quando gerada vem no modelo de banco de dados FULL e o correto, já que esta base não tem problema caso venha a acontecer algum erro, é simples. Por isso após feita sua instalação é alterar o modo para simples e assim seu log não irá crescer como aconteceu aqui na empresa. Outra dica que eu dou é que o JOB que efetua a exclusão de itens expirados é rodado de 1 em 1 minuto, altere o tempo para 5 em 5, pois em alguns momentos observamos muitos locks nesta base.

Bom é isso! Espero ajudar quem também passar por este problema.

Fiquem com Deus

Published in.Net FrameworkSQL Server

Be First to Comment

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *