locked
Tem como restaurar um BKP do sql 2008 no sql 2000? RRS feed

  • Pergunta

  • Bom dia galera!
    Estou precisando de uma ajuda qui, Tenho um SQl 2000 instalado em um servidor e fiz um BKP de uma base com nome (X), Restaurei esse BKP em um SQL que tenho em outro servidor com SQL 2008 e atualizei alguns dados nessa base de dados, mas agora eu peciso restaurar a base do SQL 200 encima do BKP feito no SQL 2008 e isso não está sendo possível.
    Ele está me exibindo uma mensagem de incompatibilidade.
    Alguem te uma solução pra esse prblema ai?
    Obrigado pela atenção.
    quarta-feira, 18 de novembro de 2009 14:00

Respostas

  • Rogério, 

    Olha, esse é um processo meio complicado de fazer... mas tive DUAS idéias, uma pode dar certo.
    Primeiro:

    Abra o Management Studio no 2008, clique com o botão direito sobre a database, selecione Tasks > Generate Scripts...
    Na tela que abrir:
    - Next na primeira tela
    - Certifique-se de ter selecionado a database na próxima e clique Next
    - Na tela Choose Script Options, altere:
    - "Script for Server Version" para "SQL Server 2000"
    - "Script USE DATABASE" para FALSE
    - "Script Data" para TRUE, e clique Next. 
    - Selecione "Tables" e Next
    - Select All, Next
    - Script to File, indique onde gravar o arquivo, e depois Next e Finish

    * Pode demorar um pouco pra gerar esse arquivo, depende do tamanho da sua database
    Leve este arquivo para o servidor 2000, abra o prompt (DOS) e execute:
    OSQL -E -i "arquivo gerado no 2008.sql" -d "nome da nova database"

    Ele vai rodar o script gerado no 2008.


    Minha outra idéia é um pouco mais complexa, mas pode funcionar, conforme segue:
    - Gerar um script dos objetos da database (somente objetos)
    - Criar uma nova database no SQL Server 2000
    - Criar os objetos com o script gerado
    - Criar um linked server no 2000 apontando para o 2008 (pode fazer pelo Enterprise Manager/Security/Linked Servers, ou por script: http://msdn.microsoft.com/en-us/library/aa259589(SQL.80).aspx e http://msdn.microsoft.com/en-us/library/aa259581(SQL.80).aspx)
    - Conectar nesta database nova e executar o script abaixo, que irá gerar um script de INSERT/SELECT, desativando o identity nas tabelas que tem ele:

    DECLARE @LS VARCHAR (100), -- SERVIDOR REMOTO
    		@DB VARCHAR (100), -- DATABASE REMOTA
    		@CLIST VARCHAR (4000), -- LISTA DE COLUNAS
    		@MIN INT, -- CONTADOR AUXILIAR
    		@MAX INT, -- CONTADOR AUXILIAR
    		@TBL VARCHAR (100) -- TABELA
    
    SET @LS = 'NOME DO LINKED SERVER' -- EX: SERVERREMOTO
    SET @DB = 'NOME DA DATABASE REMOTA' -- EX:DBREMOTA
    
    SET @LS = 'LS' -- EX: SERVERREMOTO
    SET @DB = 'DB' -- EX:DBREMOTA
    
    CREATE TABLE #TBLIST(ID INT IDENTITY (1,1), TBL VARCHAR (100))
    
    INSERT INTO #TBLIST (TBL)
    SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U'
    
    SELECT @MIN = MIN(ID), @MAX = MAX (ID) FROM #TBLIST
    
    WHILE @MIN <= @MAX
    BEGIN
    	SELECT @TBL = '[' + TBL + ']' FROM #TBLIST WHERE ID = @MIN
    	IF IDENT_SEED(@TBL) IS NOT NULL
    	BEGIN
    		PRINT 'SET IDENTITY_INSERT ' + @TBL + ' ON'
    		PRINT 'GO'
    	END
    	SET @CLIST = ''
    	SELECT @CLIST = @CLIST + '[' + NAME + '],' FROM SYSCOLUMNS WHERE ID = OBJECT_ID (@TBL)
    	SET @CLIST = LEFT (@CLIST, LEN (@CLIST)-1)
    	PRINT 'INSERT INTO ' + @TBL + '(' + @CLIST + ')'
    	PRINT 'SELECT ' + @CLIST + ' FROM ' + @LS + '.' + @DB + '..' + @TBL
    	PRINT 'GO'
    	IF IDENT_SEED(@TBL) IS NOT NULL
    	BEGIN
    		PRINT 'SET IDENTITY_INSERT ' + @TBL + ' OFF'
    		PRINT 'GO'
    	END
    	SET @MIN = @MIN + 1
    END
    DROP TABLE #TBLIST
    - Copiar o resultado gerado pelo script acima e executar, conectado na database nova

    Deu um pouco de trabalho pra criar o script. Mas pode funcionar.

    Sinceramente, não sei o que vai ser mais fácil, adaptar sua aplicação ou copiar os dados de volta.

    Abraço!!

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    quinta-feira, 19 de novembro de 2009 19:04

Todas as Respostas

  • Olá Rogério,

    Nesse caso, você só irá conseguir exportando os dados. Não será possível fazer esse restore.

    Você poderá usar o Import/Export wizard (botão direito sobre a database/Tasks) por exemplo, para realizar essa transferência dos dados.



    Abraço!!

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    quarta-feira, 18 de novembro de 2009 14:43
  • Rogério,

    Como você realizou alterações na base de dados no SQL Server 2008, não é possível restaurar este backup no 2000.

    A não ser que você não tenha alterado o nível de compatibilidade do banco de dados.

    Você alterou o nível de compatibilidade para a versão 100?

    Se você não realizou isso, e as alterações que você fez foram somente de dados, mantendo a estrutura do banco de dados do SQL Server 2000, poderíamos fazer esse processo.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 18 de novembro de 2009 15:37
    Moderador
  • Junior,

    Mesmo não alterando o nível de compatibilidade, uma vez restaurada a database no 2008, não tem como voltar!! Nesse processo de restore são feitas alterações estruturais, que não permitem o "downgrade".

    Só Exportando os dados mesmo.


    Abraço!!!!

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    quarta-feira, 18 de novembro de 2009 15:44
  • Só que não está aceitando nem exportar os dados, eu tento exportar e não aceita me exibindo uma mensagem assim

    Execute the transfer with the TransferProvider. (Error)

    Messages

    ERROR : errorCode=-1073548784 description=Executing the query "CREATE TABLE [Newcon_Teste].[dbo].[Acompanhamento_Cobranca] (
    [CODIGO_GRUPO] smallint NOT NULL,
    [CODIGO_COTA] smallint NOT NULL,
    [VERSAO] smallint NOT NULL,
    [CGC_CPF_CLIENTE] VARCHAR(14) NOT NULL,
    [TIPO] smallint,
    [CODIGO_COBRADOR] int,
    [CODIGO_SITUACAO] CHAR(3),
    [CODIGO_BEM] smallint NOT NULL,
    [DATA_CONTEMPLACAO] datetime,
    [TIPO_CONTEMPLACAO] CHAR(1),
    [PLANO_COTA] smallint,
    [DATA_ENTREGA_BEM] datetime,
    [DATA_SITUACAO] datetime,
    [CODIGO_FILIAL_COMERCIAL] smallint NOT NULL,
    [Percentual_Ideal] money,
    [Percentual_Amortizado] money,
    [Nome_Cli] VARCHAR(80) NOT NULL,
    [Descr_Sit] VARCHAR(15) NOT NULL,
    [Descr_Bem] VARCHAR(30) NOT NULL,
    [BLOQUEIA_COBRANCA] CHAR(1) NOT NULL,
    [Nome_Cob] VARCHAR(40) NOT NULL,
    [Data_Congelamento_Bem] datetime
    )
    " failed with the following error: "There is already an object named 'Acompanhamento_Cobranca' in the database.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.
    helpFile= helpContext=0 idofInterfaceWithError={8BDFE893-E9D8-4D23-9739-DA807BCDC2AC}

    For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&LinkId=20476

    ERROR : errorCode=-1073548784 description=Executing the query "CREATE TABLE [Newcon_Teste].[dbo].[Acompanhamento_Cobranca] (
    [CODIGO_GRUPO] smallint NOT NULL,
    [CODIGO_COTA] smallint NOT NULL,
    [VERSAO] smallint NOT NULL,
    [CGC_CPF_CLIENTE] VARCHAR(14) NOT NULL,
    [TIPO] smallint,
    [CODIGO_COBRADOR] int,
    [CODIGO_SITUACAO] CHAR(3),
    [CODIGO_BEM] smallint NOT NULL,
    [DATA_CONTEMPLACAO] datetime,
    [TIPO_CONTEMPLACAO] CHAR(1),
    [PLANO_COTA] smallint,
    [DATA_ENTREGA_BEM] datetime,
    [DATA_SITUACAO] datetime,
    [CODIGO_FILIAL_COMERCIAL] smallint NOT NULL,
    [Percentual_Ideal] money,
    [Percentual_Amortizado] money,
    [Nome_Cli] VARCHAR(80) NOT NULL,
    [Descr_Sit] VARCHAR(15) NOT NULL,
    [Descr_Bem] VARCHAR(30) NOT NULL,
    [BLOQUEIA_COBRANCA] CHAR(1) NOT NULL,
    [Nome_Cob] VARCHAR(40) NOT NULL,
    [Data_Congelamento_Bem] datetime
    )
    " failed with the following error: "There is already an object named 'Acompanhamento_Cobranca' in the database.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.
    helpFile= helpContext=0 idofInterfaceWithError={8BDFE893-E9D8-4D23-9739-DA807BCDC2AC} (Microsoft.SqlServer.DtsTransferProvider)

    For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&LinkId=20476




    se quizer por favor me mande um e-mail para rogerio.sistemas@homail.com que eu vou mandar um rint da tela que está dando aqui. No forum não cnssegui postar imagem.
    Obrigado.

    - Create a temporary table transfer package for (Stopped)

    - Execute transfer package for (Stopped)

    Copying to (Stopped)

     

    no momento que executo a importação dos dados ou exportação ele exibe estas mensagens ai.
    Eu seleciono o servidor e a base de origem, depois seleciono o servidor e a  base de destino, ele selecion tudo normalmnte mas quando mando executar ele me dá essa mensagem.
    quarta-feira, 18 de novembro de 2009 17:00
  • Rogério,

    Você está mandando gravar sobre a database antiga do 2000. Faz o seguinte, crie uma nova database para receber os dados. O erro está acontecendo pois já existem lá os objetos que está tentando transferir.



    Abraço!!

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    quarta-feira, 18 de novembro de 2009 17:15
  • Boa Tarde,

    Se sua base for relativamente pequena, você pode utilizar o Database Publishing Wizard para gerar os scripts de insert e aplicá-los na base SQL Server 2000. O Database Publishing Wizard é uma ferramenta a parte disponível gratuitamente no site da Microsoft.

    Se não for possível utilizá-la, recomendo criar uma base vazia no SQL Server 2000 e exportar os dados. A mensagem de erro diz que as tabelas já existem.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!814.entry
    Classifique as respostas. O seu feedback é imprescindível
    quarta-feira, 18 de novembro de 2009 17:16
  • Alexandre,

    Eu sei disso, mas queria entender o que o nosso amigo e de que forma o backup foi restaurado!!!!
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 18 de novembro de 2009 17:34
    Moderador
  • Rogério,

    Eu já realizei este tipo de procedimento várias vezes, mas sempre exportando os dados para uma base de dados nova, evitando qualquer tipo de conflito e mantendo a atual funcionando.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 18 de novembro de 2009 17:35
    Moderador
  • o problema éque quando e etou criando abae vazia,ela até cria, mas dá erro.
    Depois vou lá e importo os dados e aparentemente ele importa, nem da erros mas porem as informações não vão para a base.
    Nunca vi isso em minha vida.
    Estou criando a base com o mesmo nome, será que isso tem problema?
    quarta-feira, 18 de novembro de 2009 18:56
  • Agora pra piorar, quando acabo de importar os dados, as informações vierão distorcidas.
    Por exemplo: O meu usuário no Sistema é o 41, Quando eu digito o usuário 41 no sistema el está puxando o usuário 12.
    A importção não preencheu os campos igual no banco antigo não.
    Acho que vou desistir desse banco.
    Vou alterar o sistema, acho que vai me dar menos trobalho, pois já perdi 4 dias nessa novela.
    de qualquer forma agradeço vocês pela atnção.
    Deus abençoe a todos.
    quarta-feira, 18 de novembro de 2009 19:15
  • Rogério,

    Criar base de dados com o nome de uma base já existente não vai dar certo, crie com outro nome.

    Em relação a importação dos dados qual o collation que você esta utilizando no SQL Server 2008?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 19 de novembro de 2009 12:52
    Moderador
  • Criei uma nova base com nome de new, a base antiga tinha o nome de Newcon_Teste, Sendo assim a base foi exportada com sucsso, depois renomeei a base new para Newcon_teste novamente, mas os dados vierão distorcidos, da mesma forma que citei anteriormente.
    quinta-feira, 19 de novembro de 2009 14:41
  • Rogério,

    Então, distorcidos como?

    O que esta de diferente?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 19 de novembro de 2009 15:39
    Moderador
  • Rogério,

    Está parecendo que a "distorção" está sendo causada pelos IDs com autoincremento. Uma idéia seria tirar os autoincrementos dos IDs e fazer novamente a transferência.

    É uma tentativa.



    Abraço!!

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    quinta-feira, 19 de novembro de 2009 15:43
  • Por exemplo: Qundo vou entrar no sistema, tenho que digitar o número de meu usuário que é 41, se eu der um F8, aparece uma lista de usuários e seus respectivos números, quando seleciono, e digito 41 que é meu usuário e dou um enter para digitar a senha.
    O sistema me traz outro usuário e dá um erro de violação de tabela.
    Parece que o banco está sendo restaurado com os dados fora da ordem.
    O usuário 11 passou para o usuário 10 e assim é com todas informações de todas tabelas.
    muito estranho isso, nunca vi nada igual.

    quinta-feira, 19 de novembro de 2009 17:30
  • Mas como vou tirar o autoincremento, tem como tirar do banco já proto?
    Pode me explicar como?
    quinta-feira, 19 de novembro de 2009 17:39
  • Rogério,

    O autoincremente é uma opção configurada sobre suas tabelas e determinadas colunas, o que você deve fazer é verificar quais são as tabelas que possuem autoincremento e remover esta propriedade na coluna.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 19 de novembro de 2009 18:25
    Moderador
  • Rogério, 

    Olha, esse é um processo meio complicado de fazer... mas tive DUAS idéias, uma pode dar certo.
    Primeiro:

    Abra o Management Studio no 2008, clique com o botão direito sobre a database, selecione Tasks > Generate Scripts...
    Na tela que abrir:
    - Next na primeira tela
    - Certifique-se de ter selecionado a database na próxima e clique Next
    - Na tela Choose Script Options, altere:
    - "Script for Server Version" para "SQL Server 2000"
    - "Script USE DATABASE" para FALSE
    - "Script Data" para TRUE, e clique Next. 
    - Selecione "Tables" e Next
    - Select All, Next
    - Script to File, indique onde gravar o arquivo, e depois Next e Finish

    * Pode demorar um pouco pra gerar esse arquivo, depende do tamanho da sua database
    Leve este arquivo para o servidor 2000, abra o prompt (DOS) e execute:
    OSQL -E -i "arquivo gerado no 2008.sql" -d "nome da nova database"

    Ele vai rodar o script gerado no 2008.


    Minha outra idéia é um pouco mais complexa, mas pode funcionar, conforme segue:
    - Gerar um script dos objetos da database (somente objetos)
    - Criar uma nova database no SQL Server 2000
    - Criar os objetos com o script gerado
    - Criar um linked server no 2000 apontando para o 2008 (pode fazer pelo Enterprise Manager/Security/Linked Servers, ou por script: http://msdn.microsoft.com/en-us/library/aa259589(SQL.80).aspx e http://msdn.microsoft.com/en-us/library/aa259581(SQL.80).aspx)
    - Conectar nesta database nova e executar o script abaixo, que irá gerar um script de INSERT/SELECT, desativando o identity nas tabelas que tem ele:

    DECLARE @LS VARCHAR (100), -- SERVIDOR REMOTO
    		@DB VARCHAR (100), -- DATABASE REMOTA
    		@CLIST VARCHAR (4000), -- LISTA DE COLUNAS
    		@MIN INT, -- CONTADOR AUXILIAR
    		@MAX INT, -- CONTADOR AUXILIAR
    		@TBL VARCHAR (100) -- TABELA
    
    SET @LS = 'NOME DO LINKED SERVER' -- EX: SERVERREMOTO
    SET @DB = 'NOME DA DATABASE REMOTA' -- EX:DBREMOTA
    
    SET @LS = 'LS' -- EX: SERVERREMOTO
    SET @DB = 'DB' -- EX:DBREMOTA
    
    CREATE TABLE #TBLIST(ID INT IDENTITY (1,1), TBL VARCHAR (100))
    
    INSERT INTO #TBLIST (TBL)
    SELECT NAME FROM SYSOBJECTS WHERE XTYPE = 'U'
    
    SELECT @MIN = MIN(ID), @MAX = MAX (ID) FROM #TBLIST
    
    WHILE @MIN <= @MAX
    BEGIN
    	SELECT @TBL = '[' + TBL + ']' FROM #TBLIST WHERE ID = @MIN
    	IF IDENT_SEED(@TBL) IS NOT NULL
    	BEGIN
    		PRINT 'SET IDENTITY_INSERT ' + @TBL + ' ON'
    		PRINT 'GO'
    	END
    	SET @CLIST = ''
    	SELECT @CLIST = @CLIST + '[' + NAME + '],' FROM SYSCOLUMNS WHERE ID = OBJECT_ID (@TBL)
    	SET @CLIST = LEFT (@CLIST, LEN (@CLIST)-1)
    	PRINT 'INSERT INTO ' + @TBL + '(' + @CLIST + ')'
    	PRINT 'SELECT ' + @CLIST + ' FROM ' + @LS + '.' + @DB + '..' + @TBL
    	PRINT 'GO'
    	IF IDENT_SEED(@TBL) IS NOT NULL
    	BEGIN
    		PRINT 'SET IDENTITY_INSERT ' + @TBL + ' OFF'
    		PRINT 'GO'
    	END
    	SET @MIN = @MIN + 1
    END
    DROP TABLE #TBLIST
    - Copiar o resultado gerado pelo script acima e executar, conectado na database nova

    Deu um pouco de trabalho pra criar o script. Mas pode funcionar.

    Sinceramente, não sei o que vai ser mais fácil, adaptar sua aplicação ou copiar os dados de volta.

    Abraço!!

    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    quinta-feira, 19 de novembro de 2009 19:04
  • Este post foi encerrado por ser considerado um post antigo.

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 5 de junho de 2018 18:10
    Moderador