Categorias
banco de dados desempenho dicas sql server

Problemas de cache no SQL Server

Se voc?? estiver recebendo uma mensagem do tipo:

O SQL Server encontrou %d ocorr??ncia(s) de libera????o de armazenamento em cache para o cache ‘%s’ (parte do cache do esquema) devido ?? manuten????o do banco de dados ou opera????es de reconfigura????o.

ou

SQL Server has encountered %d occurrence(s) of cachestore flush for the ‘%s’ cachestore (part of plan cache) due to some database maintenance or reconfigure operations.

?? porque, segundo a MSDN, ao limpar o cache do plano gera uma recompila????o de todos os planos de execu????o subseq??entes e pode provocar uma queda repentina e tempor??ria no desempenho da consulta. Para cada armazenamento em cache limpo no cache do plano, aparece a mensagem supracitada.

Para resolver isso, basta ir no banco correspondente, clicar com o direito sobre ele e escolher Properties (Propriedades). Entre em Options (Op????es) e configure o Auto-Close (Fechamento Autom??tico) para False.

Categorias
banco de dados cloud server crystal reports dll erros iis locaweb plesk sql server windows

Mega Post de Erros

Lidar com erros ?? algo realmente muito chato… Chato demais! Esses dias fui convocado para fazer um certo trabalho de migra????o entre servidores. Um desses servidores era um Cloud Server Pro da Locaweb. Em muitos posts que aqui escrevi tem um pouco retratando sobre a Locaweb. Trabalho e j?? trabalhei muito com ela e sei de todos os seus passos e “artimanhas” de atendimento… O antigo Cloud Server foi at?? tranquilo de trabalhar, mas esse novo… Vamos aos problemas!

Uma dica que dou sempre quando algu??m quer contratar um servidor: leiam muito sobre os pr??s e contras. Os pr??s vejam no pr??prio site do prestador, os contras vejam nos relatos de usu??rios. No post a seguir n??o estou jogando a Locaweb contra a parede, apenas estou expondo erros que podem ser sanados de forma f??cil mas que burocraticamente ?? jogado para o cliente se virar (nos 30!).

Nesse Cloud Server vem embutido o Plesk. Em poucas palavras serve para gerenciar a hospedagem atrav??s de uma interface web. ?? uma boa ferramenta de ger??ncia, tem tudo para gerenciar sua hospedagem. S?? que esse demais gera ocupa????o demais (redund??ncia) de espa??o em disco. Dos 50 Gb que voc?? contrata, 40Gb ?? para o sistema operacional e 10Gb para seus arquivos. Sendo que dos 10Gb ?? para todos os seus arquivos, e-mails, banco de dados, etc. Ou seja, apenas usufrui dos 10Gb um pouco menos que 9Gb e olhe l??.

Bem, dizem que vem tudo preparado e instalado para usar… Verdade at?? certa parte! Quem est?? usando e ?? iniciante vai ver que ?? mil maravilhas. D?? para fazer o b??sico de tudo. O problema vem a seguir…

Um cliente contratou o Cloud Server gerenciado pelo cliente (ou seja, sobrou para o usu??rio final) e me passou para configurar e deixar no ponto de uso fazendo toda a migra????o e instala????o. Em um passe de m??gica surgem os problemas…

Os bancos de dados que vem s??o o MS SQL Server 2008 e o MySQL. N??o h?? interface para dump e recovery das bases for??ando a usar o Plesk para isso, mas n??o queria. Onde est?? o Management Studio 2008? Onde est?? o MySQL Workbench? Como vou fazer para migrar as bases? Gerar script de bancos gigantes? Nem pensar! Preciso instalar!

Mas como instalar esses aplicativos? Se fazer download, gera tr??fego. Se pedir para a Locaweb tem que pagar e se pedir, de gra??a, n??o instala! Lembrando que esses aplicativos, no m??nimo, s??o gratuitos e deveriam estar em uma zona em que os usu??rios pudessem obt??-los de forma f??cil e sem cobran??a. Pois bem, feito o download, hora de instalar. Abrindo o execut??vel (lembrando que tem que ser a da vers??o 64bits) d?? aviso de incompatibilidade. ?? preciso instalar o Service Pack 1 do SQL Server 2008 (mais tr??fego). Baixado o SP1 ?? preciso instal??-lo. Tranquilo e instalado sem problemas. Hora de instalar o Management Studio

