AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 215382
Accepted
Wouter
Wouter
Asked: 2018-08-21 04:42:03 +0800 CST2018-08-21 04:42:03 +0800 CST 2018-08-21 04:42:03 +0800 CST

Entendendo o CleanupTime nos scripts do SQL Server de Ola Hallengren em relação aos backups FULL e LOG

  • 772

Estou tendo problemas para entender exatamente o que esperar da CleanupTimeopção na solução de manutenção de servidor Ola Hallengren . Estou encontrando algumas perguntas relacionadas e respostas elaboradas, mas as explicações ainda me confundem um pouco.

Especificamente:

Estou fazendo um backup FULL semanal, um backup DIFF diário e um backup LOG de hora em hora. O backup COMPLETO está usando o padrão CleanupTimede 24h. O backup DIFF e LOG tem NULL como CleanupTime.

Na documentação do parâmetro CleanupTime , não consigo entender se definir a CleanupTimeconfiguração para um backup de BackupTypeFULL, também excluirá arquivos de backup DIFF e LOG mais antigos ou apenas arquivos de backup FULL.

Especifique o tempo, em horas, após o qual os arquivos de backup serão excluídos. Se nenhuma hora for especificada, nenhum arquivo de backup será excluído.

O último parágrafo me faz pensar que a configuração CleanupTimede backups de BackupTypeFULL também excluirá os logs de transações mais antigos. Ainda não está claro se este parágrafo se aplica apenas aos backups do BackupTypeLOG, ou também aos backups do BackupTypeFULL.

O DatabaseBackup tem uma verificação para verificar se os backups de log de transações mais recentes que o backup completo ou diferencial mais recente não são excluídos.

O que estou tentando alcançar é que posso fazer uma recuperação pontual em até 1 semana. (Temos um banco de dados que muda muito lentamente, então isso é viável) Da maneira que entendo agora, isso exigiria um backup completo de uma semana e um backup de log de transações de uma semana. Uma vez que os backups completos e diferenciais só podem ser usados ​​para restaurar para um ponto específico no tempo.

Então, devo apenas definir a CleanupTimeopção do meu trabalho de backup COMPLETO para 24*7? O que estou supondo agora é que configurá-lo para 24h fará com que o próximo backup FULL exclua todos os arquivos de backup Full, diff e log de transações mais antigos, deixando-me com uma janela de recuperação pontual de ... 0 horas. Certo?

sql-server backup
  • 3 3 respostas
  • 11395 Views

