SQL Server 2012 kopyalama veritabanı başarısız oldu


10

Aynı SqlServer veritabanının bir kopyasını yapmak istiyorum. yani, Veritabanı Kopyalama Sihirbazı'nı kullanırken, hata atmak: (Ben bir test DB ile bu adımları yaptım ve iyi çalışıyor !!!!)

yapılandırma:

sa kullanıcı

Yöntem: "SQL Yönetim Nesnesi yöntemini kullan"

Hedef veritabanı için yeni bir isim seçin.

hata:

TITLE: Veritabanı Kopyalama Sihirbazı

İş başarısız oldu. Ayrıntılar için hedef sunucudaki olay günlüğüne bakın.

------------------------------ DÜĞMELER:

tamam

olay günlüğünde:

  • sistem

    • Sağlayıcı

    [Ad] SQLSERVERAGENT

    • EventID 208

    [Elemeler] 16384 Seviye 3 Görev 3 Anahtar Kelimeler 0x80000000000000

    • TimeCreated

    [SystemTime] 2014-05-07T06: 23: 11.000000000Z EventRecordID 123672 Kanal Uygulaması Bilgisayar Sunucusu1 Güvenlik

  • EventData

    CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B
    Başarısız 2014-05-07 10:52:50 İş başarısız oldu. İş Kullanıcı sa tarafından çağrıldı. Çalıştırmak için son adım adım 1'dir (CDW_Server1_Server1_3_Step).

günlük dosyasının son satırları:

