SQL Server 2012-Kopierdatenbank fehlgeschlagen

10

Ich möchte eine Kopie der Datenbank im selben SqlServer erstellen. Wenn ich den Assistenten zum Kopieren von Datenbanken verwende, wird ein Fehler ausgegeben: (Ich habe diese Schritte mit einer Test-DB ausgeführt und es funktioniert einwandfrei !!!!)

config:

Ein Benutzer

Methode: "Verwenden Sie die SQL Management Object-Methode"

Wählen Sie einen neuen Namen für die Zieldatenbank.

Error:

TITEL: Assistent zum Kopieren von Datenbanken

Der Job ist fehlgeschlagen. Überprüfen Sie das Ereignisprotokoll auf dem Zielserver auf Details.

------------------------------ TASTEN:

in Ordnung

im Ereignisprotokoll:

  • System

    • Anbieter

    [Name] SQLSERVERAGENT

    • EventID 208

    [Qualifiers] 16384 Level 3 Aufgabe 3 Schlüsselwörter 0x80000000000000

    • Zeit erstellt

    [SystemTime] 2014-05-07T06: 23: 11.000000000Z EventRecordID 123672 Channel Application Computer Server1-Sicherheit

  • EventData

    CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B
    fehlgeschlagen 2014-05-07 10:52:50 Der Job ist fehlgeschlagen. Der Job wurde von User sa aufgerufen. Der letzte auszuführende Schritt war Schritt 1 (CDW_Server1_Server1_3_Step).

letzte Zeilen der Protokolldatei:

OnProgress, Server1, NT-Dienst \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/46 / 5/2014 / 7/2014 10:08:46 AM, 0,0x, Datenbankübertragung für 1 Datenbank (en) fehlgeschlagen. OnProgress, Server1, NT-Dienst \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/46 / 5/2014 / 7/2014 10:08:46 AM, 100,0x, Objekte übertragen, Ausführung ausgeführt. OnTaskFailed, Server1, NT-Dienst \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A} 10, 5/8 / 7/2014 10:08:46 AM, 0,0x, (null) OnPostExecute, Server1, NT-Dienst \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 07.05.2014 10:08:46, 07.05.2014 10:08:46, 0, 0x, (null) OnWarning, Server1, NT-Dienst \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7 AM, 5/7/2014 10:08:46 AM, -2147381246,0x, SSIS-Warncode DTS_W_MAXIMUMERRORCOUNTREACHED. Die Ausführungsmethode war erfolgreich, aber die Anzahl der aufgetretenen Fehler (1) erreichte das maximal zulässige (1); was zum Scheitern führt. Dies tritt auf, wenn die Anzahl der Fehler die in MaximumErrorCount angegebene Anzahl erreicht. Ändern Sie den MaximumErrorCount oder beheben Sie die Fehler. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 07.05.2014 10:08:46, 07.05.2014 10:08:46, -2147381246 , 0x, SSIS-Warncode DTS_W_MAXIMUMERRORCOUNTREACHED. Die Ausführungsmethode war erfolgreich, aber die Anzahl der aufgetretenen Fehler (1) erreichte das maximal zulässige (1); was zum Scheitern führt. Dies tritt auf, wenn die Anzahl der Fehler die in MaximumErrorCount angegebene Anzahl erreicht. Ändern Sie den MaximumErrorCount oder beheben Sie die Fehler. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 07.05.2014 10:08:46, 07.05.2014 10:08:46, -2147381246 , 0x, SSIS-Warncode DTS_W_MAXIMUMERRORCOUNTREACHED. Die Ausführungsmethode war erfolgreich, aber die Anzahl der aufgetretenen Fehler (1) erreichte das maximal zulässige (1); was zum Scheitern führt. Dies tritt auf, wenn die Anzahl der Fehler die in MaximumErrorCount angegebene Anzahl erreicht. Ändern Sie den MaximumErrorCount oder beheben Sie die Fehler.

