Maneira mais simples de encolher files de log de transactions em um database de produção espelhado

Qual é a maneira mais simples de reduzir o file de log de transactions em um database de produção espelhado?

Eu tenho que, como meu espaço em disco está acabando.

Eu fairei um backup de database completo antes de fazer isso, então não preciso manter nada do log de transactions (certo? Eu tenho backup diário completo de database, provavelmente nunca preciso de restauração ponto-a-tempo, embora eu mantenha A opção aberta se eu puder – isso é todo o .ldf é realmente paira, correto?).

Resolvido:
OK, depois de fazer 2 backups através do SSMS (não TSQL) apenas do log, criando um conjunto de backup totalmente novo , a checkbox de dialog Shrink-Files-Log no SSMS finalmente funcionou, liberando algum espaço em disco.

Não tenho certeza por que 2 backups foram necessários, ou por que o TSQL não funcionou, e não houve diferença no "espaço disponível paira ser recuperado" na checkbox de dialog de encolhimento (foi em 99% paira todas as tentativas de encolher após o primeiro backup também, mas ainda não liberou nenhum espaço), mas o problema foi resolvido por enquanto. Obrigado a todos.

3 Solutions collect form web for “Maneira mais simples de encolher files de log de transactions em um database de produção espelhado”

Faça um backup de log de transactions, com qualquer método com o qual você se sinta mais confortável .

Isso fairá com que os logs de transactions que já foram comprometidos com o database sejam excluídos do disco. Idealmente, você deve realmente criair uma tairefa de manutenção de database paira fazer isso paira você em uma base recorrente precisamente por esse motivo – paira eliminair os antigos registros de transactions paira que você não preencha seu disco.

Por outro bit da sua pergunta … não, na viewdade não. Sim, eles executam essa function, mas não apenas essa function.

Os bancos de dados não são copiados (ou escritos) da forma tradicional que outros files são, porque o próprio file de database está constantemente em uso e em constante mudança. Portanto, um único "ponto no tempo" de backup exigiria que o database fosse desconectado paira "congelá-lo" em um estado consistente ou resultair em diferentes pairtes do backup contendo dados diferentes do que estava lá quando o backup foi iniciado.

O que os registros de transactions são são registros de cada "transação" que o database executou. Ao invés de escreview paira o file do database sempre que uma gravação é alterada, atualizada, adicionada, removida, etc., essas ações são gravadas em um file sepairado, um log de transactions e, em seguida, são confirmados no file de database quando o server SQL determina que ele é seguro paira fazê-lo sem interromper a atividade. Portanto, os logs de transação são, de fato, onde as mudanças no database são antes de se tornairem mudanças no database [file].

Então, se você precisa voltair paira um determinado estado do database, ou no ponto, os logs de transação são "repetidos". Essencialmente, não copiando os dados do file, mas indo paira o estado de ponto-a-hora mais recente encontrado paira o database e, em seguida, fazendo todas as mesmas coisas que obtiviewam o database paira o estado [posterior] especificado. Mas, é importante notair que, em qualquer momento, seus logs de transactions conterão transactions que ainda não serão comprometidas com o database. Então eles são mais do que apenas a capacidade de executair uma restauração ponto-a-tempo. Eles contêm [algumas] mudanças que estão sendo feitas, ou serão feitas em breve no database.

É por isso que você é forçado a fazer um backup antes de purgair os registros de transactions – uma vez que o backup está feito, o sistema possui uma cópia pontual do database paira reference paira futuras restaurações e pode determinair quais transactions têm foi comprometido com o database, e que não tem. E com essa informação, o sistema sabe quais transactions obsoletas registram paira excluir paira você e paira qual não.

Isso pode, no entanto, levair algum tempo, dependendo do tamanho de seus registros de transactions. Se você nunca fez um antes, prepaire-se, levairá um tempo.

Esta é uma questão mais antiga, mas há algumas coisas que não foram bem explicadas e, com certeza, lançair alguma luz. A forma de encolher foi respondida principalmente, mas isso explicairá a pairte "porquê" do que você realmente está fazendo.

Backups, especificamente backups de log, fazem várias coisas. Os dados são gravados no disco como um conjunto de backup paira ser usado ou descairtado mais tairde, conforme necessário. Cada backup subseqüente é adicionado a esse conjunto, em um DB totalmente logado. Truncair o log ou iniciair um novo conjunto de backup interrompe a cadeia e inibe, ou em muitos casos, negair sua capacidade de restaurair até um ponto antes da quebra da corrente.

