ฐานข้อมูลการคัดลอก SQL Server 2012 ล้มเหลว


10

ฉันต้องการทำสำเนาของฐานข้อมูลใน SqlServer เดียวกัน ดังนั้นเมื่อฉันใช้ Copy Database Wizard จะเกิดข้อผิดพลาด: (ฉันทำตามขั้นตอนนี้ด้วยฐานข้อมูลทดสอบและใช้งานได้ดี !!!!)

การตั้งค่า:

ผู้ใช้ sa

วิธีการ: "ใช้วิธีการจัดการวัตถุ SQL"

เลือกชื่อใหม่สำหรับฐานข้อมูลปลายทาง

ข้อผิดพลาด:

TITLE: คัดลอกตัวช่วยสร้างฐานข้อมูล

งานล้มเหลว ตรวจสอบบันทึกเหตุการณ์บนเซิร์ฟเวอร์ปลายทางสำหรับรายละเอียด

------------------------------ ปุ่ม:

ตกลง

ในบันทึกเหตุการณ์:

  • ระบบ

    • ผู้ให้บริการ

    [ชื่อ] SQLSERVERAGENT

    • กิจกรรม ID 208

    [ตัวระบุคุณสมบัติ] 16384 ระดับ 3 งาน 3 คำหลัก 0x80000000000000

    • TimeCreated

    [SystemTime] 2014-05-07T06: 23: 11.000000000Z EventRecordID 123672 Channel Application คอมพิวเตอร์เซิร์ฟเวอร์ 1 ความปลอดภัย

  • EventData

    CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B
    ล้มเหลว 2014-05-07 10:52:50 งานล้มเหลว ผู้ใช้งานถูกเรียกใช้ sa ขั้นตอนสุดท้ายในการเรียกใช้คือขั้นตอนที่ 1 (CDW_Server1_Server1_3_Step)

บรรทัดสุดท้ายของไฟล์บันทึก:

