Falha no banco de dados de cópia do SQL Server 2012


10

Eu quero fazer uma cópia do banco de dados no mesmo SqlServer. Então, quando eu uso o Copy Database Wizard, ele gera um erro: (Eu fiz essas etapas com um banco de dados de teste e funciona bem !!!!)

config:

um usuário

Método: "Use o método SQL Management Object"

Escolha um novo nome para o banco de dados de destino.

erro:

TITLE: Copiar Assistente de Banco de Dados

O trabalho falhou. Verifique o log de eventos no servidor de destino para obter detalhes.

------------------------------ BOTÕES:

Está bem

no log de eventos:

  • Sistema

    • Fornecedor

    [Nome] SQLSERVERAGENT

    • EventID 208

    [Qualificadores] 16384 Palavras-chave da Tarefa 3 de Nível 3 0x80000000000000

    • TimeCreated

    [SystemTime] 2014-05-07T06: 23: 11.000000000Z Segurança do servidor1 do computador do aplicativo de canal EventRecordID 123672

  • EventData

    CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B
    falhou 2014-05-07 10:52:50 O trabalho falhou. O trabalho foi chamado pelo usuário sa. A última etapa a ser executada foi a etapa 1 (CDW_Server1_Server1_3_Step).

últimas linhas do arquivo de log:

OnProgress, Servidor1, Serviço NT \ SQLSERVERAGENT, Tarefa Server1_Server1_Transfer Objects, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10h07: 05 / 7/2014 10:08:46, 0,0x, Falha na transferência do banco de dados para 1 banco de dados. OnProgress, Servidor1, Serviço NT \ SQLSERVERAGENT, Tarefa Server1_Server1_Transfer Objects, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10h07: 05 / 7/2014 10:08:46 AM, 100,0x, A transferência de objetos terminou a execução. OnTaskFailed, Servidor1, Serviço NT \ SQLSERVERAGENT, Tarefa Server1_Server1_Transfer Objects, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/5: 7/05/04: 10/05 / 7/2014 10:08:46, 0,0x, (nulo) OnPostExecute, Server1, NT Service \ SQLSERVERAGENT, tarefa Server1_Server1_Transfer Objects, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 7/7/2014 10:08:46 AM, 7/7/2014 10:08:46 AM, 0, 0x, (nulo) OnWarning, Servidor1, Serviço NT \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-552255 / 05: 7/7 AM, 7/7/2014 10:08:46, -2147381246,0x, código de aviso do SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. O método Execution foi bem-sucedido, mas o número de erros gerados (1) atingiu o máximo permitido (1); resultando em falha. Isso ocorre quando o número de erros atinge o número especificado em MaximumErrorCount. Altere MaximumErrorCount ou corrija os erros. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 7/7/2014 10:08:46 AM, 7/7/2014 10:08:46, -2147381246 , 0x, código de aviso SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. O método Execution foi bem-sucedido, mas o número de erros gerados (1) atingiu o máximo permitido (1); resultando em falha. Isso ocorre quando o número de erros atinge o número especificado em MaximumErrorCount. Altere MaximumErrorCount ou corrija os erros. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 7/7/2014 10:08:46 AM, 7/7/2014 10:08:46, -2147381246 , 0x, código de aviso SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. O método Execution foi bem-sucedido, mas o número de erros gerados (1) atingiu o máximo permitido (1); resultando em falha. Isso ocorre quando o número de erros atinge o número especificado em MaximumErrorCount. Altere MaximumErrorCount ou corrija os erros.

OnPostExecute, Servidor1, Serviço NT \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/7/2014/05: 7 / 2014 10:08:46 AM, 0,0x, (nulo) DiagnosticEx, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45A1} , 5/7/2014 10:08:46, 7/5/2014 10:08:46, 0,0x, 104546304 PackageEnd, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA- AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 7/5/2014 10:08:46 AM, 7/7/2014 10:08:46 AM, 1,0x, Execução de fim de pacote.


Você deve fornecer mais dados sobre como configurar o processo do banco de dados de cópias. Talvez você esteja copiando o DB sobre si mesmo no nível do arquivo.
— Vesper

eu uso um usuário no assistente. e Método: "Use o método SQL Management Object". e tenho certeza de nomeado novo nome DN. Eu fiz essas etapas com um banco de dados de teste e funciona bem !!!!!.

Restaurar com novo nome, não funcionou também. !!!!!!!!! lança erro do oldDB em uso. parei aplicação e reiniciar SQLServer também, mas não funcionou