Ao tentar abrir, outro problema?!?! ?? preciso do Framework 3.5! Incrivel… No Cloud Server vem instalado a vers??o 2.0 e 4.0 do Framework ASP.NET mas n??o tem a 3.5 ativado. Menos mal, porque no Windows Server 2008 ?? nativo, basta ativar. Realize os seguintes passos (retirado do Wiki):

  1. Clique em Start, Administrative Tools e selecione Server Manager;
  2. Na interface, clique em Features e clique em Add Features;
  3. Selecione a primeira op????o .NET Framework 3.5.1 Features e adicione todos seus dependentes;
  4. Conclua a instala????o do Framework.

Agora sim, tudo pronto! Vamos instalar o Management Studio. Clica no instalador e… Erro! Caramba… de novo!

TITLE: SQL Server Setup failure.
——————————-


SQL Server Setup has encountered the following error:


Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

A dica ??: feche o Windows Explorer! Por algum motivo, a instala????o do Management Studio n??o inicia quando o Windows Explorer estiver em aberto. Copie para a ??rea de Trabalho e abra o instalador… Agora sim! Depois de tanta malemol??ncia pelo menos iniciemos a instala????o. Para quem tem d??vidas e um passo-a-passo bem explicativo de como instalar o Management Studio, acesse aqui o post de Marcos dell Antonio. H?? uma dica bem interessante que pode confundir o usu??rio na hora da instala????o. Terminado a instala????o, menos um item da lista de afazeres.

Consegui conectar ao SQL Server local, criei as bases, usu??rios, fiz restores, configurei o backup, providenciei tudo o que tinha que fazer onde o Plesk jamais pensaria em um dia ser. Agora o principal, testar um website. Publiquei o site no IIS e abri o navegador para visualizar. Erro!

Could not load type ‘System.ServiceModel.Activation.HttpModule’ from assembly ‘System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’.

Sabe o porqu?? disso? Eu instalei o ASP.NET 3.5 depois que eu j?? tinha a vers??o 4.0 instalada por causa do Management Studio ent??o gerou conflito nas DLL’s. Para resolver, fa??a o seguinte:

  1. V?? para a pasta C:WindowsMicrosoft.NETFramework64v4.0.30319;
  2. Execute o comando aspnet_regiis.exe -iru

Agora vamos testar! Abri o navegador e digitei o endere??o e… Mais erro!

There is a duplicate ‘system.web.extensions/scripting/scriptResourceHandler’ section defined

Mais conflitos! Se voc?? tiver outra vers??o do System.Web.Extensions instalado, devido ao ASP.NET AJAX por exemplo, a vers??o que est?? no GAC do sistema difere da que voc?? quer chamar ocorrendo ambiguidade. O correto seria alterar os assemblys mas como isso ?? muito trabalhoso e pode acontecer algum imprevisto para aqueles que n??o sabem manuse??-las, ent??o aconselho o seguinte: remova toda a sectionGroup do seu web.config ou comente-as:

<!–
<sectionGroup name=”system.web.extensions” type=”System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
<sectionGroup name=”scripting” type=”System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
<section name=”scriptResourceHandler” type=”System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”MachineToApplication” />
<sectionGroup name=”webServices” type=”System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
<section name=”jsonSerialization” type=”System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”Everywhere” />
<section name=”profileService” type=”System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”MachineToApplication” />
<section name=”authenticationService” type=”System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”MachineToApplication” />
</sectionGroup>
</sectionGroup>
</sectionGroup>
–>

No caso comentei o sectionGroup do System.Web.Extension que pode estar na vers??o 1.0, 2.0 ou 3.5 que for.

Agora vamos l??! De p??s juntos e m??os dadas: Abre o navegador e… e… e… Funcionou! Depois de um ??rduo trabalho aparentemente tudo estava normal. Vamos testar outros sites e… e… e… Mais erros!

Quem ainda n??o est?? acostumado a trabalhar com Windows Server 2008 e IIS 7 ter?? que aprender muito sobre permiss??es e tratamento de erros. Incontestavelmente a tela do erro 500 ir?? aparecer e muito se sua aplica????o n??o estiver configurada adequadamente para o IIS 7. Nem sempre a mesma aplica????o que est?? no IIS 6 ir?? funcionar no IIS 7. Ent??o eis que surge a tela do Erro 500 Erro Interno do Servidor ou Error 500 Internal Server Error:



Ou ent??o:

