Cơ sở dữ liệu sao chép SQL Server 2012 không thành công


10

Tôi muốn tạo một bản sao của cơ sở dữ liệu trong cùng một SqlServer. Vì vậy, khi tôi sử dụng Trình hướng dẫn cơ sở dữ liệu sao chép, nó sẽ báo lỗi: (Tôi đã thực hiện các bước này với DB thử nghiệm và nó hoạt động tốt !!!!)

cấu hình:

người dùng

Phương thức: "Sử dụng phương thức Đối tượng quản lý SQL"

Chọn tên mới cho cơ sở dữ liệu đích.

lỗi:

TITLE: Sao chép cơ sở dữ liệu thuật sĩ

Công việc thất bại. Kiểm tra nhật ký sự kiện trên máy chủ đích để biết chi tiết.

------------------------------ NÚT:

đồng ý

trong nhật ký sự kiện:

  • Hệ thống

    • Các nhà cung cấp

    [Tên] SQLSERVERAGENT

    • Sự kiện 208

    [Vòng loại] 16384 Nhiệm vụ cấp 3 3 Từ khóa 0x80000000000000

    • Thời gian điều trị

    [SystemTime] 2014-05-07T06: 23: 11.000000000Z Sự kiệnRecordID 123672 Ứng dụng kênh Máy tính Server1 Bảo mật

  • Dữ liệu sự kiện

    CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B
    Không thành công 2014-05-07 10:51:50 Công việc thất bại. Công việc được gọi bởi Người dùng sa. Bước cuối cùng để chạy là bước 1 (CDW_Server1_Server1_3_Step).

dòng cuối cùng của tệp nhật ký:

OnProTHER, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Đối tượng tác vụ, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-897557 / 7/2014 10:08:46 AM, 0,0x, Chuyển cơ sở dữ liệu không thành công cho 1 cơ sở dữ liệu. OnProTHER, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Đối tượng tác vụ, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-897557 / 7/2014 10:08:46 AM, 100,0x, Chuyển đối tượng thực hiện xong. OnTaskFails, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Đối tượng tác vụ, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB / 7/2014 10:08:46 AM, 0,0x, (null) OnPostExecute, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Đối tượng tác vụ, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46 AM, 5/7/2014 0x, (null) OnWarning, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F7477 AM, 5/7/2014 10:08:46 AM, -2147381246,0x, Mã cảnh báo SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Phương thức Thi hành đã thành công, nhưng số lỗi đã nêu (1) đạt mức tối đa cho phép (1); dẫn đến thất bại. Điều này xảy ra khi số lỗi đạt đến số lượng được chỉ định trong MaximumErrorCount. Thay đổi MaximumErrorCount hoặc sửa lỗi. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46 AM, 5/7/2014 , 0x, Mã cảnh báo SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Phương thức Thi hành đã thành công, nhưng số lỗi đã nêu (1) đạt mức tối đa cho phép (1); dẫn đến thất bại. Điều này xảy ra khi số lỗi đạt đến số lượng được chỉ định trong MaximumErrorCount. Thay đổi MaximumErrorCount hoặc sửa lỗi. {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46 AM, 5/7/2014 , 0x, Mã cảnh báo SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Phương thức Thi hành đã thành công, nhưng số lỗi đã nêu (1) đạt mức tối đa cho phép (1); dẫn đến thất bại. Điều này xảy ra khi số lỗi đạt đến số lượng được chỉ định trong MaximumErrorCount. Thay đổi MaximumErrorCount hoặc sửa lỗi.

OnPostExecute, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-10 / 2014 10:08:46 AM, 0,0x, (null) Chẩn đoánEx, Server1, NT Service \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7477777777777 , 5/7/2014 10:08:46 AM, 5/7/2014 10:08:46 AM, 0,0x, 104546304 GóiEnd, 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, Kết thúc thực hiện gói.


Bạn nên cung cấp thêm dữ liệu về cách bạn định cấu hình quy trình cơ sở dữ liệu sao chép. Có lẽ bạn đang sao chép DB trên chính nó ở cấp tệp.
Vesper

tôi sử dụng sa người dùng trong thuật sĩ. và Phương thức: "Sử dụng phương thức Đối tượng quản lý SQL". và tôi chắc chắn đặt tên DN mới. Tôi đã làm các bước này với một DB thử nghiệm và nó hoạt động tốt !!!!!.

Khôi phục với tên mới, không hoạt động quá. !!!!!!!!! nó ném lỗi của oldDB khi sử dụng. tôi cũng đã dừng ứng dụng và khởi động lại SQLServer, nhưng không hoạt động

2
Bạn phải đảm bảo rằng khi khôi phục, bạn thay đổi tên tệp vật lý cũng như tên logic nếu không bạn đang cố gắng khôi phục trên đầu các tệp DB hiện có sẽ được sử dụng.
Steve Pettifer

Trong trình hướng dẫn khôi phục sau khi đặt tên mới. Tên logic và vật lý không thay đổi tự động. và tôi chỉ có thể thay đổi tên vật lý không logic

Câu trả lời:


7

Có thể dễ dàng hơn chỉ cần sao lưu cơ sở dữ liệu vào .bak và sau đó tạo cơ sở dữ liệu mới từ khôi phục .bak.

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

Sau đó kiểm tra tên và vị trí hợp lý cho các tệp hiện tại trong .bak:

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

Và cuối cùng khôi phục cơ sở dữ liệu, đổi tên các tệp để đảm bảo bạn không ghi đè lên cơ sở dữ liệu hiện có của mình

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

Không, nếu bạn đang cố gắng sao chép trên phiên bản máy chủ thấp hơn.
watbywbarif

@watbywbarif Câu hỏi là:in the same SqlServer
Tái lập

3

Dưới đây là kịch bản mà tôi đã viết cho chính mình để tạo bản sao của cơ sở dữ liệu. Nó linh hoạt và có thể được chuyển đổi thành một thủ tục lưu trữ.

Các ý kiến ​​sẽ giải thích những gì nó làm.

Kiểm tra nó trên máy chủ Kiểm tra trước khi chạy nó trong SẢN PHẨM !!

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

Tôi gặp vấn đề tương tự. Tôi đã thay đổi tài khoản đăng nhập dịch vụ SQL Server Agent thành quản trị viên. Sau đó, mọi thứ đều ổn. Tôi nghĩ rằng, dịch vụ Đại lý không thể đọc / ghi.


Đây là giải pháp dễ nhất trong số các câu trả lời ở đây. Tôi sẽ không bao giờ nghi ngờ tài khoản đăng nhập gây ra vấn đề.
Lester Nubla

2

Tôi đã có vấn đề với điều này. Cuối cùng, tôi quyết định làm hai việc:

  1. Tạo một chia sẻ tệp có tên là 'Gói DTS'. Điều này là do tôi không thể chọn đích gói trong trình hướng dẫn. Đảm bảo quyền chia sẻ và quyền ACL đã đầy cho tài khoản mà Đại lý máy chủ SQL của bạn đang chạy (mặc định là 'NT Service \ SQLSERVERAGENT').

nhập mô tả hình ảnh ở đây

  1. Thêm quyền đầy đủ vào tài khoản SQL Server Agent vào thư mục đích nơi cơ sở dữ liệu mới cũng sẽ được tạo.

Tôi cũng đã thay đổi việc đăng nhập để đăng nhập vào một tập tin để dễ chẩn đoán những gì đã sai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.