none
Restore de Filegroup RRS feed

  • Pergunta

  • Boa tarde galera,

    Nunca trabalhei com backups de filegroup em produção e agora estou implementando-o. Em alguns testes que fiz achei uma coisa muito estranha.

    Segue o script:

    use master
    GO
    create database dbTeste on primary ( name = 'dbTeste', filename = 'c:\dbTeste.mdf' ), filegroup [auditoria] ( name = 'auditoria', filename = 'c:\auditoria.ndf' ) log on ( name = 'dbTeste_log', filename = 'c:\dbTeste_log.ldf')
    GO
    use dbTeste
    GO
    create table a(id int) on [primary] create table b(id int) on [auditoria]
    GO

    backup database dbTeste to disk = 'c:\dbTeste.bak'
    GO
    backup database dbTeste filegroup = 'primary' to disk = 'c:\dbTeste1.bak'
    GO
    backup log dbTeste to disk = 'c:\dbTeste2.bak'
    GO

    drop table a
    drop table b
    create table tabBeforeLastBackup(id int)
    GO

    backup log dbTeste to disk = 'c:\dbTeste3.bak'
    GO

    use master
    GO

    restore database dbTeste filegroup = 'primary' from disk = 'c:\dbTeste1.bak' with replace , norecovery;
    GO
    restore log dbTeste from disk = 'c:\dbTeste2.bak' with replace, norecovery;
    GO
    restore log dbTeste from disk = 'c:\dbTeste3.bak' with replace, recovery;




    Quando executo o script acima, linha a linha, ele me retorna o seguinte erro:

    The roll forward start point is now at log sequence number (LSN) 25000000023300001. Additional roll forward past LSN 25000000023300012 is required to complete the restore sequence.
    This RESTORE statement successfully performed some actions, but the database could not be brought online because one or more RESTORE steps are needed. Previous messages indicate reasons why recovery cannot occur at this point.
    RESTORE LOG successfully processed 2 pages in 0.052 seconds (0.215 MB/sec).

    No entanto, caso eu execute o script todo de vez ele não dá nenhum erro e restaura normalmente.

    Qual será a diferença?

    obs.: este banco é apenas de testes e mais nenhum outro comando é executado sobre o mesmo.

    SQL Server 2008

    Abraços



    Demétrio Silva
    • Movido Gustavo Maia Aguiar quarta-feira, 1 de julho de 2009 19:40 (De:SQL Server - Desenvolvimento Geral)
    • Editado Demétrio Silva terça-feira, 21 de julho de 2009 20:37
    quarta-feira, 1 de julho de 2009 18:12