D?? para descobrir o que ??? Vou dar a dica: revise seu web.config. “Ah, mas est?? tudo certo, n??o sei porque n??o funciona…”. Engano, est?? errado. J?? disse que o IIS 7 ?? chato, muito chato. O parser dele ?? muito minucioso e se n??o estiver nos padr??es vai dar problema.

Se voc?? n??o sabe utilizar bem o IIS e tem medo de alterar uma coisinha ali e outra acol?? vou dar a maior dica: saia abrindo cada op????o do painel da aplica????o at?? que uma delas acuse um erro de configura????o.

Por exemplo, abra o item Documento Padr??o. Se ele estiver configurado corretamente ent??o abrir?? a pr??xima tela normalmente. Se tiver algum erro, aparecer?? um alerta. Ent??o no web.config voc?? deve corrigir a sess??o correspondente. Ficou claro? Saia clicando um a um at?? que um deles se denuncie podendo ent??o fazer a corre????o.

O que ocorreu comigo foi que um site que estava no IIS 6 podia colocar a mesma p??gina (index.aspx) como padr??o, duas vezes, e n??o tinha problema. Quando foi para o IIS 7, na qual estava herdando a configura????o pai, e foi adicionar a p??gina index.aspx como padr??o novamente, ele dava erro e n??o sabia porqu??. Ent??o removi a entrada do web.config e funcionou. Desabilitar a mensagem de erro amig??vel no navegador vai funcionar (encontrar o erro)? N??o. Desabilitar as p??ginas de erros personaliz??veis do IIS vai funcionar (encontrar o erro)? Talvez ou n??o. Depende muito do ambiente que est?? configurado e quem est?? manipulando.

Pronto! Mais um problema solucionado… Vamos testar outro site e… e… e… Erro! Agora aconteceu um erro 404. Mas como? Erro 404 de p??gina n??o encontrada mas se o caminho est?? l??? Incrivelmente no IIS do Cloud Server possuem dois Applications Pools do Plesk (e mais outros nativos): Plesk(default)(2.0) e Plesk(default)(4.0). O pool do 2.0 quase nem sempre funciona. E um comportamento anormal ?? que se voc?? tem um site pai em 2.0 e um filho em 2.0 ??s vezes p??ra de funcionar. O “correto” ?? ter um pai 2.0 ou 4.0 com filho sempre 4.0. Estranho? Pode crer! E onde est?? o pool do 3.5? Tem que criar na m??o mesmo.

Nota: Se voc?? reiniciar o IIS o Plesk p??ra de vez e n??o volta:

Voc?? ter?? que inici??-lo manualmente. Mas antes ter?? que iniciar seu pool tamb??m (que ?? muito suspeito):

 Ajeitado uma coisinha ali, outra aqui, vamos testar mais algumas coisas e… e… e… Quase tudo certo. Em quest??o de funcionalidade (que deveria ser) est?? quase tudo certo a n??o ser o funcionamento do bom e velho Crystal Reports. Quem j?? leu o post de erros do Crystal aqui e aqui nos deparamos com o erro:

O inicializador de tipo de ‘CrystalDecisions.CrystalReports.Engine.ReportDocument’ acionou uma exce????o

ou

The type initializer for ‘CrystalDecisions.CrystalReports.Engine.ReportDocument’ threw an exception

Cuidado! Esse n??o ?? o descritivo do erro. S?? com isso n??o d?? para saber o motivo. Fa??a o debug, log,  exibi????o da pilha ou na pr??pria tela exiba o erro (sem ter AJAX) que teremos o erro completo. No link dos dois posts anteriores que fiz explica o problema do Crystal na plataforma 64bits e como pode resolver. S?? que o problema no meu caso era permiss??o.

Server Error in ‘/virtual_directory_name’ Application.
Error in File UNKNOWN.RPT:
The request could not be submitted for background processing.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.


Exception Details: System.Runtime.InteropServices.COMException: Error in File UNKNOWN.RPT: The request could not be submitted for background processing.

Os usu??rios listados abaixo, n??o tinham permiss??o na execu????o de scripts DCOM e grava????o em algumas pastas (principalmente as que est??o na unidade C):

  • IWAN_plesk(default)
  • IUSR
  • IIS_IUSR
  • NETWORK SERVICE
  • INTERACTIVE

