none
Restaurar base de dados no MSSQL 2005 Express Edition

    Question

  • Amigos,

     

         Aqui na empresa, temos um ERP que utiliza o Microsoft SQL Server 2005 Standard Edition como principal solução de base de dados, e com isto, é uma tarefa rotineira, ter que fazer consultas, updates e outras instruções, usando o T-SQL. Porém, recentemente surgiu a necessidade de se fazer um UPDATE para alterar alguns registros e com isto escrevi o script mas não o executei no servidor de produção, afim de evitar possíveis problemas.

     

         Porém, também não temos um servidor de teste onde eu possa testar a execução de tais instruções, com isto instalei o Microsoft SQL Server 2005 Express Edition em minha máquina, fiz um backup da base de dados que é relativamente pequena (inferior a 1 GB), que roda no servidor de produção (que é na versão Standard Edition), afim de testar os scripts localmente. Porém ao tentar restaurar a base de dados, surge a seguinte mensagem de erro:

     

    TITLE: Microsoft SQL Server Management Studio Express
    ------------------------------

    An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.Express.ConnectionInfo)

    ------------------------------
    ADDITIONAL INFORMATION:

    Não é possível abrir o dispositivo de backup 'C:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\Backup_Application.bak'. Erro do sistema operacional 5(Acesso negado.).
    RESTORE HEADERONLY está sendo encerrado de forma anormal. (Microsoft SQL Server, Error: 3201)

     

            Tentei restaurar a base usando a conta administrador e sa, porém não obtive exito. É possível restaurar uma base que roda na versão Standard na versão Express?

     

            Existe uma forma de diagrama (visualizar) o relacionamento físico das tabelas?

            Se puderem me dar uma força, desde já sou muito grato.

    Abraços!


     

    Tuesday, December 02, 2008 6:05 PM

Answers

  • Humm, mais uma coisa que aprendi Wink

    Olha o código que consegui para restaurar a database:

     

    RESTORE DATABASE [Appbase]

    FROM DISK = N'C:\backup\Backup.bak'

    WITH FILE = 1,

    MOVE N'Appbase_Data'

    TO N'C:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Appbase.mdf',

    MOVE N'Appbase_Log'

    TO N'C:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Appbase_log.ldf', NORECOVERY, NOUNLOAD, REPLACE, STATS = 10

     

    GO

    RESTORE DATABASE [Flexx]

    FROM DISK = N'C:\backup\Backup.bak'

    WITH FILE = 2, MOVE N'Appbase.mdf'

    TO N'C:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Appbase.mdf',

    MOVE N'Appbase_Log'

    TO N'C:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Appbase_log.ldf', NOUNLOAD, REPLACE, STATS = 10

    GO

    Friday, December 05, 2008 4:04 PM
  • Boa Tarde,

     

    Não há restrição entre restaurar uma base do SQL Server Standard no SQL Server Express desde que os 4GB não sejam alcançados já que o Express não aceita bancos maiores que 4GB. As mensagens de erro referem-se a outros problemas bem decorrentes de utilização de interface gráfica (que no backup pode mais confundir que ajudar).

     

    Sugiro realizar a restauração via linha de comando:

     

    - Logue-se no SQL Server Management Studio com um conta administrativa

    - Execute o comando RESTORE FILELISTONLY FROM DISK = 'SeuArquivoBak'

    - Anote os nomes das colunas Logical Name e Physical Name

    - Execute o comando abaixo:

     

    RESTORE DATABASE <SeuBanco> FROM DISK = 'SeuArquivoBak'

    WITH

    MOVE 'O nome do Arquivo Lógico de Dados' TO 'Nome Local do Arquivo Físico\<Arquivo Físico>.mdf',

    MOVE 'O nome do Arquivo Lógico de Log' TO 'Nome Local do Arquivo Físico\<Arquivo Físico>.ldf',

     

    O arquivo lógico de dados tem o Type igual a D e o arquivo lógico de Log tem o type igual a L no retorno do comando RESTORE FILELISTONLY

     

    [ ]s,

     

    Gustavo

    Tuesday, December 02, 2008 6:38 PM
    Moderator
  • Se o Banco pode ser substituído, pode ser declarado no comando de restore o replace, ficando assim:

     

     

    Code Snippet

    RESTORE DATABASE APLICATION FROM DISK = 'c:\backup\backup.bak'

    WITH

    MOVE 'Application_Data'

    TO 'd:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Ap.mdf ',

    MOVE 'Application_Log'

    TO 'D:\Arquivos de programas\Microsoft SQLServer\MSSQL.1MSSQL\Data\Ap.ldf',REPLACE

     

     

    Essa é uma alternativa também. Só pra lembrar!

    Wednesday, December 03, 2008 5:59 PM

