Baza danych kopii programu SQL Server 2012 nie powiodła się

10

Chcę zrobić kopię bazy danych w tym samym SqlServer. więc, gdy korzystam z Kreatora kopiowania bazy danych, generuje błąd: (Zrobiłem te kroki z testową bazą danych i działa dobrze !!!!)

config:

jesteś użytkownikiem

Metoda: „Użyj metody SQL Management Object”

Wybierz nową nazwę docelowej bazy danych.

błąd:

TYTUŁ: Kreator kopiowania bazy danych

Zadanie nie powiodło się. Sprawdź dziennik zdarzeń na serwerze docelowym, aby uzyskać szczegółowe informacje.

------------------------------ GUZIKI:

ok

w dzienniku zdarzeń:

  • System

    • Dostawca

    [Nazwa] SQLSERVERAGENT

    • EventID 208

    [Kwalifikatory] 16384 Poziom 3 Zadanie 3 Słowa kluczowe 0x80000000000000

    • TimeCreated

    [SystemTime] 2014-05-07T06: 23: 11.000000000Z EventRecordID 123672 Kanał Aplikacja Komputer Serwer 1 Zabezpieczenia

  • EventData

    CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B
    Nie powiodło się 2014-05-07 10:52:50 Zadanie nie powiodło się. Zadanie zostało wywołane przez użytkownika sa. Ostatnim krokiem do uruchomienia był krok 1 (CDW_Server1_Server1_3_Step).

ostatnie wiersze pliku dziennika:

OnProgress, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7 AM, 5:46 / 2014 10:08 / 7/2014 10:08:46 AM, 0,0x, Transfer bazy danych nie powiódł się dla 1 bazy danych. OnProgress, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7 AM, 5:46 / 2014 10:08 / 7/2014 10:08:46, 100,0x, Zakończono przesyłanie obiektów. OnTaskFailed, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A} 5:46 AM, 5/7 AM, 5:46 / 7 AM, 5/7 AM, 5/7 AM, 5/7 AM 2014, 5/7 AM, 5/7 AM, 5/7 AM, 5/7 AM, 5/7 AM 2014, 5/7 AM, 5/7 AM 2014, 5/7 AM, 5/7 AM, 5/7 AM, 5/7 AM, 5/7 AM, AM. / 7/2014 10:08:46 AM, 0,0x, (null) 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, 5/7/2014 10:08:46 AM, 0, 0x, (zero) OnWarning, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A 2014 AM, 5/7/2014 10:08:46, -2147381246,0x, Kod ostrzegawczy SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Metoda wykonania się powiodła, ale liczba zgłoszonych błędów (1) osiągnęła maksymalną dozwoloną wartość (1); powodując awarię. Dzieje się tak, gdy liczba błędów osiąga liczbę określoną w MaximumErrorCount. Zmień MaximumErrorCount lub napraw błędy. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46, 5/7/2014 10:08:46 AM, -2147381246 , 0x, kod ostrzegawczy SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Metoda wykonania się powiodła, ale liczba zgłoszonych błędów (1) osiągnęła maksymalną dozwoloną wartość (1); powodując awarię. Dzieje się tak, gdy liczba błędów osiąga liczbę określoną w MaximumErrorCount. Zmień MaximumErrorCount lub napraw błędy. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46, 5/7/2014 10:08:46 AM, -2147381246 , 0x, kod ostrzegawczy SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Metoda wykonania się powiodła, ale liczba zgłoszonych błędów (1) osiągnęła maksymalną dozwoloną wartość (1); powodując awarię. Dzieje się tak, gdy liczba błędów osiąga liczbę określoną w MaximumErrorCount. Zmień MaximumErrorCount lub napraw błędy.

OnPostExecute, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/2014: 5/2014: 5 / 2014 10:08:46 AM, 0,0x, (null) DiagnosticEx, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FA65} 0 , 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, 5/7/2014 10:08:46, 1,0x, Koniec wykonywania pakietu.

irmorteza
źródło
Powinieneś podać więcej danych na temat konfiguracji procesu kopiowania bazy danych. Być może kopiujesz DB na siebie na poziomie pliku.
Vesper
używam sa w kreatorze. i Metoda: „Użyj metody SQL Management Object”. i jestem pewien, że nazwałem nową nazwą DN. Zrobiłem te kroki z testową bazą danych i działa dobrze !!!!!.
Przywróć z nową nazwą, też nie działało. !!!!!!!!! wyrzuca błąd oldDB w użyciu. zatrzymałem aplikację i ponownie uruchomiłem SQLServer, ale nie
2
Musisz upewnić się, że podczas przywracania zmienisz fizyczną nazwę pliku, a także nazwę logiczną, inaczej próbujesz przywrócić nad istniejącymi plikami DB, które będą w użyciu.
Steve Pettifer
W kreatorze przywracania po nadaniu nowej nazwy. Logiczna i fizyczna nazwa nie zmienia się automatycznie. i mogę zmienić nazwę fizyczną, co nie jest logiczne

Odpowiedzi:

7

Łatwiej może być po prostu wykonać kopię zapasową bazy danych na .bak, a następnie utworzyć nową bazę danych na podstawie przywracania .bak.

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

Następnie sprawdź logiczne nazwy i lokalizacje bieżących plików w .bak:

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

I wreszcie przywróć bazę danych, zmieniając nazwy plików, aby upewnić się, że nie zastąpisz istniejącej bazy danych

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
źródło
Nie, jeśli próbujesz kopiować na niższej wersji serwera.
watbywbarif
@watbywbarif Pytanie brzmiało:in the same SqlServer
Reaces
3

Poniżej znajduje się skrypt, który napisałem dla siebie, aby wykonać kopię bazy danych. Jest elastyczny i można go przekształcić w procedurę składowaną.

Komentarze wyjaśnią, co robi.

Przetestuj na serwerze testowym przed uruchomieniem go w 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
źródło
2

Miałem ten sam problem. Zmieniłem konto logowania do usługi SQL Server Agent na administratora. Potem wszystko jest w porządku. Myślę, że usługa agenta nie mogła czytać / pisać.

Oğuzhan Kahyaoğlu
źródło
To jest najłatwiejsze rozwiązanie spośród odpowiedzi tutaj. Nigdy nie podejrzewam, że konto logowania powoduje problem.
Lester Nubla
2

Miałem z tym problemy. W końcu postanowiłem zrobić dwie rzeczy:

  1. Utwórz udział plików o nazwie „Pakiety DTS”. Stało się tak, ponieważ nie byłem w stanie wybrać miejsca docelowego pakietu w kreatorze. Upewnij się, że uprawnienia udziału i ACL są pełne dla konta, na którym działa SQL Server Agent (domyślnie jest to „NT Service \ SQLSERVERAGENT”).

wprowadź opis zdjęcia tutaj

  1. Dodaj pełne uprawnienia do konta SQL Server Agent do folderu docelowego, w którym ma zostać utworzona nowa baza danych.

Zmieniłem również rejestrowanie, aby zalogować się do pliku, dzięki czemu łatwiej było zdiagnozować, co poszło nie tak.

NER1808
źródło