Database di copia di SQL Server 2012 non riuscito


10

Voglio fare una copia del database nello stesso SqlServer. quindi, quando utilizzo la procedura guidata per la copia del database, viene generato l'errore: (ho eseguito questa procedura con un DB di prova e funziona bene !!!!)

config:

un utente

Metodo: "Usa il metodo SQL Management Object"

Scegli un nuovo nome per il database di destinazione.

errore:

TITOLO: Copia guidata database

Il lavoro è fallito. Controllare il registro eventi sul server di destinazione per i dettagli.

------------------------------ PULSANTI:

ok

nel registro eventi:

  • Sistema

    • Provider

    [Nome] SQLSERVERAGENT

    • EventID 208

    [Qualificatori] 16384 Livello 3 Task 3 Parole chiave 0x80000000000000

    • TimeCreated

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

  • EventData

    CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B
    non riuscito 2014-05-07 10:52:50 Il lavoro non è riuscito. Il lavoro è stato invocato dall'utente sa. L'ultimo passaggio da eseguire è stato il passaggio 1 (CDW_Server1_Server1_3_Step).

ultime righe del file di 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 / 7/2014 10:08:46, 0,0x, Trasferimento del database non riuscito per 1 database. 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 / 7/2014 10:08:46, 100,0x, Esecuzione completata di trasferimento oggetti. OnTaskFailed, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5 / 7:08, 5:08 / 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 2014 10:08:46 AM, 5/7/2014 2014 10:08:46, 0, 0x, (null) OnWarning, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0:10 / 5:08, 5:08, 5:08, 5, 2014 AM, 5/7/2014 2014 10:08:46, -2147381246,0x, Codice di avviso SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Il metodo di esecuzione ha avuto esito positivo, ma il numero di errori generati (1) ha raggiunto il massimo consentito (1); con conseguente fallimento. Ciò si verifica quando il numero di errori raggiunge il numero specificato in MaximumErrorCount. Modificare il MaximumErrorCount o correggere gli errori. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46, 5/7/2014 10:08:46, -2147381246 , 0x, Codice di avviso SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Il metodo di esecuzione ha avuto esito positivo, ma il numero di errori generati (1) ha raggiunto il massimo consentito (1); con conseguente fallimento. Ciò si verifica quando il numero di errori raggiunge il numero specificato in MaximumErrorCount. Modificare il MaximumErrorCount o correggere gli errori. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46, 5/7/2014 10:08:46, -2147381246 , 0x, Codice di avviso SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Il metodo di esecuzione ha avuto esito positivo, ma il numero di errori generati (1) ha raggiunto il massimo consentito (1); con conseguente fallimento. Ciò si verifica quando il numero di errori raggiunge il numero specificato in MaximumErrorCount. Modificare il MaximumErrorCount o correggere gli errori.

OnPostExecute, Server1, Servizio NT \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A / 5:08, 5:08, 5:08 / 2014 10:08:46 AM, 0,0x, (null) DiagnosticEx, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-89055E22165022 , 5/7/2014 10:08:46, 5/7/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}, 5/7/2014 2014 10:08:46, 5/7/2014 2014 10:08:46, 1,0x, Fine dell'esecuzione del pacchetto.


È necessario fornire ulteriori dati su come configurare il processo di copia del database. Forse stai copiando DB su se stesso a livello di file.
Vesper

io uso un utente nella procedura guidata. e metodo: "Usa il metodo dell'oggetto di gestione SQL". e sono sicuro di aver chiamato il nuovo nome DN. Ho fatto questo passo con un DB di prova e funziona benissimo !!!!!.

Ripristina con un nuovo nome, non ha funzionato troppo. !!!!!!!!! genera l'errore di oldDB in uso. ho interrotto l'applicazione e riavviavo anche SQL Server, ma non funzionava

2
Devi assicurarti che quando ripristini modifichi il nome del file fisico e il nome logico, altrimenti stai cercando di ripristinare sopra i file DB esistenti che saranno in uso.
Steve Pettifer,

Nella procedura guidata di ripristino dopo aver assegnato un nuovo nome. Nome logico e fisico non modificato automaticamente. e posso solo cambiare il nome fisico non logico

Risposte:


7

Potrebbe essere più semplice eseguire semplicemente il backup del database su un .bak e quindi creare un nuovo database da un ripristino .bak.

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

Quindi controlla i nomi logici e le posizioni per i file correnti in .bak:

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

E infine ripristina il database, rinominando i file per assicurarti di non sovrascrivere il database esistente

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

Non se stai cercando di copiare su una versione server inferiore.
Watbywbarif,

@watbywbarif La domanda era:in the same SqlServer
Reagisce il

3

Di seguito è riportato lo script che ho scritto per me stesso per creare una copia del database. È flessibile e può essere convertito in una procedura memorizzata.

I commenti spiegheranno cosa fa.

Provalo su un server di prova prima di eseguirlo in 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

Ho avuto lo stesso problema. Ho cambiato l'account di accesso al servizio SQL Server Agent in un amministratore. Dopodiché, va tutto bene. Penso che il servizio Agent non sia riuscito a leggere / scrivere.


Questa è la soluzione più semplice tra le risposte qui. Non sospetterò mai che l'account di accesso causi il problema.
Lester Nubla,

2

Ho avuto problemi con questo. Alla fine ho deciso di fare due cose:

  1. Creare una condivisione file denominata "Pacchetti DTS". Questo perché non ero in grado di selezionare una destinazione del pacchetto nella procedura guidata. Assicurarsi che le autorizzazioni di condivisione e ACL siano complete per l'account in cui è in esecuzione l'agente SQL Server (l'impostazione predefinita è "Servizio NT \ SQLSERVERAGENTE").

inserisci qui la descrizione dell'immagine

  1. Aggiungi autorizzazioni complete all'account SQL Server Agent nella cartella di destinazione in cui deve essere creato anche il nuovo database.

Ho anche modificato la registrazione per accedere a un file in modo che fosse più facile diagnosticare cosa non funzionava.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.