All replies

  • Pessoal,

     

    Joguei o backup no diretório c:\backup e a mensagem que apareceu foi outra. Segue abaixo:

     

    TITLE: Microsoft SQL Server Management Studio Express
    ------------------------------

    Restore failed for Server 'MAQUINATI\DESENV'.  (Microsoft.SqlServer.Express.Smo)

    ------------------------------
    ADDITIONAL INFORMATION:

    System.Data.SqlClient.SqlError: O conjunto de backup mantém um backup de um banco de dados diferente do banco de dados 'flexxdesenv' existente. (Microsoft.SqlServer.Express.Smo)

     

    Acredito que deva ser porque o backup da versão Standard não pode ser executada na versão Express correto? Existe uma forma de diagramar o modelo físico (tabela) do banco de dados para eu enxergar os relacionamentos?

    Valeu!
    Abraços =)

     

    Tuesday, December 02, 2008 6:11 PM
  • Boa Tarde,

     

    Não há restrição entre restaurar uma base do SQL Server Standard no SQL Server Express desde que os 4GB não sejam alcançados já que o Express não aceita bancos maiores que 4GB. As mensagens de erro referem-se a outros problemas bem decorrentes de utilização de interface gráfica (que no backup pode mais confundir que ajudar).

     

    Sugiro realizar a restauração via linha de comando:

     

    - Logue-se no SQL Server Management Studio com um conta administrativa

    - Execute o comando RESTORE FILELISTONLY FROM DISK = 'SeuArquivoBak'

    - Anote os nomes das colunas Logical Name e Physical Name

    - Execute o comando abaixo:

     

    RESTORE DATABASE <SeuBanco> FROM DISK = 'SeuArquivoBak'

    WITH

    MOVE 'O nome do Arquivo Lógico de Dados' TO 'Nome Local do Arquivo Físico\<Arquivo Físico>.mdf',

    MOVE 'O nome do Arquivo Lógico de Log' TO 'Nome Local do Arquivo Físico\<Arquivo Físico>.ldf',

     

    O arquivo lógico de dados tem o Type igual a D e o arquivo lógico de Log tem o type igual a L no retorno do comando RESTORE FILELISTONLY

     

    [ ]s,

     

    Gustavo

    Tuesday, December 02, 2008 6:38 PM
    Moderator
  •  

    Gustavo,

    Obrigado pela sua resposta.

     

    Eu executei os passos mencionados por você, mas infelizmente não consegui.
    Loguei-me no Management Studio utilizando uma conta administrativa e executei o seguinte comando:

     

    RESTORE FILELISTONLY FROM DISK = 'c:\backup\backup.bak' (Que é o backup a ser restaurado, certo?)

     

    Com isto, obtive o seguinte resultado:

     

    LogicalName          PhysicalName                                                                                                    Type

    Application_Data       d:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Ap.mdf      D

    Application_Log        D:\Arquivos de programas\Microsoft SQLServer\MSSQL.1MSSQL\Data\Ap.ldf            L

     

    Com isto, montei a seguinte consulta:

     

    RESTORE DATABASE APLICATION FROM DISK = 'c:\backup\backup.bak'

    WITH

    MOVE 'Application_Data'

    TO 'd:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Ap.mdf ',

    MOVE 'Application_Log'

    TO 'D:\Arquivos de programas\Microsoft SQLServer\MSSQL.1MSSQL\Data\Ap.ldf'

     

    Só que ao executá-la, recebo o seguinte retorno:

     

    Msg 3154, Level 16, State 4, Line 1

    O conjunto de backup mantém um backup de um banco de dados diferente do banco de dados 'application' existente.

    Msg 3013, Level 16, State 1, Line 1

    RESTORE DATABASE está sendo encerrado de forma anormal.

     

    Esta é a segunda mensagem de erro; A primeira eu resolvi, pq ao executar o comando, ele mostrava que eu estava tentando executar uma query em um banco com uma sessão ativa, ai salvei o script, me reconectei novamente ao SQL sem abrir uma sessão para a base em questão e rodei o script.

     

    Me explique uma coisa por favor (fiquei com dúvida!)

    - Eu não possuo o caminho "d:\arquivos de programas\ ..." em minha máquina. Isto enfluencia em alguma coisa? O comando RESTORE FILELISTONLY FROM DISK = 'c:\backup\backup.bak'  exibe apenas informações do arquivo backup.bak ?

    Valeu pela ajuda Gustavo!
    Abraços =)

    Wednesday, December 03, 2008 12:26 PM
  • Continuou apresentando o mesmo erro, certo?
    Estou tentando entender o que é:

    O conjunto de backup mantém um backup de um banco de dados diferente do banco de dados 'application' existente.

     

    Valeeuuu =)
    Vou continuar tentar restaurar aqui =)

     

    Wednesday, December 03, 2008 12:34 PM
  • Boa Tarde,

     

    Me parece que o banco já existe e você está tentando restaurar por cima (seja por conta do nome do banco ou do nome dos dados). É isso mesmo, você quer restaurar um banco por cima ? Se for, exclua o banco primeiro e execute o comando de RESTORE ou coloque outro nome para o banco de dados e certifique-se de que os arquivos MDF e LDF não existem na pasta que você está utilizando.

     

    [ ]s,

     

    Gustavo

     

    Wednesday, December 03, 2008 4:11 PM
    Moderator
  • Se o Banco pode ser substituído, pode ser declarado no comando de restore o replace, ficando assim:

     

     

    Code Snippet

    RESTORE DATABASE APLICATION FROM DISK = 'c:\backup\backup.bak'

    WITH

    MOVE 'Application_Data'

    TO 'd:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Ap.mdf ',

    MOVE 'Application_Log'

    TO 'D:\Arquivos de programas\Microsoft SQLServer\MSSQL.1MSSQL\Data\Ap.ldf',REPLACE

     

     

    Essa é uma alternativa também. Só pra lembrar!

    Wednesday, December 03, 2008 5:59 PM
  • Gustavo e Emanuel,

     

    Obrigado pelas respostas de vocês!

    Sim, eu havia criado uma nova base de dados pelo Object Explorer. Veja o meu raciocínio:

     

    1º. Eu criei uma base chamada "Appbase"

    2º. Depois cliquei com o botão direito sobre a mesma, selecionando as opções task / restore.

    3º. Tentei restaurar a base de dados backup.bak

     

    Eu consigo restaurar um arquivo .bak sem precisar criar um novo database?

     

    Eu também consegui restaurar pela parte gráfica. Fazendo os 3 passos anteriores, só que na janela Restore Database - Appbase cliquei na página Options e mudei o caminho dos arquivos mdf e ldf, apontando para os arquivos dentro da pasta Data onde o Microsoft SQL Server 2005 está instalado.

     

    Qual é a função do REPLACE ?
    Não entendi muito bem!
    Sad

     

    Abraços e obrigado pela ajuda nota 10!
    Wink

     

     

     

    Thursday, December 04, 2008 5:10 PM
  • Olá Jöachim,

     

    Não é necessário (e nem indicado) que você crie uma base vazia para depois providenciar a restauração. Você pode e deve restaurar utilizando somente o arquivo .bak.

     

    A função REPLACE irá substiuir um banco existente pelo backup restaurado. Você utilizaria essa opção para a situação que você descreveu. Em todo caso, eu não recomendo utilizar esse opção em hipótese nenhuma visto que além de aumentar o risco de acidentes em potencial, tem alguns efeitos indesejados.

     

    [ ]s,

     

    Gustavo

     

    Thursday, December 04, 2008 5:52 PM
    Moderator
  • Jöachim, o replace é uma função que vc pode adicionar ao comando de restore(restore database ...with replace) com a finalidade de sobrepor o database que está sendo restaurado.

    Ela é bastante útil, digamos que vc tem uma rotina onde vc tem a certeza que poderá sobrepor um determinado database, Acredito  que o risco de vc usar o replace e sobrescrever o database errado é o mesmo de vc dropar o database errado com o drop database.

     

    Bom, minha intenção foi repassar o conhecimento sobre o "replace", pois, já que vc estáva usando a instrução "restore database..." bastava acrescentar o replace, cabe a vc escolher a melhor forma, na verdade não existe a melhor forma pra esse caso. Dá tudo no mesmo.

     

     

     

    Thursday, December 04, 2008 9:50 PM
  • Oi Emanuel,

     

    Eu também pensava assim sobre o REPLACE mas ele é um pouco mais arriscado. Quando você dropa o banco errado, o pior que acontece é perder o banco errado. Se você usar o REPLACE e errar o nome dos MDFs ou dos LDFs você pode perder o banco que usou no REPLACE e os bancos dos MDFs e LDFs por engano. Fiz essa descoberta da pior maneira.

     

    [ ]s,

     

    Gustavo

    Friday, December 05, 2008 11:20 AM
    Moderator
  • Humm, mais uma coisa que aprendi Wink

    Olha o código que consegui para restaurar a database:

     

    RESTORE DATABASE [Appbase]

    FROM DISK = N'C:\backup\Backup.bak'

    WITH FILE = 1,

    MOVE N'Appbase_Data'

    TO N'C:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Appbase.mdf',

    MOVE N'Appbase_Log'

    TO N'C:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Appbase_log.ldf', NORECOVERY, NOUNLOAD, REPLACE, STATS = 10

     

    GO

    RESTORE DATABASE [Flexx]

    FROM DISK = N'C:\backup\Backup.bak'

    WITH FILE = 2, MOVE N'Appbase.mdf'

    TO N'C:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Appbase.mdf',

    MOVE N'Appbase_Log'

    TO N'C:\Arquivos de programas\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Appbase_log.ldf', NOUNLOAD, REPLACE, STATS = 10

    GO

    Friday, December 05, 2008 4:04 PM
  • Olá Pessoal...

    Agradeço ao post, hj estava passando um problema identico e resolvi com este post.

    O endereço dos arquivos do backup eram totalmente diferentes do restore...

    C:\Arquivos de programa  (Restore)
    C:\Program file (Backup)

    abs a todos!
    Friday, November 20, 2009 9:46 AM
  • Boa tarde pessoal, também quero agradecer este EXCELENTE POST pois eu estava com o mesmo problema e graças a este resolvi.

    Um grande Abraço a todos!

    Wednesday, October 06, 2010 5:28 PM
  • olha nao tem data basse pra restaura crie uma data basse com o mesmo nome da q vai restaura DATABASE>NEWDATABASE>NOME:

    DEPOIS E SO RESTAURA 

    Saturday, October 12, 2013 7:38 AM