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.