OnPostExecute, Server1, NT-Dienst \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A 10, 7/5 / 2014 10:08:46 AM, 0,0x, (null) DiagnosticEx, Server1, NT-Dienst \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB1} , 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM, 0,0x, 104546304 PackageEnd, Server1, NT-Dienst \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA- AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 07.05.2014 10:08:46, 07.05.2014 10:08:46, 1,0x, Ende der Paketausführung.

irmorteza
quelle
Sie sollten weitere Daten zur Konfiguration des Kopierdatenbankprozesses bereitstellen. Möglicherweise kopieren Sie die Datenbank auf Dateiebene über sich selbst.
Vesper
Ich benutze einen Benutzer im Assistenten. und Methode: "Verwenden Sie die SQL Management Object-Methode". und ich bin sicher, neuen DN-Namen genannt. Ich habe diese Schritte mit einer Test-DB gemacht und es funktioniert gut !!!!!
Mit neuem Namen wiederherstellen, hat auch nicht funktioniert. !!!!!!!!! es wirft Fehler von oldDB in Verwendung. Ich habe die Anwendung gestoppt und SQLServer auch neu gestartet, aber nicht funktioniert
2
Sie müssen sicherstellen, dass Sie beim Wiederherstellen den physischen Dateinamen sowie den logischen Namen ändern, andernfalls versuchen Sie, über die vorhandenen DB-Dateien, die verwendet werden, wiederherzustellen.
Steve Pettifer
Im Wiederherstellungsassistenten nach Eingabe eines neuen Namens. Logischer und physischer Name werden nicht automatisch geändert. und ich kann nur den physischen Namen ändern, der nicht logisch ist

Antworten:

7

Es ist möglicherweise einfacher, die Datenbank einfach in einem .bak zu sichern und dann aus einer .bak-Wiederherstellung eine neue Datenbank zu erstellen.

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

Überprüfen Sie dann die logischen Namen und Speicherorte für die aktuellen Dateien in der .bak:

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

Stellen Sie schließlich die Datenbank wieder her und benennen Sie die Dateien um, um sicherzustellen, dass Sie Ihre vorhandene Datenbank nicht überschreiben

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
Reagiert
quelle
Nicht, wenn Sie versuchen, auf eine niedrigere Serverversion zu kopieren.
Watbywbarif
@ Watbywbarif Die Frage war:in the same SqlServer
Reaces
3

Unten ist das Skript, das ich für mich selbst geschrieben habe, um eine Kopie der Datenbank zu erstellen. Es ist flexibel und kann in eine gespeicherte Prozedur umgewandelt werden.

Die Kommentare erklären, was es tut.

Testen Sie es auf einem Testserver, bevor Sie es in PROD ausführen !!

/*
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
quelle
2

Ich hatte das gleiche Problem. Ich habe das Anmeldekonto des SQL Server-Agentendienstes in einen Administrator geändert. Danach ist alles in Ordnung. Ich denke, der Agentendienst konnte nicht lesen / schreiben.

Oğuzhan Kahyaoğlu
quelle
Dies ist die einfachste Lösung unter den Antworten hier. Ich werde niemals vermuten, dass das Anmeldekonto das Problem verursacht.
Lester Nubla
2

Ich hatte Probleme damit. Schließlich entschied ich mich für zwei Dinge:

  1. Erstellen Sie eine Dateifreigabe mit dem Namen "DTS-Pakete". Dies lag daran, dass ich im Assistenten kein Paketziel auswählen konnte. Stellen Sie sicher, dass die Freigabe- und ACL-Berechtigungen für das Konto, unter dem Ihr SQL Server-Agent ausgeführt wird, voll sind (Standard ist "NT Service \ SQLSERVERAGENT").

Geben Sie hier die Bildbeschreibung ein

  1. Fügen Sie dem SQL Server-Agentenkonto vollständige Berechtigungen zum Zielordner hinzu, in dem auch die neue Datenbank erstellt werden soll.

Ich habe auch die Protokollierung so geändert, dass sie in einer Datei protokolliert wird, damit leichter diagnostiziert werden kann, was schief gelaufen ist.

NER1808
quelle