2
Você deve certificar-se de que, ao restaurar, altere o nome do arquivo físico e o nome lógico, caso contrário, você está tentando restaurar por cima dos arquivos de banco de dados existentes que estarão em uso.
— Steve Pettifer

No assistente de restauração depois de dar um novo nome. O nome lógico e físico não foi alterado automaticamente. e eu só pode mudar nome físico não é lógico

Respostas:


7

Pode ser mais fácil simplesmente fazer backup do banco de dados em um .bak e criar um novo banco de dados a partir de uma restauração .bak.

BACKUP DATABASE [aaa] TO DISK = N'E:\aaa.bak'

Em seguida, verifique os nomes lógicos e os locais dos arquivos atuais no .bak:

Restore filelistonly from disk ='E:\aaa.bak'

E, finalmente, restaure o banco de dados, renomeando os arquivos para garantir que você não substitua o banco de dados existente

restore database Newdatabasename
FROM disk = 'E:\aaa.bak'
WITH replace,
MOVE 'Logical data name' TO 'E:\Newdatabasename.MDF',
MOVE 'Logical log name' TO 'E:\Newdatabasename.LDF',
recovery --force

Não se você estiver tentando copiar na versão inferior do servidor.
— precisa saber é o seguinte

@watbywbarif A questão era:in the same SqlServer
— Acessa 3/17

3

Abaixo está o script que eu escrevi para fazer uma cópia do banco de dados. É flexível e pode ser convertido em um procedimento armazenado.

Os comentários vão explicar o que faz.

Teste-o em um servidor de teste antes de executá-lo no PROD !!

/*
Author      :       KIN SHAH
Purpose     :       Written for dba.stackexchange.com
                -   This script will take the current database name and make a copy of it as
                    databaseName_copy_Month_Year e.g. [AdventureWorks2008R2_copy_August_2014]
                -   It will not replace the database and will fail if the copy database existed.
                -   Assuming that copy database is not currently present on the instance.
                -   It wont delete the backup made as a part of making a copy of the database. 
                    It will print out the location and then you can delete it
Any questions .. Let me know .... :-)

*/

IF object_id('tempdb..#temp1') IS NOT NULL
BEGIN
    DROP TABLE #temp1
END

IF object_id('tempdb..#temp2') IS NOT NULL
BEGIN
    DROP TABLE #temp2
END

IF object_id('tempdb..#temp3') IS NOT NULL
BEGIN
    DROP TABLE #temp3
END

/************************************************* CHANGE HERE STARTS !! ******************************************************/
DECLARE @dbname NVARCHAR(MAX)

SET @dbname = 'AdventureWorks2008R2' -- ** change HERE ***

--backup path goes here
DECLARE @path NVARCHAR(MAX)

-- Here the path is hard-coded  as all the server has 'D:\2restore' folder. This can be made as input parameter also !
SET @path = 'C:\crap_test' -- ** change HERE ***
    -- generates copy database name 

DECLARE @archivedbname NVARCHAR(MAX)

SET @archivedbname = @dbname + '_copy' + '_' + DATENAME(MONTH, GETDATE()) + '_' + CAST(DATEPART(YEAR, GETDATE()) AS VARCHAR(MAX))

--PRINT @archivedbname
/************************************************* CHANGE HERE ENDS !! ******************************************************/
-- check that the database to be archived is  there and is not a system database ...
IF @dbname IN (
        SELECT NAME
        FROM MASTER..sysdatabases
        WHERE DB_ID(NAME) > 4
        )
