Échec de la base de données de copie de SQL Server 2012

10

Je veux faire une copie de la base de données dans le même SqlServer. donc, lorsque j'utilise l'assistant de copie de base de données, il génère une erreur: (j'ai effectué ces étapes avec une base de données de test et cela fonctionne très bien !!!!)

config:

un utilisateur

Méthode: "Utiliser la méthode SQL Management Object"

Choisissez un nouveau nom pour la base de données de destination.

Erreur:

TITRE: Assistant de copie de base de données

Le travail a échoué. Consultez le journal des événements sur le serveur de destination pour plus de détails.

------------------------------ BOUTONS:

D'accord

dans le journal des événements:

  • Système

    • Fournisseur

    [Nom] SQLSERVERAGENT

    • EventID 208

    [Qualificateurs] 16384 Mots-clés de la tâche 3 de niveau 3 0x80000000000000

    • TimeCreated

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

  • EventData

    CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B a
    échoué 2014-05-07 10:52:50 Le travail a échoué. Le Job a été invoqué par User sa. La dernière étape à exécuter était l'étape 1 (CDW_Server1_Server1_3_Step).

dernières lignes du fichier journal:

OnProgress, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 05/07/2014 10:08 / 7/2014 10:08:46, 0,0x, Le transfert de la base de données a échoué pour 1 base (s) de données. OnProgress, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 05/07/2014 10:08 / 7/2014 10:08:46, 100,0x, Les objets de transfert ont terminé l'exécution. OnTaskFailed, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 05/08: 05/7 / 7/2014 10:08:46, 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 AM, 5/7/2014 10:08:46 AM, 0, 0x, (null) OnWarning, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 10: 07 AM, 5/7/2014 10:08:46 AM, -2147381246,0x, Code d'avertissement SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. La méthode d'exécution a réussi, mais le nombre d'erreurs levées (1) a atteint le maximum autorisé (1); entraînant un échec. Cela se produit lorsque le nombre d'erreurs atteint le nombre spécifié dans MaximumErrorCount. Modifiez le MaximumErrorCount ou corrigez les erreurs. {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, Code d'avertissement SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. La méthode d'exécution a réussi, mais le nombre d'erreurs levées (1) a atteint le maximum autorisé (1); entraînant un échec. Cela se produit lorsque le nombre d'erreurs atteint le nombre spécifié dans MaximumErrorCount. Modifiez le MaximumErrorCount ou corrigez les erreurs. {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, Code d'avertissement SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. La méthode d'exécution a réussi, mais le nombre d'erreurs levées (1) a atteint le maximum autorisé (1); entraînant un échec. Cela se produit lorsque le nombre d'erreurs atteint le nombre spécifié dans MaximumErrorCount. Modifiez le MaximumErrorCount ou corrigez les erreurs.

OnPostExecute, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7: 5/7 / 2014 10:08:46, 0,0x, (null) DiagnosticEx, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-552222 , 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 l'exécution du package.

irmorteza
la source
Vous devez fournir plus de données sur la façon de configurer le processus de copie de la base de données. Peut-être que vous copiez DB sur lui-même au niveau du fichier.
Vesper
j'utilise un utilisateur sa dans l'assistant. et Méthode: "Utiliser la méthode SQL Management Object". et je suis sûr nommé nouveau nom DN. J'ai fait ces étapes avec une base de données de test et cela fonctionne très bien !!!!!.
Restaurer avec un nouveau nom, pas trop travaillé. !!!!!!!!! il jette l'erreur de oldDB en cours d'utilisation. j'ai arrêté l'application et redémarré SQLServer aussi, mais n'a pas fonctionné
2
Vous devez vous assurer que lorsque vous restaurez, vous modifiez le nom du fichier physique ainsi que le nom logique, sinon vous essayez de restaurer par-dessus les fichiers DB existants qui seront utilisés.
Steve Pettifer
Dans l'assistant de restauration après avoir donné un nouveau nom. Le nom logique et physique n'est pas changé automatiquement. et je peux juste changer le nom physique pas logique

Réponses:

7

Il peut être plus simple de simplement sauvegarder la base de données dans un .bak, puis de créer une nouvelle base de données à partir d'une restauration .bak.

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

Vérifiez ensuite les noms logiques et les emplacements des fichiers actuels dans le .bak:

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

Et enfin restaurer la base de données, renommer les fichiers pour vous assurer de ne pas écraser votre base de données existante

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
la source
Pas si vous essayez de copier sur une version de serveur inférieure.
watbywbarif
@watbywbarif La question était:in the same SqlServer
Réagit le
3

Voici le script que j'ai écrit pour moi-même pour faire une copie de la base de données. Son flexible et peut être converti en une procédure stockée.

Les commentaires expliqueront ce qu'il fait.

Testez-le sur un serveur de test avant de l'exécuter dans 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
la source
2

J'ai eu le même problème. J'ai changé le compte d'ouverture de session du service SQL Server Agent en administrateur. Après ça, tout va bien. Je pense que le service d'agent n'a pas pu lire / écrire.

Oğuzhan Kahyaoğlu
la source
C'est la solution la plus simple parmi les réponses ici. Je ne soupçonnerai jamais le compte d'ouverture de session de provoquer le problème.
Lester Nubla
2

J'ai eu des problèmes avec ça. Finalement, j'ai décidé de faire deux choses:

  1. Créez un partage de fichiers appelé «DTS Packages». En effet, je n'ai pas pu sélectionner de destination de package dans l'assistant. Assurez-vous que les autorisations de partage et d'ACL sont complètes pour le compte sous lequel votre agent SQL Server s'exécute (la valeur par défaut est «NT Service \ SQLSERVERAGENT»).

entrez la description de l'image ici

  1. Ajoutez également des autorisations complètes au compte de l'Agent SQL Server dans le dossier de destination dans lequel la nouvelle base de données doit également être créée.

J'ai également changé la journalisation pour me connecter à un fichier afin qu'il soit plus facile de diagnostiquer ce qui s'est mal passé.

NER1808
la source