Todas as Respostas

  • Demétrio,

         Esse problema acontece porque você está usando a estratégia de backup de filegroup. Para este tipo de backup há necessidade do uso do TailLog.
         Você tem duas alternativas, para que o seu script funcione corretamente

    1 - Você deve substituir o restore database pelo seu backup full.
    restore database dbTeste from disk = 'c:\lixo\dbTeste.bak' with replace , norecovery;
    
    -- restore database dbTeste filegroup = 'primary' from disk = 'c:\lixo\dbTeste1.bak' with replace , norecovery;
    

     

     

    2 - faça a restauração do backup de filegroup da seguinte forma:


    MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008

    create database dbTeste on primary ( name = 'dbTeste', filename = 'c:\lixo\dbTeste.mdf' ),  filegroup [auditoria] ( name = 'auditoria', filename = 'c:\auditoria.ndf' ) log on ( name = 'dbTeste_log', filename = 'c:\lixo\dbTeste_log.ldf')
    GO 
    use dbTeste
    GO
    create table a(id int) on [primary] create table b(id int) on [auditoria]
    GO
    
    backup database dbTeste to disk = 'c:\lixo\dbTeste.bak' with format
    GO
    backup database dbTeste filegroup = 'primary' to disk = 'c:\lixo\dbTeste1.bak' with format
    GO
    backup log dbTeste to disk = 'c:\lixo\dbTeste2.bak' with format
    GO
    
    drop table a
    drop table b
    create table tabBeforeLastBackup(id int)
    GO
    
    backup log dbTeste to disk = 'c:\lixo\dbTeste3.bak' with format
    GO
    
    
    use master
    GO
    -- Criando o backup TailLog
    backup log dbteste to disk = 'c:\lixo\dbTeste_TailLog.bak' with format, norecovery go restore database dbTeste filegroup = 'primary' from disk = 'c:\lixo\dbTeste1.bak' with replace , norecovery; GO restore log dbTeste from disk = 'c:\lixo\dbTeste2.bak' with replace, norecovery; GO restore log dbTeste from disk = 'c:\lixo\dbTeste3.bak' with replace, norecovery; go
    -- Restaurando o backup TailLog restore log dbTeste from disk = 'c:\lixo\dbTeste_TailLog.bak' with replace, norecovery; go
    -- Recuperando (voltando a base para status Online) restore database dbteste with recovery;
    quarta-feira, 1 de julho de 2009 18:44
    Moderador
  • Olá Roberto,

    Fiquei com algumas dúvidas:

    1 - Qual a diferença entre especificar NO_TRUNCATE ou NORECOVERY ?

    2 - Para o último TLog eu preciso fazer o backup desta forma:
    backup
     log
     dbteste to
     disk
     = 'c:\lixo\dbTeste_TailLog.bak'
     with
     format, norecovery
    3 - Porque quando executo o script acima de uma vez ele funciona e quando executo linha a linha ele não funciona?

    4 - Pelo que li não existe forma de restaurar apenas o Filegroup se já houve modificação após o ultimo backup. Estou certo? Se sim, não entendo porque. Pois se tenho um backup de filegroup até determido momento não deveria ser necessário o restaurar backups de log caso eu quisesse restaurar até o momento do backup de filegroup.( pelo que li é obrigatório o restore dos logs. )

    Obrigado pela atenção.

    Abraços


    Demétrio Silva
    quarta-feira, 1 de julho de 2009 18:58
  • Vamos lá:

        1. Você deve usar o NORECOVERY caso a sua base esteja online, para deixar ela em um estado de Restoring e evitar que outros usuários modifiquem a base até que você termine a sua restauração. E deve usar o NO_TRUNCATE para tentar fazer o backup do TailLog quando a sua base estiver danificada. Veja as informações do BOL:

    NORECOVERY

    Backs up the tail of the log and leaves the database in the RESTORING state. NORECOVERY is useful when failing over to a secondary database or when saving the tail of the log before a RESTORE operation.

    To perform a best-effort log backup that skips log truncation and then take the database into the RESTORING state atomically, use the NO_TRUNCATE and NORECOVERY options together.

    NO_TRUNCATE

    Specifies that the log not be truncated and causes the Database Engine to attempt the backup regardless of the state of the database. Consequently, a backup taken with NO_TRUNCATE might have incomplete metadata. This option allows backing up the log in situations where the database is damaged.

    The NO_TRUNCATE option of BACKUP LOG is equivalent to specifying both COPY_ONLY and CONTINUE_AFTER_ERROR.

    Without the NO_TRUNCATE option, the database must be online.

    If the database is in the OFFLINE or EMERGENCY state, BACKUP is not allowed even with NO_TRUNCATE.

    2 - Não. Eu modifiquei o seu script porque eu estava fazendo testes na minha máquina, e se eu não usar o FORMAT ele fica reclamando que já tem um backup nessa localização... Por isso eu usei o FORMAT. O NORECOVERY é obrigatório se a sua base está online e você quer fazer uma restauração de Filegroup.

    3 - Eu tenho que pesquisar sobre isso, mas provavelmente é porque você faz um backup e rapidamente já faz o restore.

    4 - Há sim como restaurar um filegroup depois que os dados foram modificados. É uma das estratégias de recuperação de desastres recomendado pela Microsoft para grandes bases de dados. Imagine por exemplo uma base com 6 TB dividido em 6 filegroups. Você não consegue fazer backup full todo dia, não há tempo para isso. Aí, você faz um backup Full no domingo e durante a semana, faz backup apenas de cada um dos filegroups da sua base. No caso de haver algum desastre, você pode restaurar a sua base até o ponto de falha usando essa estratégia (Full + Filegroups + Transaction Logs). É um gerenciamento (mais ou menos) complexo, mas é possível sim.

    MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008
    quarta-feira, 1 de julho de 2009 19:49
    Moderador
  • Olá Roberto,

    Entendi, desculpe pela pergunta do item 1. Foi descuido nao ter visto isso no BOL.

    Quanto ao item 4. O que você citou eu já sabia. No entanto, o que perguntei foi se existe alguma forma de restaurar apenas o backup de filegroup sem os de TLOG. Pelo que li isso não é possível. Sabes se existe alguma forma. No BOL diz que tenho que restaurar os TLOG. obs.: falo sobre ter alterações após o backup de filegroup.

    Por exemplo, para o caso de bacluop full eu posso simplesmemte restaurar apenas o full, independente de ter alterações após o full ou não. Isso é possível com o de filegroup? Sei que são backups diferentes mas queria saber se é possível. Restaurar apenas o backup de filegroup.


    Abraços

    Demétrio Silva
    quinta-feira, 2 de julho de 2009 12:02