OnProgress, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45F65-8936-5522651E0C7A} / 7/2014 10:08:46 AM, 0,0x, การถ่ายโอนฐานข้อมูลล้มเหลวสำหรับ 1 ฐานข้อมูล OnProgress, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45F65-8936-5522651E0C7A} / 7/2014 10:08:46 AM, 100,0x, การถ่ายโอนออบเจ็กต์เสร็จสิ้นการดำเนินการ OnTaskFailed, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E7C7A, 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 10:08:46 AM, 5/7/2014 10:08:46 AM, 5, 7 0x, (null) OnWarning, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E7 AM, 5/7/2014 10:08:46 AM, -2147381246,0x, รหัสคำเตือน SSIS DTS_W_MAXIMUMERRORCOUNTREACHED วิธีการดำเนินการสำเร็จ แต่จำนวนข้อผิดพลาดเพิ่มขึ้น (1) ถึงจำนวนสูงสุดที่อนุญาต (1) ส่งผลให้เกิดความล้มเหลว สิ่งนี้เกิดขึ้นเมื่อจำนวนข้อผิดพลาดถึงจำนวนที่ระบุใน MaximumErrorCount เปลี่ยน MaximumErrorCount หรือแก้ไขข้อผิดพลาด {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM , 0x, รหัสเตือน SSIS DTS_W_MAXIMUMERRORCOUNTREACHED วิธีการดำเนินการสำเร็จ แต่จำนวนข้อผิดพลาดเพิ่มขึ้น (1) ถึงจำนวนสูงสุดที่อนุญาต (1) ส่งผลให้เกิดความล้มเหลว สิ่งนี้เกิดขึ้นเมื่อจำนวนข้อผิดพลาดถึงจำนวนที่ระบุใน MaximumErrorCount เปลี่ยน MaximumErrorCount หรือแก้ไขข้อผิดพลาด {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM , 0x, รหัสเตือน SSIS DTS_W_MAXIMUMERRORCOUNTREACHED วิธีการดำเนินการสำเร็จ แต่จำนวนข้อผิดพลาดเพิ่มขึ้น (1) ถึงจำนวนสูงสุดที่อนุญาต (1) ส่งผลให้เกิดความล้มเหลว สิ่งนี้เกิดขึ้นเมื่อจำนวนข้อผิดพลาดถึงจำนวนที่ระบุใน MaximumErrorCount เปลี่ยน MaximumErrorCount หรือแก้ไขข้อผิดพลาด

OnPostExecute, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E7A7, 5/5: 7/5: 7 น / 2014 10:08:46 AM, 0,0x, (null) DiagnosticEx, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45B1-55722636} , 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM, 0,0x, 104546304 แพ็คเกจ End, Server1, บริการ NT \ 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, สิ้นสุดการดำเนินการบรรจุภัณฑ์


คุณควรให้ข้อมูลเพิ่มเติมเกี่ยวกับวิธีกำหนดค่ากระบวนการคัดลอกฐานข้อมูล บางทีคุณอาจจะคัดลอกฐานข้อมูลตัวเองที่ระดับไฟล์
เวสเปอร์

ฉันใช้ผู้ใช้ sa ในตัวช่วยสร้าง และวิธีการ: "ใช้วิธีการจัดการวัตถุ SQL" และฉันแน่ใจว่าชื่อ DN ใหม่ ฉันทำตามขั้นตอนนี้ด้วยฐานข้อมูลการทดสอบและใช้งานได้ดี !!!!!

กู้คืนด้วยชื่อใหม่ไม่ทำงานเกินไป !!!!!!!!! มันโยนข้อผิดพลาดของ oldDB ที่ใช้งานอยู่ ฉันหยุดแอปพลิเคชั่นและรีสตาร์ท SQLServer ด้วย แต่ไม่สามารถใช้งานได้

2
คุณต้องตรวจสอบให้แน่ใจว่าเมื่อคุณกู้คืนคุณเปลี่ยนชื่อไฟล์ทางกายภาพเช่นเดียวกับชื่อตรรกะมิฉะนั้นคุณกำลังพยายามที่จะกู้คืนที่ด้านบนของไฟล์ฐานข้อมูลที่มีอยู่ซึ่งจะใช้งาน
Steve Pettifer

ในตัวช่วยสร้างการคืนค่าหลังจากให้ชื่อใหม่ ชื่อโลจิคัลและฟิสิคัลไม่เปลี่ยนแปลงโดยอัตโนมัติ และฉันก็สามารถเปลี่ยนชื่อทางกายภาพไม่ใช่ตรรกะ

คำตอบ:


7

มันอาจจะง่ายกว่าที่จะสำรองฐานข้อมูลไปยัง. bak แล้วสร้างฐานข้อมูลใหม่จากการเรียกคืน. bak

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

จากนั้นตรวจสอบชื่อโลจิคัลและตำแหน่งสำหรับไฟล์ปัจจุบันใน. bak:

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

และในที่สุดก็คืนค่าฐานข้อมูลเปลี่ยนชื่อไฟล์เพื่อให้แน่ใจว่าคุณไม่ได้เขียนทับฐานข้อมูลที่มีอยู่

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

ไม่ใช่ถ้าคุณพยายามที่จะคัดลอกในเวอร์ชั่นเซิร์ฟเวอร์ที่ต่ำกว่า
watbywbarif

@watbywbarif คำถามคือ:in the same SqlServer
เข้ามา

3

ด้านล่างเป็นสคริปต์ที่ฉันเขียนเองเพื่อทำสำเนาของฐานข้อมูล มีความยืดหยุ่นและสามารถแปลงเป็นขั้นตอนการจัดเก็บ

ความคิดเห็นจะอธิบายสิ่งที่มันทำ

ทดสอบบนเซิร์ฟเวอร์ทดสอบก่อนใช้งานใน 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

ฉันมีปัญหาเดียวกัน ฉันเปลี่ยนบัญชีเข้าสู่ระบบบริการ บริษัท ตัวแทนของเซิร์ฟเวอร์ SQL เป็นผู้ดูแลระบบ หลังจากนั้นทุกอย่างก็โอเค ฉันคิดว่าบริการตัวแทนไม่สามารถอ่าน / เขียนได้


นี่เป็นทางออกที่ง่ายที่สุดในบรรดาคำตอบที่นี่ ฉันไม่เคยสงสัยว่าบัญชีการเข้าสู่ระบบจะทำให้เกิดปัญหา
Lester Nubla

2

ฉันมีปัญหากับสิ่งนี้ ในที่สุดฉันตัดสินใจที่จะทำสองสิ่ง:

  1. สร้างการแชร์ไฟล์ที่เรียกว่า 'DTS Packages' นี่เป็นเพราะฉันไม่สามารถเลือกแพ็คเกจปลายทางในตัวช่วยสร้างได้ ตรวจสอบให้แน่ใจว่าสิทธิ์การแชร์และ ACL เต็มสำหรับบัญชีที่ตัวแทนเซิร์ฟเวอร์ SQL ของคุณกำลังทำงานอยู่ (ค่าเริ่มต้นคือ 'NT Service \ SQLSERVERAGENT')

ป้อนคำอธิบายรูปภาพที่นี่

  1. เพิ่มสิทธิ์แบบเต็มไปยังบัญชีตัวแทนของเซิร์ฟเวอร์ SQL ไปยังโฟลเดอร์ปลายทางที่จะสร้างฐานข้อมูลใหม่ด้วย

ฉันเปลี่ยนการบันทึกเพื่อบันทึกเป็นไฟล์ด้วยดังนั้นจึงง่ายต่อการวินิจฉัยสิ่งที่ผิดพลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.