{"id":9187,"date":"2018-07-17T09:17:22","date_gmt":"2018-07-17T12:17:22","guid":{"rendered":"http:\/\/www.fabriciolima.net\/?p=9187"},"modified":"2018-07-17T09:54:29","modified_gmt":"2018-07-17T12:54:29","slug":"azure-sql-database-quanto-posso-usar-de-transaction-log-e-ilimitado","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2018\/07\/17\/azure-sql-database-quanto-posso-usar-de-transaction-log-e-ilimitado\/","title":{"rendered":"Azure SQL Database &#8211; Quanto posso usar de Transaction Log? \u00c9 ilimitado?"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-9216 aligncenter\" src=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/AzureSQLDatabaseFotoE03.png\" alt=\"\" width=\"434\" height=\"261\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/AzureSQLDatabaseFotoE03.png 594w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/AzureSQLDatabaseFotoE03-300x180.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/AzureSQLDatabaseFotoE03-410x246.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/AzureSQLDatabaseFotoE03-100x60.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/AzureSQLDatabaseFotoE03-275x165.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/AzureSQLDatabaseFotoE03-20x12.png 20w\" sizes=\"auto, (max-width: 434px) 100vw, 434px\" \/><\/p>\n<p>Fala Pessoal,<\/p>\n<p>Continuando os posts sobre Azure SQL Database, dessa vez vamos falar sobre um <span style=\"color: #ff0000;\"><strong>erro de Log Full<\/strong> <\/span>que consegui gerar em uma base no Azure.<\/p>\n<p>O Transaction Log de uma base no azure funciona da mesma forma que em uma inst\u00e2ncia On-Premise.<\/p>\n<p>Como no azure n\u00e3o conseguimos utilizar uma base com o recovery SIMPLE, toda base tem o recovery FULL, ou seja, nossas opera\u00e7\u00f5es de <strong>INSERT\/UPDATE\/DELETE<\/strong> ficam no transaction log at\u00e9 que o backup do log salve essas informa\u00e7\u00f5es e permita que elas sejam liberadas do log.<\/p>\n<p>Nada diferente do que temos hoje no On-Premise.<\/p>\n<p>Um dos problemas que temos hoje \u00e9 estourar o log com <strong>REBUILD<\/strong> ou quando algu\u00e9m deixa uma <strong>transa\u00e7\u00e3o aberta<\/strong>. Aquele famoso <strong>BEGIN TRAN<\/strong> que o <strong>desenvolvedor<\/strong> (exemplo meramente ilustrativo) deixou aberto e foi almo\u00e7ar.<\/p>\n<p>Quando contratamos uma base no Azure, n\u00e3o \u00e9 definido qual o tamanho do transaction log dessa base.<\/p>\n<p>Por exemplo, nos meus testes eu contratei a base na vers\u00e3o mais barata com <strong>5 DTUs<\/strong> e <strong>2 GB<\/strong> m\u00e1ximo de tamanho de base.<\/p>\n<h6><strong>E tamanho do Transaction log? \u00c9 Ilimitado?<\/strong><\/h6>\n<p>Para tentar pegar essas respostas fiz um teste com os scripts abaixo:<\/p>\n<pre class=\"lang:tsql decode:true \">--Cria uma tabela de teste\r\nCREATE TABLE [dbo].[Teste_TransactionLog](\r\n\t[Col] [VARCHAR](8000) NULL\r\n) ON [PRIMARY]\r\nGO\r\n\r\n--Popula essa tabela\r\ninsert into Teste_TransactionLog select replicate ( 'b',8000)\r\nGO 100\r\n\r\nINSERT into Teste_TransactionLog\r\nSELECT * FROM dbo.Teste_TransactionLog\r\nGO 4<\/pre>\n<p>A tabela ficou bem pequena com apenas 1600 linhas e ocupando 12 MB:<\/p>\n<pre class=\"lang:tsql decode:true \">EXEC sp_spaceused Teste_TransactionLog\r\n\r\nname                  rows                 reserved           \r\nTeste_TransactionLog   1600                 12808 KB<\/pre>\n<p>Mantendo essa tabela com esse tamanho, abri uma transa\u00e7\u00e3o e deixei um loop sendo executado realizando um update. Esse update gera altera\u00e7\u00f5es que s\u00e3o gravadas no transaction log, que passa a crescer:<\/p>\n<pre class=\"lang:tsql decode:true \">SET NOCOUNT ON\r\n\r\n--deixa a transa\u00e7\u00e3o aberta\r\nBEGIN TRAN\r\n\r\n--coloca o update para rodar em loop\r\nwhile 1=1\r\nBEGIN \r\n\t update Teste_TransactionLog set Col = REPLICATE( SUBSTRING('abcdefghijlmnopqrstuvxz',(CAST((RAND()*5465465) AS INT)%20),1),8000)\r\nend\r\nGO<\/pre>\n<p>Como minha base tem <strong>5 DTU<\/strong>, ela n\u00e3o consegue processar muita coisa. Deixei o update rodando, fui resolver outras coisas e quando voltei, l\u00e1 estava a famosa mensagem de <span style=\"color: #ff0000;\"><strong>Transaction log is full<\/strong><\/span>:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-9189\" src=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/PostAzureLogFull.png\" alt=\"\" width=\"1012\" height=\"119\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/PostAzureLogFull.png 1174w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/PostAzureLogFull-300x35.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/PostAzureLogFull-1024x120.png 1024w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/PostAzureLogFull-768x90.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/PostAzureLogFull-700x82.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/PostAzureLogFull-410x48.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/PostAzureLogFull-100x12.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/PostAzureLogFull-275x32.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/PostAzureLogFull-20x2.png 20w\" sizes=\"auto, (max-width: 1012px) 100vw, 1012px\" \/><\/p>\n<p>Opa&#8230;<\/p>\n<h6>Ent\u00e3o quer dizer que o Transaction Log do Azure n\u00e3o \u00e9 Ilimitado?<\/h6>\n<p><span style=\"color: #ff0000;\"><strong>Resposta: N\u00e3o.<\/strong><\/span><\/p>\n<p>O Transaction Log da minha database que tem um tamanho de <strong>2 GB<\/strong> chegou a aproximadamente <strong>5 GB<\/strong> de tamanho:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-9191 aligncenter\" src=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/logfullpostazure02.jpg\" alt=\"\" width=\"500\" height=\"130\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/logfullpostazure02.jpg 696w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/logfullpostazure02-300x78.jpg 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/logfullpostazure02-410x107.jpg 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/logfullpostazure02-100x26.jpg 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/logfullpostazure02-275x72.jpg 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2018\/07\/logfullpostazure02-20x5.jpg 20w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/p>\n<p>Eu entrei em contato com o <strong><a href=\"https:\/\/azure.microsoft.com\/en-us\/blog\/author\/xiwu\/\" target=\"_blank\" rel=\"noopener\">Xiaochen Wu<\/a> (Senior Program Manager do time de Azure SQL Database)<\/strong>, mostrei esses testes e perguntei se existia alguma regra ou f\u00f3rmula que determinasse o <strong>tamanho m\u00e1ximo<\/strong> de um T-Log no Azure.<\/p>\n<p>A resposta dele foi a seguinte:<\/p>\n<p><em>&#8220;N\u00e3o existe nenhuma f\u00f3rmula fixa para determinar o tamanho do Transaction Log. Isso n\u00e3o est\u00e1 documentado porque n\u00f3s mudamos esses valores dinamicamente de forma frequente para alcan\u00e7ar o melhor caso para a maioria dos clientes. O tamanho do log \u00e9 determinado pelo volume computacional e n\u00e3o pelo tamanho da database. Podemos ter uma base bem pequena que gere muito log.<\/em><\/p>\n<p><em>N\u00f3s raramente vemos um cliente com problema de Log Full no Azure SQL. Na maioria dos casos o usu\u00e1rio fez um rebuild em uma tabela muito grande ou deixou uma transa\u00e7\u00e3o aberta. Para o REBUILD n\u00f3s liberamos o ONLINE INDEX REBUILD que n\u00e3o vai bloquear a Limpeza do Log. Para o caso da transa\u00e7\u00e3o aberta, ela vai morrer em algum momento, dar rollback e liberar o T-Log.&#8221;<\/em><\/p>\n<p>Perguntei se podia compartilhar isso com voc\u00eas e disse que sim. Fica aqui meu agradecimento ao <a href=\"https:\/\/azure.microsoft.com\/en-us\/blog\/author\/xiwu\/\" target=\"_blank\" rel=\"noopener\">Xiaochen Wu<\/a> pelo tempo em responder minhas d\u00favidas.<\/p>\n<p><strong>Resumindo, o transaction log n\u00e3o \u00e9 infinito e n\u00e3o tem uma f\u00f3rmula m\u00e1gica para sabermos at\u00e9 quanto o T-Log da nossa base pode alcan\u00e7ar.<\/strong><\/p>\n<p>Fica a dica de quando rodar um REBUILD dos \u00edndices no Azure, utilizar a op\u00e7\u00e3o ONLINE (post futuro) e nunca deixar transa\u00e7\u00f5es abertas na base e ir almo\u00e7ar. =)<\/p>\n<p>O Azure n\u00e3o tem um alerta no portal para monitorar o Transaction Log, mas podemos criar um para salvar essa informa\u00e7\u00e3o em uma tabela e depois via alguma aplica\u00e7\u00e3o ler essa tabela e enviar um e-mail. Entretanto, isso j\u00e1 \u00e9 assunto para outro post futuro.<\/p>\n<p>Espero que tenham aprendido algo novo.<\/p>\n<p>At\u00e9 a pr\u00f3xima.<\/p>\n<p>Posts relacionados sobre o Azure SQL Database:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.fabriciolima.net\/blog\/2018\/07\/10\/azure-sql-database-funcao-getdate-com-valor-errado-no-azure-e-isso-mesmo\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\">Azure SQL Database \u2013 Fun\u00e7\u00e3o getdate() com valor errado no Azure. \u00c9 isso mesmo?<\/a><\/li>\n<li><a href=\"http:\/\/www.fabriciolima.net\/blog\/2018\/03\/17\/azure-sql-db-managed-instance-introducao\/\" target=\"_blank\" rel=\"noopener\" data-wpel-link=\"internal\">Azure SQL DB Managed Instance \u2013 Introdu\u00e7\u00e3o<\/a><\/li>\n<li><a href=\"http:\/\/www.fabriciolima.net\/blog\/2018\/07\/12\/azure-sql-database-como-fazer-um-join-entre-tabelas-de-bases-diferentes\/\" target=\"_blank\" rel=\"noopener\">Azure SQL Database \u2013 Como fazer um join entre tabelas de bases diferentes?<\/a><\/li>\n<\/ul>\n<p><b>Gostou da dica?<\/b><\/p>\n<p>Curta, comente, compartilhe com os coleguinhas\u2026<\/p>\n<p>Assine meu canal no\u00a0<a class=\"external-link wpel-icon-left\" href=\"https:\/\/www.youtube.com\/channel\/UCeBRAO_LLrUdSrOXIywjzRA\" target=\"_blank\" rel=\"external noopener noreferrer nofollow\" data-wpel-link=\"external\">Youtube<\/a>\u00a0e curta minha\u00a0<a class=\"external-link wpel-icon-left\" href=\"https:\/\/www.facebook.com\/FabricioLimaSolucoesemBancodeDados\/\" target=\"_blank\" rel=\"external noopener noreferrer nofollow\" data-wpel-link=\"external\">P\u00e1gina no Facebook<\/a>\u00a0para receber Dicas de Leituras e Eventos sobre SQL Server.<\/p>\n<p>Abra\u00e7os,<\/p>\n<p>Fabr\u00edcio Lima<\/p>\n<p>Microsoft Data Platform MVP<\/p>\n<p>Consultor e Instrutor SQL Server<\/p>\n<p>Trabalha com SQL Server desde 2006<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fala Pessoal, Continuando os posts sobre Azure SQL Database, dessa vez vamos falar sobre um erro de Log Full que consegui gerar em uma base no Azure. O Transaction Log de uma base no azure funciona da mesma forma que em uma inst\u00e2ncia On-Premise. Como no azure n\u00e3o conseguimos utilizar uma base com o recovery [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[1616,1617,1512,280],"tags":[],"class_list":["post-9187","post","type-post","status-publish","format-standard","hentry","category-azure-sql-database","category-managed-instance","category-sql-azure","category-virtual-pass-br"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/9187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/comments?post=9187"}],"version-history":[{"count":10,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/9187\/revisions"}],"predecessor-version":[{"id":9220,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/9187\/revisions\/9220"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=9187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=9187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=9187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}