locked
Restaurar Logs de transações RRS feed

  • Pergunta


  • Olá à todos da lista!

    Gostaria de saber qual o procedimento necessário para que eu possa restaurar vários arquivos de backup de log de transações (.trn).

    Atualmente, é gerado um backup full às 01:00 hs da manhã e depois  backup de log de 30 em 30 minutos.

    Faço a restauração do backup full normalmente só que depois não consigo restaurar os arquivos de logs.


    Obrigado,



    Jeferson Bezerra.


     
    segunda-feira, 15 de dezembro de 2008 15:10

Respostas

  • Olá A seguência de restore de databases é a seguinte:

    Restore o backup full, depois, o último backup diferencial, e na sequência, todos os backups de log após o backup diferencial.

     

    Caso vc não tenha, um backup diferencial, então, o procedimento é restaurar o full e depois todos os de log. Do primeiro backup de log ao ponto que vc quer restaurar.

     

     

    Mas qual é o erro?

    O database está setado como recover model igual a full?

     

    segunda-feira, 15 de dezembro de 2008 16:01
  • Olá Jeferson, fiz um script de exemplo pra vc, para restaurar basta informar o local do último backup full que a rotina restaura tudinho na sequencia correta. Se existirem backups diferenciais e e log, os mesmos serão restaurados na seguencia.

     

    segue exemplo:

     

    Code Snippet

    use msdb
    go
    create proc pr_restore @database varchar(100),@fullbackup varchar(250)
    as
    declare @cmd varchar(1000),@bkp varchar(250),@tipo char(1)

    declare bkp cursor for

    select physical_device_name,type from msdb..backupset b
    join msdb..backupmediafamily f on b.media_set_id=f.media_set_id
    where database_name=''+@database+'' and backup_set_id>= (select max(backup_set_id)
    from msdb..backupset b
    join msdb..backupmediafamily f on b.media_set_id=f.media_set_id
    where type='D' and physical_device_name=''+@fullbackup+'')
    union all

    select physical_device_name,type from msdb..backupset b
    join msdb..backupmediafamily f on b.media_set_id=f.media_set_id
    where database_name=''+@database+''  and type='I' and backup_set_id>= (select max(backup_set_id)
    from msdb..backupset b
    join msdb..backupmediafamily f on b.media_set_id=f.media_set_id
    where database_name=''+@database+'' and type='I' and physical_device_name=''+@fullbackup+'')


    UNION ALL
    select distinct physical_device_name,type from msdb..backupset b
    join msdb..backupmediafamily f on b.media_set_id=f.media_set_id
    where database_name=''+@database+''  and type='L' and backup_set_id>= (select max(backup_set_id)
    from msdb..backupset b
    join msdb..backupmediafamily f on b.media_set_id=f.media_set_id
    where type='I' AND database_name=''+@database+'' and physical_device_name=''+@fullbackup+'')
    union all
    select '','F'

    open bkp
    fetch next from bkp into @bkp,@tipo
    while @@FETCH_STATUS = 0
    begin

     if @tipo ='D'
      begin
      set @cmd='restore database ' +@database + ' from disk = '''+@bkp +''' with replace, norecovery'
      exec (@cmd)
      print 'O backup '+ @bkp+ ' foi restaurado'
      end
     
     if @tipo ='I'
      begin
      set @cmd='restore database ' +@database + ' from disk = '''+@bkp +''' with replace, norecovery'
      exec (@cmd)
      print 'O backup '+ @bkp+ ' foi restaurado'
      end
      
     if @tipo ='L'
      begin
      set @cmd='restore LOG ' +@database + ' from disk = '''+@bkp +''' with replace, norecovery'
      exec (@cmd)
      print 'O backup '+ @bkp+ ' foi restaurado'
      end  
     if @tipo ='F'
      begin
      set @cmd='restore LOG ' +@database + ' with recovery'
      exec (@cmd)
      end
      
    fetch next from bkp into @bkp,@tipo
    end
    close bkp
    deallocate bkp

    go

     

     

    Exemplo de execução do restore.

    Code Snippet


    exec pr_restore @database='teste',@fullbackup = 'c:\backup-full_02.bkp'

     

     

    segunda-feira, 15 de dezembro de 2008 20:07
  • Boa Tarde,

     

    Você pode restaurar pelo SQL Server Management Studio ou por qualquer outra ferramenta que seja capaz de emitir comandos contra o SQL Server (ex: Query Analyser, SQLCMD, OSQL, etc).

     

    Para que você possa aplicar os logs após o backup full é fundamental que no Management Studio você escolha ou a opção "Leave the database non-operational, and do not rollback uncommited transacions" ou "Leave the database in read-only mode." que são respectivamente igual a NORECOVERY e STANDBY.

     

    Se preferir via linha de comando segue um script:

     

    Code Snippet

    -- Restaura o backup full

    RESTORE DATABASE Banco FROM DISK = 'C:\BACKUPS\BANCO.BAK'

    WITH NORECOVERY,

    MOVE 'Banco_Data' TO 'C:\NovoLocal\Banco.MDF',

    MOVE 'Banco_Log' TO 'C:\NovoLocal\Banco.LDF'

     

    -- Aplica os logs

    RESTORE LOG Banco FROM DISK = 'C:\BACKUPS\BANCOLOG1.TRN' WITH NORECOVERY

    RESTORE LOG Banco FROM DISK = 'C:\BACKUPS\BANCOLOG2.TRN' WITH NORECOVERY

    RESTORE LOG Banco FROM DISK = 'C:\BACKUPS\BANCOLOG3.TRN' WITH NORECOVERY

    RESTORE LOG Banco FROM DISK = 'C:\BACKUPS\BANCOLOG4.TRN' WITH NORECOVERY

     

    -- Aplica o último log e deixa o banco operacional

    RESTORE LOG Banco FROM DISK = 'C:\BACKUPS\BANCOLOG5.TRN' WITH RECOVERY

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 15 de dezembro de 2008 20:31
  • Olá Amigo, tanto o logshipping quando o database mirror utilizam a mesma forma de prover a redundância, através de log de transação.

    Ambos também replicam para o servidor Standby que vc configurou. A única diferença entre os dois é que no database mirror vc tem um recurso alta disponibilidade em tempo real, ou seja, no momento que o principal estiver indisponível, automaticamente as conexões são redirecionadas para o servidor que que estava em standby.

    Mas esse recurso, não éo padrão do database mirror, tem que configurar.

     

    Enquando, no log shipping vc tem que levantar o database replicado como"online", no database mirror isso pode ser configurado como automático,mas para isso vc terá que ter outro servidor ou outra instância SQL como "Witness".

     

    Para maiores informações dá uma olhada no books online, tem tudo lá.

     

      

    terça-feira, 16 de dezembro de 2008 18:50
  • Olá Jeferson, dá uma olhada no meu blog que eu escreví sobre Log Shipping.

    Existem 2 scripts de backups e restores inteligentes, esses scripts podem ser utilizados tanto para políticas de backups customizadas como para usar num processo de Log Shipping.

     

    http://emanuelmcdba.spaces.live.com/blog/cns!E634CAFF4AFF243D!723.entry

     

    Dá uma olhada quando vc puder.

     

    Abr, Emanuel Peixoto.

     

    quarta-feira, 17 de dezembro de 2008 07:45
  • Bom, acredito que se vc realizou algum restore de log e constatou que os dados alterados não estavam, vc pode checar o seguinte:

     

    * Certfique-se que os dados haviam sido comitados e realmente estavam no log.

    Pra garantir vc pode realizar um checkpoint manualmente(CHECKPOINT), só pra vc ter certeza se os dados realmente estão no log, realize os backups de log novamente e tente restaurar.

     

    * Certifique-se de colocar o database online, usando o comando:

    RESTORE DATABASE [NOME_DATABASE] WITH RECOVERY

     

    O aviso a cada reatore(full,diff ou log) é justamente para informar que a qualquer momento que vc desejar tirar o database do status "Recovering" vc poderá, bastanto executar o comando sugerido.

     

    segunda-feira, 5 de janeiro de 2009 22:23

Todas as Respostas

  • Olá A seguência de restore de databases é a seguinte:

    Restore o backup full, depois, o último backup diferencial, e na sequência, todos os backups de log após o backup diferencial.

     

    Caso vc não tenha, um backup diferencial, então, o procedimento é restaurar o full e depois todos os de log. Do primeiro backup de log ao ponto que vc quer restaurar.

     

     

    Mas qual é o erro?

    O database está setado como recover model igual a full?

     

    segunda-feira, 15 de dezembro de 2008 16:01
  • Emanuel,

     

    Concordo com você, mas seria legal que o nosso colega informa-se o erro.

    segunda-feira, 15 de dezembro de 2008 16:32
  • Oi Junior, é sim, com a descrição do erro podemos ajudá-lo melhor.

    segunda-feira, 15 de dezembro de 2008 16:34
  • Olá Emanuel,

    Obrigado pelas explicações!

    Consegui agora restaurar um backup full de uma base de testes, e estou gerando backup de log de transações de 5 em 5 minutos, como teste.

    Para restaurar os arquivos de logs (trn) gerados, terei que restaurar um por um pelo Management Studio, ou existe um procedimento, script, job que eu possa criar para restaurar todos os arquivos automaticamente?


    Obrigado!


    Jeferson Bezerra.
    segunda-feira, 15 de dezembro de 2008 17:04
  • Ei, seja Bem-Vindo ao nosso forum, agora que eu reparei que vc é novo por aqui.

    Amigo, posso criar um script de exemplo pra vc, espera um pouquinho, já posto.

     

    segunda-feira, 15 de dezembro de 2008 17:10
  • Olá Jeferson, fiz um script de exemplo pra vc, para restaurar basta informar o local do último backup full que a rotina restaura tudinho na sequencia correta. Se existirem backups diferenciais e e log, os mesmos serão restaurados na seguencia.

     

    segue exemplo:

     

    Code Snippet

    use msdb
    go
    create proc pr_restore @database varchar(100),@fullbackup varchar(250)
    as
    declare @cmd varchar(1000),@bkp varchar(250),@tipo char(1)

    declare bkp cursor for

    select physical_device_name,type from msdb..backupset b
    join msdb..backupmediafamily f on b.media_set_id=f.media_set_id
    where database_name=''+@database+'' and backup_set_id>= (select max(backup_set_id)
    from msdb..backupset b
    join msdb..backupmediafamily f on b.media_set_id=f.media_set_id
    where type='D' and physical_device_name=''+@fullbackup+'')
    union all

    select physical_device_name,type from msdb..backupset b
    join msdb..backupmediafamily f on b.media_set_id=f.media_set_id
    where database_name=''+@database+''  and type='I' and backup_set_id>= (select max(backup_set_id)
    from msdb..backupset b
    join msdb..backupmediafamily f on b.media_set_id=f.media_set_id
    where database_name=''+@database+'' and type='I' and physical_device_name=''+@fullbackup+'')


    UNION ALL
    select distinct physical_device_name,type from msdb..backupset b
    join msdb..backupmediafamily f on b.media_set_id=f.media_set_id
    where database_name=''+@database+''  and type='L' and backup_set_id>= (select max(backup_set_id)
    from msdb..backupset b
    join msdb..backupmediafamily f on b.media_set_id=f.media_set_id
    where type='I' AND database_name=''+@database+'' and physical_device_name=''+@fullbackup+'')
    union all
    select '','F'

    open bkp
    fetch next from bkp into @bkp,@tipo
    while @@FETCH_STATUS = 0
    begin

     if @tipo ='D'
      begin
      set @cmd='restore database ' +@database + ' from disk = '''+@bkp +''' with replace, norecovery'
      exec (@cmd)
      print 'O backup '+ @bkp+ ' foi restaurado'
      end
     
     if @tipo ='I'
      begin
      set @cmd='restore database ' +@database + ' from disk = '''+@bkp +''' with replace, norecovery'
      exec (@cmd)
      print 'O backup '+ @bkp+ ' foi restaurado'
      end
      
     if @tipo ='L'
      begin
      set @cmd='restore LOG ' +@database + ' from disk = '''+@bkp +''' with replace, norecovery'
      exec (@cmd)
      print 'O backup '+ @bkp+ ' foi restaurado'
      end  
     if @tipo ='F'
      begin
      set @cmd='restore LOG ' +@database + ' with recovery'
      exec (@cmd)
      end
      
    fetch next from bkp into @bkp,@tipo
    end
    close bkp
    deallocate bkp

    go

     

     

    Exemplo de execução do restore.

    Code Snippet


    exec pr_restore @database='teste',@fullbackup = 'c:\backup-full_02.bkp'

     

     

    segunda-feira, 15 de dezembro de 2008 20:07
  • Boa Tarde,

     

    Você pode restaurar pelo SQL Server Management Studio ou por qualquer outra ferramenta que seja capaz de emitir comandos contra o SQL Server (ex: Query Analyser, SQLCMD, OSQL, etc).

     

    Para que você possa aplicar os logs após o backup full é fundamental que no Management Studio você escolha ou a opção "Leave the database non-operational, and do not rollback uncommited transacions" ou "Leave the database in read-only mode." que são respectivamente igual a NORECOVERY e STANDBY.

     

    Se preferir via linha de comando segue um script:

     

    Code Snippet

    -- Restaura o backup full

    RESTORE DATABASE Banco FROM DISK = 'C:\BACKUPS\BANCO.BAK'

    WITH NORECOVERY,

    MOVE 'Banco_Data' TO 'C:\NovoLocal\Banco.MDF',

    MOVE 'Banco_Log' TO 'C:\NovoLocal\Banco.LDF'

     

    -- Aplica os logs

    RESTORE LOG Banco FROM DISK = 'C:\BACKUPS\BANCOLOG1.TRN' WITH NORECOVERY

    RESTORE LOG Banco FROM DISK = 'C:\BACKUPS\BANCOLOG2.TRN' WITH NORECOVERY

    RESTORE LOG Banco FROM DISK = 'C:\BACKUPS\BANCOLOG3.TRN' WITH NORECOVERY

    RESTORE LOG Banco FROM DISK = 'C:\BACKUPS\BANCOLOG4.TRN' WITH NORECOVERY

     

    -- Aplica o último log e deixa o banco operacional

    RESTORE LOG Banco FROM DISK = 'C:\BACKUPS\BANCOLOG5.TRN' WITH RECOVERY

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 15 de dezembro de 2008 20:31
  • Emauel,

    Muito obrigado pela criação do script.

    Testei numa base de teste e funcionou normalmente!

    Esqueci de informar que o restore dos logs que preciso fazer será numa outra base de dados localizada num outro servidor de backup .


    Aproveitando, vi que o MSSQL 2005 oferece recursos de log shipping e database mirror para contingência.

    Qual recurso seria mais indicado para contingência utilizando um servidor que ficará em standby dedicado à essa contingência?

    Obrigado mais uma vez...



    Jeferson Bezerra.
    terça-feira, 16 de dezembro de 2008 18:31
  • Olá Amigo, tanto o logshipping quando o database mirror utilizam a mesma forma de prover a redundância, através de log de transação.

    Ambos também replicam para o servidor Standby que vc configurou. A única diferença entre os dois é que no database mirror vc tem um recurso alta disponibilidade em tempo real, ou seja, no momento que o principal estiver indisponível, automaticamente as conexões são redirecionadas para o servidor que que estava em standby.

    Mas esse recurso, não éo padrão do database mirror, tem que configurar.

     

    Enquando, no log shipping vc tem que levantar o database replicado como"online", no database mirror isso pode ser configurado como automático,mas para isso vc terá que ter outro servidor ou outra instância SQL como "Witness".

     

    Para maiores informações dá uma olhada no books online, tem tudo lá.

     

      

    terça-feira, 16 de dezembro de 2008 18:50
  • Jeferson, irei construir uma rotina de backup e restore de log e postar no meu blog, aguarda um pouquinho.

    terça-feira, 16 de dezembro de 2008 19:49
  • Olá Jeferson, dá uma olhada no meu blog que eu escreví sobre Log Shipping.

    Existem 2 scripts de backups e restores inteligentes, esses scripts podem ser utilizados tanto para políticas de backups customizadas como para usar num processo de Log Shipping.

     

    http://emanuelmcdba.spaces.live.com/blog/cns!E634CAFF4AFF243D!723.entry

     

    Dá uma olhada quando vc puder.

     

    Abr, Emanuel Peixoto.

     

    quarta-feira, 17 de dezembro de 2008 07:45
  • Olá Jeferson, vc conseguiu?

    Se sim, gostaria de lhe pedir para encerrar o tópico classificando a resposta que lhe ajudou.

     

    Tinha deixado um link de uma rotina que criei no meu blog, vc conseguiu realizar os procedimentos?

     

    Aguardo o seu retorno,

    Obrigado.

     

    Grande abraço, Emanuel Peixoto

    quinta-feira, 18 de dezembro de 2008 18:19
  •  

    Olá Emanuel, obrigado pelo tutorial criado sobre log shipping!

     

    Consegui realizar o backup full e de log utilizando os scripts que você disponibilizou.

    Na restauração, consegui restaurar somente o backup full (tipo1) pois, na tentativa de restauração dos backups de log (tipo 3), verifiquei que não atualiza a base de destino e aparece somente a seguinte mensagem no MSSMS :

     

    "CASO QUEIRA TORNAR O DATABASE ONLINE APARTIR DESTE PONTO, FAVOR EXECUTAR O SEGUINTE COMANDO:

    RESTORE DATABASE dbteste WITH RECOVERY:

     

    Aparentemente, pensei que havia executado com sucesso o comanto mas, analisando a base de destino, identifiquei que os logs não foram carregados, pois não havia atualização dos dados.

     

     

     

    Obrigado,

     

     

    Jeferson Bezerra.

     

    segunda-feira, 5 de janeiro de 2009 19:09
  • Bom, acredito que se vc realizou algum restore de log e constatou que os dados alterados não estavam, vc pode checar o seguinte:

     

    * Certfique-se que os dados haviam sido comitados e realmente estavam no log.

    Pra garantir vc pode realizar um checkpoint manualmente(CHECKPOINT), só pra vc ter certeza se os dados realmente estão no log, realize os backups de log novamente e tente restaurar.

     

    * Certifique-se de colocar o database online, usando o comando:

    RESTORE DATABASE [NOME_DATABASE] WITH RECOVERY

     

    O aviso a cada reatore(full,diff ou log) é justamente para informar que a qualquer momento que vc desejar tirar o database do status "Recovering" vc poderá, bastanto executar o comando sugerido.

     

    segunda-feira, 5 de janeiro de 2009 22:23