3 respostas

  • Voted
  1. Best Answer
    John K. N.
    2018-08-21T06:54:42+08:002018-08-21T06:54:42+08:00

    O @CleanupTimeé sempre especificado para uma tarefa de backup específica. Por exemplo, se você criar uma tarefa de backup completo , uma tarefa de backup diferencial e uma tarefa de backup de log de transações@CleanupTime , sempre estará relacionada à extensão da tarefa.

    Vamos dar uma olhada em um exemplo de backup completo .

    Backup completo

    Se você criar um trabalho de backup completo, normalmente adicionará um ou mais dos seguintes parâmetros:

    • @Databases: Quais bancos de dados são submetidos a backup (não é realmente relevante para este exemplo)
    • @Directory: O diretório para armazenar os backups
    • @BackupType: Completo, Diferencial, TLog
    • @CleanupTime: quantas horas de backups devem ser mantidas
    • @FileExtensionFull: A extensão do seu backup.

    Portanto, você tem um trabalho de backup que criará um backup completo de acordo com o agendamento definido para o trabalho em. Vamos supor o seguinte:

    • este trabalho é executado às 20:00 (20:00)
    • @FileExtensionFullfoi definido para'BAK'
    • @Directoryfoi definido para'F:\SQLBACKUP'
    • @CleanupTimefoi definido para 24(horas)

    Se olharmos para o MaintenanceSolution.sqlarquivo, você encontrará a descrição do parâmetro:

    SET @CleanupTime         = NULL         
    -- Time in hours, after which backup files are deleted. If no time is specified, then no backup files are deleted.
    

    Bem, isso não está ajudando muito. O mesmo que na documentação oficial no site. Vamos cavar mais. Se você examinar o script, eventualmente encontrará uma seção parecida com esta:

    O script foi empacotado para aumentar a legibilidade

    SE @BackupSoftware FOR NULO
        COMEÇAR
            SET @CurrentCommandType02 = 'xp_delete_file'
            SET @CurrentCommand02 =
                'DECLARE @ReturnCode int
                EXECUTE @ReturnCode = [master].dbo.xp_delete_file 0,
                    N''' + REPLACE(@CurrentDirectoryPath,'''','''''') + ''', -- primeiro parâmetro
                    ''' + @CurrentFileExtension + ''', --segundo parâmetro
                    ''' + CONVERT(nvarchar(19),@CurrentCleanupDate,126) + ''' -- terceiro parâmetro
            IF @ReturnCode 0 RAISERROR(''Erro ao excluir arquivos.'', 16, 1)'
        FIM
    

    Então Ola está basicamente usando o xp_delete_file functionSQL Server embutido para excluir um arquivo em um determinado momento de acordo com:

    • @CurrentDirectoryPath
    • @CurrentFileExtension
    • @CurrentCleanupDate

    Mas espere o que seria, por exemplo, o @CurrentCleanupDateser? Se voltarmos um pouco no script, você encontrará uma seção parecida com esta:

    INSERT INTO @CurrentCleanupDates (CleanupDate, Mirror)
        SELECT DATEADD(hh,-(@CleanupTime),GETDATE()), 0
    

    Ah, então @CurrentCleanupDateé uma adição de data que é calculada a partir da @CleanupTimee da hora atual GETDATE(). Legal.
    (... e podemos ter encontrado um erro de digitação no código, porque as seções para banco de dados normal e espelho contêm Mirroro código.)

    Para que serve então a seção relevante @CurrentFileExtension? Vamos pesquisar um pouco novamente. E encontramos:

    SELECT @CurrentFileExtension = CASE
        QUANDO @CurrentBackupType = 'FULL' THEN @FileExtensionFull
        QUANDO @CurrentBackupType = 'DIFF' ENTÃO @FileExtensionDiff
        QUANDO @CurrentBackupType = 'LOG' THEN @FileExtensionLog
        FIM
    

    Então você tem isso.

    Resumo

    Se os parâmetros da tarefa de backup completo@FileExtensionFull='BAK' estiverem definidos como e você tiver definido um @CleanupTime=24, o procedimento excluirá todos os arquivos de backup completo com pelo menos um dia (24 horas).

    O @CurrentCommand02que é executado é basicamente:

    xp_delete_file 0, 'F:\SQLBACKUP', 'BAK', '2018-08-20 20:00:00.045'
    

    Portanto, não toca em nenhum outro arquivo de backup. (A menos que você tenha definido 'BAK'como extensão de todos os tipos de backup, nesse caso você perde).

    • 25
  2. Scott Hodgin - Retired
    2018-08-21T07:10:07+08:002018-08-21T07:10:07+08:00

    Eu votei na resposta do @hot2use, pois aborda essa questão em detalhes, mas queria compartilhar uma maneira fácil de testar essas coisas.

    Pode ajudá-lo (como me ajudou) a entender completamente como o script funciona se você:

    1. Instale o script de backup (e outras dependências) em uma instância de teste - testei no meu computador local.
    2. Agora, altere o script e pesquise/substitua hhpor minute. As únicas referências que posso encontrar hhsão onde o script está lidando com o tempo de limpeza. Isso permite que você execute rapidamente backups de vários tipos (FULL, DIFF, LOG) veja os efeitos da execução, pois a retenção é em minutos e não em horas.

    Execute um backup FULL, DIFF e LOG de um banco de dados de teste e observe os arquivos criados nas pastas individuais. Isto é o que eu usei (observe o CleanupTimede 1 minuto devido a alterar o script de horas para minutos):

    exec [dbo].[DatabaseBackup]
    @Databases = 'test',
    @Directory = 'C:\OlaBackupTest',
    @BackupType = 'full',
    @Verify = 'N',
    @CleanupTime = 1,
    @CleanupMode = 'AFTER_BACKUP'
    
    exec [dbo].[DatabaseBackup]
    @Databases = 'test',
    @Directory = 'C:\OlaBackupTest',
    @BackupType = 'diff',
    @Verify = 'N',
    @CleanupTime = 1,
    @CleanupMode = 'AFTER_BACKUP'
    
    exec [dbo].[DatabaseBackup]
    @Databases = 'test',
    @Directory = 'C:\OlaBackupTest',
    @BackupType = 'log',
    @Verify = 'N',
    @CleanupTime = 1,
    @CleanupMode = 'AFTER_BACKUP'
    

    Meus testes revelaram as seguintes observações:

    CHEIO

    Cada execução de um FULLbackup criava um novo FULLbackup e excluía todos FULLos arquivos de backup com mais de 1 minuto. Nenhum DIFFou LOGarquivos de backup foram afetados.

    DIFF

    Cada execução de um DIFFbackup criava um novo DIFFbackup e excluía todos DIFFos arquivos de backup com mais de 1 minuto. Nenhum FULLou LOGarquivos de backup foram afetados.

    REGISTRO

    Cada execução de um LOGbackup criava um novo LOGbackup. Os backups contínuos LOG(sem intervenção FULLou DIFFbackups) simplesmente continuaram a se acumular na LOGpasta de backup, independentemente do tempo de limpeza. Se um backup foi feito, a PRÓXIMA execução do backup excluiu todos os backups anteriores ao último FULLou também anteriores a 1 minuto .DIFFLOGLOGFULLDIFF

    Nenhum arquivo FULLde DIFFbackup foi afetado durante a execução de LOGbackups.


    Eu recomendaria manter mais de 1 semana de FULLbackups no caso de você precisar voltar no tempo para restaurar. Assumindo 2 semanas de FULLbackups, você precisaria CleanupTimede 336 horas.

    Durante o teste do material de 1 minuto, você verá que:

    • A execução de FULLbackups nunca exclui DIFFou LOGbackups
    • A execução de DIFFbackups nunca exclui FULLou LOGbackups
    • A execução de LOGbackups nunca exclui FULLou DIFFbackups
    • 9
  3. Daniel
    2020-03-24T04:17:14+08:002020-03-24T04:17:14+08:00

    Expandindo as outras duas respostas, porque acabei de encontrar isso:

    Pode valer a pena notar (para quem pode google isso). para permitir um pouco mais do que o tempo exato em que você deseja manter seu backup.

    Se o op quiser manter o backup de 1 semana, as 24 horas por dia nem sempre manterão o arquivo de 1 semana. Motivo: Os bancos de dados estão crescendo. Seu novo backup pode demorar um pouco mais.

    Se o seu primeiro arquivo de backup foi criado 2020-03-15 03:00:05.000 E o próximo backup demora um pouco mais e o arquivo é criado 2020-03-22 30:00:0 6 .000 - isso é mais do que o especificado 168 horas (um segundo, lembre-se)

    Então, para estar seguro, faça 24x7+1!

    • 1

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve