SQL Server 2012 복사본 데이터베이스가 실패했습니다


10

동일한 SqlServer에 데이터베이스 복사본을 만들고 싶습니다. 따라서 데이터베이스 복사 마법사를 사용하면 오류가 발생합니다 (테스트 DB 로이 단계를 수행했으며 제대로 작동합니다 !!!!)

구성 :

sa 사용자

방법 : "SQL Management Object 방법 사용"

대상 데이터베이스의 새 이름을 선택하십시오.

오류:

TITLE : 데이터베이스 복사 마법사

작업이 실패했습니다. 자세한 내용은 대상 서버의 이벤트 로그를 확인하십시오.

------------------------------ 버튼 :

확인

이벤트 로그에서 :

  • 체계

    • 공급자

    [이름] SQLSERVERAGENT

    • EventID 208

    [한정자] 16384 레벨 3 작업 3 키워드 0x80000000000000

    • TimeCreated

    [SystemTime] 2014-05-07T06 : 23 : 11.000000000Z EventRecordID 123672 채널 응용 프로그램 컴퓨터 서버 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 개체 작업, {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, 1 개의 데이터베이스에 대한 데이터베이스 전송이 실패했습니다. OnProgress, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer 개체 작업, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5 / 7 / 2014 10:08:46 AM, 5 / 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-5522651E0C7A}, 5 / 7 / 2014 10:08:46 오전, 5 / 7 / 2014 10:08:46 AM, 0,0x, (null) OnPostExecute, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer 개체 작업, {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, (널) OnWarning, 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, -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, -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, -2147381246 , 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-5522651E0C7A}, 5 / 7 / 2014 10:08:46 오전, 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-45FB-8936-5522651E0C7A} , 5 / 7 / 2014 10:08:46 AM, 5 / 7 / 2014 10:08:46 AM, 0,0x, 104546304 패키지 엔드, 서버 1, 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, 패키지 실행 종료


데이터베이스 복사 프로세스를 구성하는 방법에 대한 추가 데이터를 제공해야합니다. 파일 수준에서 DB 자체를 복사하고있을 수 있습니다.
Vesper

마법사에서 sa 사용자를 사용합니다. 및 방법 : "SQL Management Object 방법 사용" 그리고 나는 확실히 새로운 DN 이름을 지었다. 테스트 DB 로이 단계를 수행했으며 정상적으로 작동합니다 !!!!!.

새로운 이름으로 복원해도 효과가 없습니다. !!!!!!!!! 사용중인 oldDB의 오류가 발생합니다. 응용 프로그램을

2
복원 할 때 실제 파일 이름과 논리 이름을 변경해야합니다. 그렇지 않으면 사용중인 기존 DB 파일의 맨 위에 복원하려고합니다.
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
Reaces

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 Server 에이전트 서비스 로그온 계정을 관리자로 변경했습니다. 그 후 모든 것이 정상입니다. 에이전트 서비스를 읽거나 쓸 수 없습니다.


이것은 답변 중 가장 쉬운 솔루션입니다. 로그온 계정으로 인해 문제가 발생했다고 의심하지 않습니다.
레스터 누 블라

2

나는 이것에 문제가 있었다. 결국 나는 두 가지 일을하기로 결정했습니다.

  1. 'DTS 패키지'라는 파일 공유를 만듭니다. 마법사에서 패키지 대상을 선택할 수 없었기 때문입니다. SQL Server 에이전트가 실행중인 계정에 대한 공유 및 ACL 권한이 가득 찼는 지 확인하십시오 (기본값은 'NT Service \ SQLSERVERAGENT').

여기에 이미지 설명을 입력하십시오

  1. 새 데이터베이스를 만들 대상 폴더에 SQL Server 에이전트 계정에 대한 모든 권한을 추가하십시오.

또한 파일에 기록하도록 로깅을 변경하여 무엇이 잘못되었는지 진단하기가 더 쉬워졌습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.