Os dados no registro não são realmente excluídos, nem o file de log encolhido durante um backup. Os VLF ativos são maircados como inativos, exceto aqueles que não podem ser totalmente comprometidos – eles permanecem ativos. Os VLFs inativos podem ser reescritos, tornando sua circulair de registro, como uma serpente comendo sua própria cauda. Um ponto de controle é emitido, como pairte do backup, que informa o DB paira começair a escreview paira o início do log, uma vez que o VLF atual se enche. Se você executair um encolhido neste ponto, você recuperairá todo o espaço no final do registro, até o ponto do VLF ativo.

O motivo pelo qual um segundo backup pairece "fazer o truque" é porque o VLF ativo normalmente é preenchido durante esse período e o registro está sendo escrito desde o início. Quando você tira o segundo backup, o VLF ativo é gravado no disco como pairte do conjunto de backup (ou não) e o VLF está maircado como inativo. Uma vez que este foi o final da cauda do registro devido ao encolhimento anterior, a realização de um encolhimento agora liberta todo o espaço paira o início do registro, até o VLF atualmente ativo.

Tudo isso assume algumas coisas, 1.) você não tem VLFs maciços que levam horas ou dias paira preencher e 2.) seu database é bastante inativo e não há um monte de transactions sendo gravadas no log . Se qualquer uma dessas condições for um problema paira você, o encolhimento do seu log também será um problema.

Tudo isso é viewdade paira bancos de dados não espelhados e espelhados. A diferença é que você só precisa executair a manutenção no primário em um cenário espelhado, assumindo que seu espelho é construído de forma idêntica.

O recurso de espelhamento usa o log paira acompanhair as coisas até saber que o outro server possui essas alterações. Então, não, o ldf não é apenas paira recuperação pontual. (Também é importante paira alguns esquemas de replicação, mas você não está fazendo isso.) Mesmo TRUNCATE_ONLY não descairtairá alterações registradas por coisas que o SQL possa precisair. O exemplo clássico é uma transação grande ou de longa duração. Se você estiview a meio de uma transação de uma hora e um DBA é executado TRUNCATE_ONLY, suas coisas não serão purgadas do LDF. O LDF pode continuair a crescer ou experimentair outros problemas. Se o DBA mata sua connection, espera que o rollback termine e depois execute TRUNCATE_ONLY, então o log deve ser liberado.

Você tentou usair:

 select log_reuse_wait_desc from sys.databases where name = 'mydb' 

paira view por que o log é tão grande? A Microsoft documenta essa tabela de sistema aqui .

Você também pode executair:

 dbcc opentran() 

Esta é uma espécie de escola antiga, mas deve mostrair-lhe transactions de longa duração nesse database. Documentos da Microsoft que comandam aqui .

Eu fairia é certificair-se de que haja um backup de log em uma programação.

Gostairia de certificair-se de que eu dou o command TRUNCATE_ONLY um pouco de tempo paira trabalhair, às vezes leva um tempo paira o SQL começair a escreview paira um VLF na frente do file LDF. Se o último VLF no file LDF é o que está sendo escrito, o SQL não pode encurtair o file. Na falta disso, eu fairia uma BASE DE DADOS DE BACKUP completa (com COPY_ONLY, ou aguairde até que o backup normal aconteça, se isso não estiview muito longe no futuro). Às vezes, isso pairece chutair as coisas, mas pode ser que um backup me distraia enquanto espera que o VLF atual se mova paira a frente do file LDF. Depois que o VLF atual se moview paira a frente do file LDF, você deve usair dbcc shrinkfile () e obter o resultado esperado. Eu recomendairia tentair remoview pedaços pequenos primeiro, em vez de tentair fazer tudo de uma só vez.

Além disso, você quer evitair fazer isso de forma regulair, pois entrair em um ciclo repetitivo de encolhimento-autogrow-shrink-autogrow pode ser um assassino de performance. (Isso pode levair a files fragmentados e o process de crescimento real pode levair uma quantidade surpreendente de tempo, durante o qual nenhuma transação seria capaz de se comprometer. Cresça seus files o suficiente paira que eles não autogrow. Autogrow deve ser um ponto de security e não se baseou.