Esses s??o os usu??rios que devem ter privil??gio (descritos abaixo) nas pastas listadas abaixo:

  • C:WindowsTemp : leitura escrita
  • C:Program Files (x86)Business ObjectsCommon2.8bin : leitura
  • C: : leitura

Obs: Para alguns servidores ?? preciso aplicar o Replace permission entries on all child objects nessas pastas.

Lembrando de reiniciar o IIS e/ou o servidor para recarregar as configura????es.

Se estiver trabalhando com Windows Service ou Windows Form e ocorra o erro:

System.IO.FileNotFoundException: Retrieving the COM class factory for component with CLSID {5FF57840-5172-4482-9CA3-541C7878AE0F} failed due to the following error: 8007007e

Basta compilar sua aplica????o em x86.

E agora, tudo certo? At?? o momento sim. Porque n??o dizer que est?? tudo OK? Depois de ter ocorrido todos esses problemas, fica-se receoso com o futuro. Pode ser que ocorra outro problema posteriormente? Sim e ir??.

Conforme disse anteriormente, o post n??o ?? para dizer mal sobre a Locaweb e/ou Plesk. Acho que eles prestam um servi??o adequado para o n??vel nacional (at?? uso) contudo s??o coisas que acontecem que simplesmente poderiam ser sanadas antes de jogar o pepino para o cliente. Se voc?? tiver algum problema desses e sua ger??ncia for pelo cliente, nem adianta pedir que eles v??o lhe informar: “o gerenciamento ?? por conta do cliente e n??o nos responsabilizamos” ou “a ferramenta (Plesk) ?? terceirizada e n??o prestamos suporte.”. Enfim, espero que o post ajude a voc??, cliente e usu??rio, a corrigir seus problemas/pepinos que ocorrerem. Isso me lembra quando lan??ou o plug-and-play… a velha piadinha do plug-and-pray (ligar e rezar) n??o some da cabe??a quando ocorre esse tipo de problema. Porque ser???

Categorias
banco de dados firebird

ASP.NET com Banco Firebird

Semelhantemente com o post do MySQL, irei demonstrar como conectar a um banco Firebird usando o Framework (DLL) que eles disponilizam e que pode ser obtido aqui. Vou resumir o processo pois ?? bem parecido, da?? ?? s?? dar uma olhadinha r??pida no post anterior.
Basicamente incorpore a DLL no projeto e crie uma nova classe chamada Firebird. Adicione o namespace FirebirdSql.Data.FirebirdClient e adicione o seguinte c??digo para consulta:

FbConnection conexao = new FbConnection(“String Conex??o Firebird”);
FbCommand comando = new FbCommand();
FbDataReader datareader = null;
try
{
    conexao.Open();
    try
    {
        FbTransaction transacao = conexao.BeginTransaction();
        comando.Connection = conexao;
        comando.CommandText = “SELECT * FROM Tabela”;
        datareader = comando.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
        transacao.Commit();
    }
    catch (FbException erro) { }
}
catch (FbException erro) { }

Bem semelhante… nada de novo! Da?? pode-se gerar os demais m??todos de conex??o a partir desse. 
Vi em alguns t??picos pela NET que o pessoal encontra alguns problemas ao tentar conectar ao Firebird. O principal erro ??: “Your user name and password are not defined. Ask your database administrator to set up a Firebird login.”
Novamente, vi solu????es muito loucas e esdr??xulas mas que foram tentativas de ajudar e de boa vontade do pessoal. Bem, mesmo que seu login e senha estejam certos (e tenha certeza disso antes de reclamar), o Firebird, em comunica????o com a DLL, n??o d??o muita transpar??ncia e ajuda ao usu??rio. O problema, basicamente, ?? a string de conex??o. Basta usar essa:

User=SYSDBA; Password=masterkey; Database=C:BancosFirebirdThiago.fdb; DataSource=localhost; Port=3050; Dialect=3; Charset=NONE; Role=; Connection lifetime=15; Pooling=true; MinPoolSize=0; MaxPoolSize=50; Packet Size=8192; ServerType=0;

Ou

User=SYSDBA; Password=masterkey; Database=C:BancosFirebirdThiago.fdb; Server=localhost;

Problema resolvido!

Categorias
banco de dados dll mysql

ASP.NET com Banco MySQL