BEGIN
    SELECT 'The database is correct. starting Archiving Process .....'

    BEGIN TRY
        SELECT *
        INTO #temp1
        FROM MASTER.sys.master_files
        WHERE database_id = cast(DB_ID(@dbname) AS NVARCHAR(MAX))

        -- now get the logical and physical names of the database to be archived
        -- type 0 = data
        CREATE TABLE #temp2 (
            ldata NVARCHAR(MAX)
            ,pdata NVARCHAR(max)
            )

        DECLARE @ldata NVARCHAR(MAX)
        DECLARE @pdata NVARCHAR(MAX)

        SELECT @ldata = 'select [name],[physical_name] from #temp1 where  type = 0 and database_id =' + cast(DB_ID(@dbname) AS NVARCHAR(MAX))

        INSERT INTO #temp2
        EXEC (@ldata)

        SELECT @ldata = ldata
        FROM #temp2

        --PRINT @ldata
        SELECT @pdata = pdata
        FROM #temp2

        SELECT @pdata = left(@pdata, len(left(@pdata, LEN(@pdata) - 4)) - len(@ldata)) + @archivedbname + '.mdf'

        --PRINT @pdata
        -- type 1 = log
        CREATE TABLE #temp3 (
            llog NVARCHAR(MAX)
            ,plog NVARCHAR(max)
            )

        DECLARE @llog NVARCHAR(MAX)
        DECLARE @plog NVARCHAR(MAX)

        SELECT @llog = 'select [name],[physical_name] from #temp1 where  type = 1 and database_id =' + cast(DB_ID(@dbname) AS NVARCHAR(MAX))

        INSERT INTO #temp3
        EXEC (@llog)

        SELECT @llog = llog
        FROM #temp3

        --PRINT @llog
        SELECT @plog = plog
        FROM #temp3

        SELECT @plog = left(@plog, LEN(left(@plog, LEN(@plog) - 4)) - LEN(@llog)) + @archivedbname + '_log.ldf'

        --PRINT @plog
        -- now we will take backup of the database that is specified ....
        SELECT 'Taking backup of database ' + @dbname

        DECLARE @sql NVARCHAR(MAX)

        -- use compression using Redgate backup 
        SELECT @sql = 'backup database ' + @dbname + ' to disk =''' + @path + '\' + @dbname + '_FULL_' + convert(VARCHAR(10), getdate(), 112) + '.bak' + ''' with init, compression, stats =10'

        PRINT @sql

        EXEC (@sql)

        SELECT 'The backup is done for ' + @dbname
    END TRY

    BEGIN CATCH
        SELECT ERROR_NUMBER() AS ErrorNumber
            ,ERROR_SEVERITY() AS ErrorSeverity
            ,ERROR_STATE() AS ErrorState
            ,ERROR_PROCEDURE() AS ErrorProcedure
            ,ERROR_LINE() AS ErrorLine
            ,ERROR_MESSAGE() AS ErrorMessage
    END CATCH

    -- now restore the database as archive database          
    BEGIN TRY
        SELECT 'Starting restore part for ' + @archivedbname

        SELECT @sql = 'restore database ' + @archivedbname + ' from disk = ''' + @path + '\' + @dbname + '_FULL_' + CONVERT(VARCHAR(8), GETDATE(), 112) + '.bak' + ''' with recovery ' + ',' + ' move ''' + @ldata + ''' ' + 'to ' + '''' + @pdata + '''' + ',' + ' move ''' + @llog + ''' ' + ' to ' + '''' + @plog + ''''

        --print (@sql)
        EXEC (@sql)

        SELECT 'Restore is done sucessfully ! And the new database name is ' + @archivedbname + '!!'
    END TRY

    BEGIN CATCH
        SELECT ERROR_NUMBER() AS ErrorNumber
            ,ERROR_SEVERITY() AS ErrorSeverity
            ,ERROR_STATE() AS ErrorState
            ,ERROR_PROCEDURE() AS ErrorProcedure
            ,ERROR_LINE() AS ErrorLine
            ,ERROR_MESSAGE() AS ErrorMessage
    END CATCH

    SELECT 'Database is restored as Copy, Now you can delete the backup taken at ...' + @path + '\' + @dbname + '_full_' + CONVERT(VARCHAR(8), GETDATE(), 112) + '.bak'''
        -- delete the backup file
        --select @sql= 'exec master.dbo.xp_cmdshell ''Del '+@path+'\'+ @dbname+'_full_'+ CONVERT(VARCHAR(8), GETDATE(), 112)+'.bak'''
        --print (@sql)
        --EXEC (@sql)
END
ELSE
BEGIN
    SELECT ' The database is INCORRECT ! Check if the database exists or is not a system database'
END
GO

2

Eu tive o mesmo problema. Alterei a conta de logon do serviço SQL Server Agent para um administrador. Depois disso, está tudo bem. Eu acho que o serviço do Agente não pôde ler / gravar.


Esta é a solução mais fácil entre as respostas aqui. Nunca suspeitarei que a conta de logon causou o problema.
— Lester Nubla

2

Eu tive problemas com isso. Eventualmente, eu decidi fazer duas coisas:

  1. Crie um compartilhamento de arquivos chamado 'Pacotes DTS'. Isso ocorreu porque não consegui selecionar um destino de pacote no assistente. Verifique se as permissões de compartilhamento e ACL estão cheias para a conta na qual seu SQL Server Agent está sendo executado (o padrão é 'NT Service \ SQLSERVERAGENT').

insira a descrição da imagem aqui

  1. Adicione permissões completas à conta do SQL Server Agent na pasta de destino em que o novo banco de dados também deve ser criado.

Também alterei o log para fazer logon em um arquivo para facilitar o diagnóstico do que deu errado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.