it-swarm.com.de

SQL Server 2012-Kopierdatenbank fehlgeschlagen

Ich möchte eine Kopie der Datenbank auf demselben SQL Server 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:

OK

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-Objektaufgabe, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45F- 8936-5522651E0C7A}, 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM, 0,0x, (null) OnWarning, Server1, NT-Dienst\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, -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.

10
irmorteza

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
7
Reaces

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 '[email protected]+'\'+ @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
3
Kin Shah

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.

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").

(enter image description here

  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 geändert, um eine Datei zu protokollieren, damit leichter diagnostiziert werden kann, was schief gelaufen ist.

2
NER1808