Todos viram aqui que meus posts dispensam muito embasamento te??rico e parte logo para a pr??tica. Gosto de ser direto… ent??o, vamos l??! Para conectar a bancos MySQL podemos utilizar o ODBC do .NET para conectar e realizar consultas a ele. Contudo, esse tipo de conex??o ?? mais lento e n??o usurfrui de conjunto de instru????es espec??ficas que podem otimizar as opera????es sobre o banco de dados, exemplo o namespace System.Data.SqlClient no qual possuem instru????es espec??ficas do SQL Server para manipula????es dos dados. Assim sendo, a pr??pria MySQL disponibilizou um conector espec??fico para programa????o .NET. Para isso, pode realizar o download aqui.

Fa??a o download do instalador ou zip para obtermos as DLLs. Caso tenham dificuldade na obten????o dos arquivos, vejam nesse link aqui onde cont??m apenas as DLLs b??sicas para o funcionamento. Com os arquivos em m??os, insira-os na pasta Bin do projeto ou d?? um Add Reference para incorpor??-las. Com as DLLs no seu devido local, as classes MySQL j?? podem ser acessadas quando adicionado o namespace MySql.Data.MySqlClient. Abaixo, temos um exemplo de realizar uma consulta no banco de dados. Nota-se que se assemelha bastanto com o SqlDataReader, OdbcDataReader, etc:

using MySql.Data.MySqlClient;

MySqlConnection conexao = new MySqlConnection(“String Conex??o MySQL”);
MySqlCommand comando = new MySqlCommand();
MySqlDataReader datareader = null;
try
{
    conexao.Open();
    try
    {
        comando.Connection = conexao;
        comando.CommandText = “SELECT * FROM Tabela”;
        datareader = comando.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
    }
    catch (MySqlException erro) { }
}
catch (MySqlException erro) { }

O objeto MySqlDataReader cont??m os dados da consulta efetuada. Bem similiar com as outras formas de uso de conex??o, ent??o n??o h?? erro. Parameters, DataSet e muitos m??todos que o conector fornece podem ser usados de forma similar aos demais conectores citados anteriormente. F??cil…

Ent??o ?? isso! Caso tenham dificuldade na string de conex??o para o MySQL veja no ConnectionStrings a mais adequada a sua necessidade.

Categorias
banco de dados log sql server

Reduzir Log SQL Server

Nesse primeiro post sobre SQL Server vou explicar como reduzir o log do SQL Server 2005 e 2008. No log cont??m as instru????es que foram executadas ultimamente no banco de dados. Para quem trabalha com recupera????o em log pode preferir manter o log por algum per??odo antes de fazer uma redu????o. Mas para outros bancos de dados que realizam inser????es e atualiza????es constantes pode ficar invi??vel manter o log por grandes per??odos devido a prover um crescimento exarcebado. Bem isso voc?? pode ver melhor a depender da pol??tica de backup que voc?? for utilizar. Considerando que o log para voc?? n??o tem import??ncia de mant??-lo por muito tempo e n??o quer mexer nas configura????es no SQL Server, essa ?? uma boa dica de fazer a redu????o atrav??s de comandos SQL.

Pelo pr??prio SQL Server Management Studio voc?? pode utilizar da fun????o Shrink e fazer a redu????o do banco de dados e log. Muitas vezes a redu????o (vamos nos atentar ao do log) chega a ser pouca pois ele mant??m ainda algumas das instru????es mais recentes. Mas para for??osamente realizar a redu????o execute a seguinte intru????o:

SQL Server 2005
USE Banco_Dados
GO
BACKUP LOG Banco_Dados WITH TRUNCATE_ONLY
DBCC SHRINKFILE (Banco_Dados_log, 1)

SQL Server 2008
USE Banco_Dados;
GO
ALTER DATABASE Banco_Dados
SET RECOVERY SIMPLE;
GO
DBCC SHRINKFILE (Banco_Dados_Log, 1);
GO
ALTER DATABASE Banco_Dados
SET RECOVERY FULL;
GO
 
Ambos os procedimentos fazem com que o log seja reduzido a 1Mb. Nota-se que a instru????o de redu????o ?? a mesma. A ??nica diferen??a ?? que para realizar a trucamento, no 2005 ?? preciso informar que o backup de log ser?? truncado explicitamente e no 2008 deve mudar o status para recupera????o simples antes de trunc??-lo. Se quiser realizar o truncamento autom??tico de todos os bancos do servidor basta fazer um SELECT com cursor sobre todos os bancos pegando o name deles e executando o script acima. Mas isso deixarei para mostrar outro dia…