Database salin SQL Server 2012 gagal

10

Saya ingin membuat salinan database di SqlServer yang sama. jadi, Ketika saya menggunakan Copy Database Wizard, ia melempar kesalahan: (Saya melakukan langkah-langkah ini dengan tes DB dan berfungsi dengan baik !!!!)

konfigurasi:

sa pengguna

Metode: "Gunakan metode Obyek Manajemen SQL"

Pilih nama baru untuk basis data tujuan.

kesalahan:

TITLE: Salin Database Wizard

Pekerjaan gagal. Periksa log peristiwa di server tujuan untuk detailnya.

------------------------------ TOMBOL:

baik

dalam log peristiwa:

  • Sistem

    • Pemberi

    [Nama] SQLSERVERAGENT

    • EventID 208

    [Kualifikasi] 16384 Level 3 Tugas 3 Kata kunci 0x80000000000000

    • TimeCreated

    [SystemTime] 2014-05-07T06: 23: 11.000000000Z EventRecordID 123672 Aplikasi Kanal Komputer Server1 Keamanan

  • EventData

    CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B
    Gagal 2014-05-07 10:52:50 Pekerjaan gagal. Pekerjaan itu dipanggil oleh Pengguna sa. Langkah terakhir yang harus dijalankan adalah langkah 1 (CDW_Server1_Server1_3_Step).

baris terakhir file log:

OnProgress, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A, 7/10, 5/5 / 7/2014 10:08:46 AM, 0,0x, Transfer basis data gagal untuk 1 basis data. OnProgress, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A, 7/10, 5/5 / 7/2014 10:08:46 AM, 100,0x, Transfer objek selesai dieksekusi. OnTaskFailed, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E7, 077 / 07.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 10:08:46 AM, 5/7/2014 10:08:46 pagi, 0, 0, 0x, (null) OnWarning, Server1, Layanan NT \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-457-F747-45FB-897-657657657 AM, 5/7/2014 10:08:46, -2147381246,0x, SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED. Metode Eksekusi berhasil, tetapi jumlah kesalahan yang muncul (1) mencapai maksimum yang diizinkan (1); mengakibatkan kegagalan. Ini terjadi ketika jumlah kesalahan mencapai jumlah yang ditentukan dalam MaximumErrorCount. Ubah MaximumErrorCount atau perbaiki kesalahan. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46, -7 / 2014 10:08:46, -2147381246 , 0x, Kode Peringatan SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Metode Eksekusi berhasil, tetapi jumlah kesalahan yang muncul (1) mencapai maksimum yang diizinkan (1); mengakibatkan kegagalan. Ini terjadi ketika jumlah kesalahan mencapai jumlah yang ditentukan dalam MaximumErrorCount. Ubah MaximumErrorCount atau perbaiki kesalahan. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46, -7 / 2014 10:08:46, -2147381246 , 0x, Kode Peringatan SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Metode Eksekusi berhasil, tetapi jumlah kesalahan yang muncul (1) mencapai maksimum yang diizinkan (1); mengakibatkan kegagalan. Ini terjadi ketika jumlah kesalahan mencapai jumlah yang ditentukan dalam MaximumErrorCount. Ubah MaximumErrorCount atau perbaiki kesalahan.

OnPostExecute, Server1, Layanan NT \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936 / 7,07 / 10 07657 / 2014 10:08:46 AM, 0,0x, (null) DiagnosticEx, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-657-47 , 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-8DD-49A6-A6BA- AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM, 1.0x, Akhir dari eksekusi paket.

irmorteza
sumber
Anda harus memberikan lebih banyak data tentang bagaimana Anda mengkonfigurasi proses basis data salinan. Mungkin Anda menyalin DB sendiri di tingkat file.
Vesper
saya menggunakan sa pengguna dalam penyihir. dan Metode: "Gunakan metode Objek Manajemen SQL". dan saya yakin bernama nama DN baru. Saya melakukan langkah-langkah ini dengan tes DB dan berfungsi dengan baik !!!!!
Pulihkan dengan nama baru, tidak berfungsi juga. !!!!!!!!! itu membuang kesalahan oldDB digunakan. saya menghentikan aplikasi dan me-restart SQLServer juga, tetapi tidak berhasil
2
Anda harus memastikan bahwa ketika Anda memulihkan Anda mengubah nama file fisik serta nama logis jika tidak Anda mencoba untuk memulihkan dari atas file DB yang ada yang akan digunakan.
Steve Pettifer
Di restore wizard setelah memberi nama baru. Nama logis dan fisik tidak berubah secara otomatis. dan saya hanya dapat mengubah nama fisik tidak logis

Jawaban:

7

Mungkin lebih mudah untuk hanya membuat cadangan database ke .bak dan kemudian membuat database baru dari .bak mengembalikan.

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

Kemudian periksa nama dan lokasi logis untuk file saat ini di .bak:

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

Dan akhirnya mengembalikan database, mengganti nama file untuk memastikan Anda tidak menimpa database yang ada

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
sumber
Tidak jika Anda mencoba menyalin pada versi server yang lebih rendah.
watbywbarif
@watbywbarif Pertanyaannya adalah:in the same SqlServer
Reaces
3

Di bawah ini adalah skrip yang saya tulis sendiri untuk membuat salinan database. Ini fleksibel dan dapat diubah menjadi prosedur tersimpan.

Komentar akan menjelaskan apa fungsinya.

Uji di server Uji sebelum menjalankannya di 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
sumber
2

Saya memiliki masalah yang sama. Saya mengubah akun log masuk layanan SQL Server Agent ke administrator. Setelah itu, semuanya baik-baik saja. Saya pikir, layanan Agen tidak dapat membaca / menulis.

Oğuzhan Kahyaoğlu
sumber
Ini adalah solusi termudah di antara jawaban di sini. Saya tidak akan pernah mencurigai akun masuk yang menyebabkan masalah.
Lester Nubla
2

Saya punya masalah dengan ini. Akhirnya saya memutuskan untuk melakukan dua hal:

  1. Buat pembagian file yang disebut 'Paket DTS'. Ini karena saya tidak dapat memilih tujuan paket di wisaya. Pastikan izin share dan ACL penuh untuk akun yang menjalankan SQL Server Agent Anda (standarnya adalah 'NT Service \ SQLSERVERAGENT').

masukkan deskripsi gambar di sini

  1. Tambahkan izin penuh ke akun SQL Server Agent ke folder tujuan tempat database baru akan dibuat juga.

Saya juga mengubah logging untuk login ke file sehingga lebih mudah untuk mendiagnosis apa yang salah.

NER1808
sumber