Error en la base de datos de copia de SQL Server 2012

10

Quiero hacer una copia de la base de datos en el mismo SqlServer. Por lo tanto, cuando uso el Asistente para copiar bases de datos, arroja un error: (¡Realicé estos pasos con un DB de prueba y funciona bien!)

config:

un usuario

Método: "Usar el método del objeto de administración SQL"

Elija un nuevo nombre para la base de datos de destino.

error:

TÍTULO: Asistente para copiar bases de datos

El trabajo falló. Consulte el registro de eventos en el servidor de destino para obtener más detalles.

------------------------------ BOTONES:

Okay

en el registro de eventos:

  • Sistema

    • Proveedor

    [Nombre] SQLSERVERAGENT

    • Id. De evento 208

    [Calificadores] 16384 Nivel 3 Tarea 3 Palabras clave 0x80000000000000

    • Tiempo creado

    [SystemTime] 2014-05-07T06: 23: 11.000000000Z EventRecordID 123672 Canal Aplicación Computadora Servidor1 Seguridad

  • EventData

    CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B
    Falló 2014-05-07 10:52:50 El trabajo falló. El trabajo fue invocado por el usuario sa. El último paso para ejecutar fue el paso 1 (CDW_Server1_Server1_3_Step).

últimas líneas del archivo de registro:

OnProgress, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08, 5:46/2014 10:08 / 7/2014 10:08:46 AM, 0,0x, Error en la transferencia de la base de datos para 1 base de datos. OnProgress, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08, 5:46/2014 10:08 / 7/2014 10:08:46 AM, 100,0x, Transferencia de objetos finalizada ejecución. OnTaskFailed, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5: 7/7/7/2014/5: 7/7/5/7/2014 / 7/2014 10:08:46 AM, 0,0x, (nulo) OnPostExecute, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM, 0, 0x, (nulo) OnWarning, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651, 08:7 / 7/7/7 AM, 7/7/2014 10:08:46 AM, -2147381246,0x, código de advertencia SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. El método de ejecución tuvo éxito, pero el número de errores generados (1) alcanzó el máximo permitido (1); resultando en una falla. Esto ocurre cuando el número de errores alcanza el número especificado en MaximumErrorCount. Cambie MaximumErrorCount o corrija los errores. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM, -2147381246 , 0x, código de advertencia SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. El método de ejecución tuvo éxito, pero el número de errores generados (1) alcanzó el máximo permitido (1); resultando en una falla. Esto ocurre cuando el número de errores alcanza el número especificado en MaximumErrorCount. Cambie MaximumErrorCount o corrija los errores. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM, -2147381246 , 0x, código de advertencia SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. El método de ejecución tuvo éxito, pero el número de errores generados (1) alcanzó el máximo permitido (1); resultando en una falla. Esto ocurre cuando el número de errores alcanza el número especificado en MaximumErrorCount. Cambie MaximumErrorCount o corrija los errores.

OnPostExecute, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A 2014, 5/7: 7/8: 5/7/8: 5/7/8/5 / 2014 10:08:46 AM, 0,0x, (nulo) DiagnosticEx, Servidor1, Servicio NT \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45F22-893-07C0A1E036-7 , 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM, 0,0x, 104546304 PackageEnd, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA- AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM, 1,0x, Fin de la ejecución del paquete.

irmorteza
fuente
Debería proporcionar más datos sobre cómo configurar el proceso de copia de la base de datos. Tal vez esté copiando DB sobre sí mismo a nivel de archivo.
Vesper
Yo uso un usuario en el asistente. y Método: "Usar el método del Objeto de administración de SQL". y estoy seguro nombrado nuevo nombre de DN. Hice estos pasos con un DB de prueba y funciona bien !!!!!.
Restaurar con nuevo nombre, no funcionó también. !!!!!!!!! arroja un error de oldDB en uso. Detuve la aplicación y reinicié SQLServer también, pero no funcionó
2
Debe asegurarse de que, cuando restaure, cambie el nombre del archivo físico y el nombre lógico; de lo contrario, intentará restaurar por encima de los archivos DB existentes que estarán en uso.
Steve Pettifer
En el asistente de restauración después de dar un nuevo nombre. El nombre lógico y físico no cambia automáticamente. y yo sólo puedo cambiar nombre físico no es lógico

Respuestas:

7

Puede ser más fácil simplemente hacer una copia de seguridad de la base de datos en un .bak y luego crear una nueva base de datos a partir de una restauración .bak.

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

Luego verifique los nombres lógicos y las ubicaciones de los archivos actuales en el .bak:

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

Y finalmente restaure la base de datos, cambie el nombre de los archivos para asegurarse de no sobrescribir su base de datos 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
Reaces
fuente
No si está intentando copiar en una versión inferior del servidor.
watbywbarif
@watbywbarif La pregunta fue:in the same SqlServer
Responde el
3

A continuación se muestra el script que escribí para mí para hacer una copia de la base de datos. Es flexible y se puede convertir en un procedimiento almacenado.

Los comentarios explicarán lo que hace.

¡Pruébelo en un servidor de prueba antes de ejecutarlo en 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
Kin Shah
fuente
2

Tuve el mismo problema. Cambié la cuenta de inicio de sesión del servicio del Agente SQL Server a un administrador. Después de eso, todo está bien. Creo que el servicio del Agente no pudo leer / escribir.

Oğuzhan Kahyaoğlu
fuente
Esta es la solución más fácil entre las respuestas aquí. Nunca sospecharé que la cuenta de inicio de sesión causa el problema.
Lester Nubla
2

Tuve problemas con esto. Finalmente decidí hacer dos cosas:

  1. Cree un archivo compartido llamado 'Paquetes DTS'. Esto se debió a que no pude seleccionar un destino de paquete en el asistente. Asegúrese de que los permisos de uso compartido y ACL estén completos para la cuenta con la que se ejecuta su Agente SQL Server (el valor predeterminado es 'Servicio NT \ SQLSERVERAGENT').

ingrese la descripción de la imagen aquí

  1. Agregue permisos completos a la cuenta del Agente SQL Server a la carpeta de destino donde también se creará la nueva base de datos.

También cambié el registro para iniciar sesión en un archivo, por lo que fue más fácil diagnosticar lo que salió mal.

NER1808
fuente