OnProgress, Sunucu1, NT Hizmeti \ SQLSERVERAGENT, Sunucu1_Sunucu1_Transfer Nesneleri Görevi, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 / 7/2014 10:08:46, 0,0x, 1 veritabanı için veritabanı aktarımı başarısız oldu. OnProgress, Sunucu1, NT Hizmeti \ SQLSERVERAGENT, Sunucu1_Sunucu1_Transfer Nesneleri Görevi, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 / 7/2014 10:08:46, 100,0x, Aktarım nesneleri yürütme tamamlandı. OnTaskFailed, Sunucu1, NT Hizmeti \ SQLSERVERAGENT, Sunucu1_Sunucu1_Transfer Nesneleri Görevi, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5:10 / 5:10 / 7/2014 10:08:46, 0,0x, (null) OnPostExecute, Sunucu1, NT Hizmeti \ SQLSERVERAGENT, Sunucu1_Sunucusu1_Transfer Nesneleri Görevi, {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, (null) OnWarning, Sunucu1, NT Hizmeti \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7 / 5:7 / 10:7 AM, 5/7/2014 10:08:46, -2147381246,0x, SSIS Uyarı Kodu DTS_W_MAXIMUMERRORCOUNTREACHED. Yürütme yöntemi başarılı oldu, ancak ortaya çıkan hata sayısı (1) izin verilen maksimum sayıya (1) ulaştı; başarısızlıkla sonuçlanır. Bu hata sayısı MaximumErrorCount içinde belirtilen sayıya ulaştığında oluşur. MaximumErrorCount'u değiştirin veya hataları düzeltin. {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, SSIS Uyarı Kodu DTS_W_MAXIMUMERRORCOUNTREACHED. Yürütme yöntemi başarılı oldu, ancak ortaya çıkan hata sayısı (1) izin verilen maksimum sayıya (1) ulaştı; başarısızlıkla sonuçlanır. Bu hata sayısı MaximumErrorCount içinde belirtilen sayıya ulaştığında oluşur. MaximumErrorCount'u değiştirin veya hataları düzeltin. {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, SSIS Uyarı Kodu DTS_W_MAXIMUMERRORCOUNTREACHED. Yürütme yöntemi başarılı oldu, ancak ortaya çıkan hata sayısı (1) izin verilen maksimum sayıya (1) ulaştı; başarısızlıkla sonuçlanır. Bu hata sayısı MaximumErrorCount içinde belirtilen sayıya ulaştığında oluşur. MaximumErrorCount'u değiştirin veya hataları düzeltin.

OnPostExecute, Sunucu1, NT Hizmeti \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7, 2014 / 5:10 / 2014 10:08:46, 0,0x, (boş) TanılamaEx, Sunucu1, NT Hizmeti \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-890-7C7E7} , 5/7/2014 10:08:46, 5/7/2014 10:08:46, 0,0x, 104546304 PackageEnd, Sunucu1, NT Hizmeti \ 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, Paket yürütme sonu.


Veritabanı kopyalama işlemini nasıl yapılandıracağınız hakkında daha fazla veri sağlamalısınız. Belki DB'yi dosya düzeyinde kendiniz kopyalıyorsunuzdur.
Vesper

sihirbazda sa kullanıcısı kullanıyorum. ve Yöntem: "SQL Yönetim Nesnesi yöntemini kullan". ve eminim yeni DN ismi. Bir test DB ile bu adımları yaptım ve iyi çalışıyor !!!!!.

Yeni adla geri yükleyin, çok işe yaramadı. !!!!!!!!! kullanımda oldDB hatası atıyor. uygulamayı

2
Geri yüklerken mantıksal adın yanı sıra fiziksel dosya adını da değiştirdiğinizden emin olmalısınız, aksi takdirde kullanımda olan mevcut DB dosyalarının üstünde geri yüklemeye çalışırsınız.
Steve Pettifer

Yeni ad verdikten sonra geri yükleme sihirbazında. Mantıksal ve fiziksel ad otomatik olarak değiştirilmez. ve sadece mantıksal olmayan fiziksel adı değiştirebilir

Yanıtlar:


7

Veritabanını bir .bak dosyasına yedeklemek ve .bak geri yüklemesinden yeni bir veritabanı oluşturmak daha kolay olabilir.

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

Ardından .bak dosyasındaki geçerli dosyaların mantıksal adlarını ve konumlarını kontrol edin:

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

Ve son olarak veritabanını geri yükleyin, mevcut veritabanınızın üzerine yazmadığınızdan emin olmak için dosyaları yeniden adlandırın

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

Daha düşük sunucu sürümüne kopyalamaya çalışıyorsanız değil.
watbywbarif

@watbywbarif Soru şuydu:in the same SqlServer
17:13

3

Aşağıda, veritabanının kopyasını kendim için yazdığım komut dosyası verilmiştir. Esnek ve depolanmış bir prosedüre dönüştürülebilir.

Yorumlar ne yaptığını açıklayacak.

PROD'de çalıştırmadan önce bir Test sunucusunda test edin !!

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

Aynı sorunu yaşadım. SQL Server Agent hizmeti oturum açma hesabını bir yöneticiye değiştirdim. Ondan sonra her şey yolunda. Bence, Ajan hizmeti okuma / yazma yapamadı.


Buradaki cevaplar arasında en kolay çözüm budur. Oturum açma hesabının soruna neden olduğundan asla şüphelenmeyeceğim.
Lester Nubla

2

Bununla ilgili sorunlarım vardı. Sonunda iki şey yapmaya karar verdim:

  1. 'DTS Paketleri' adlı bir dosya paylaşımı oluşturun. Çünkü sihirbazda bir paket hedef seçemedim. SQL Server Agent'ınızın altında çalıştığı hesap için paylaşım ve ACL izinlerinin dolu olduğundan emin olun (varsayılan 'NT Service \ SQLSERVERAGENT').

resim açıklamasını buraya girin

  1. SQL Server Agent hesabına, yeni veritabanının da oluşturulacağı hedef klasöre tam izinler ekleyin.

Ayrıca, bir dosyaya oturum açmak için günlüğe kaydetmeyi değiştirdim, böylece neyin yanlış gittiğini teşhis etmek daha kolaydı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.