SQL Server 2012コピーデータベースが失敗しました


10

同じSqlServerにデータベースのコピーを作成したい。そのため、データベースコピーウィザードを使用すると、エラーがスローされます。

設定:

saユーザー

メソッド:「SQL管理オブジェクトメソッドを使用する」

宛先データベースの新しい名前を選択しました。

エラー:

TITLE:データベースコピーウィザード

ジョブは失敗しました。詳細については、移行先サーバーのイベントログを確認してください。

------------------------------ボタン:

OK

イベントログ:

  • システム

    • プロバイダー

    [名前] SQLSERVERAGENT

    • イベントID 208

    [修飾子] 16384レベル3タスク3キーワード0x80000000000000

    • TimeCreated

    [SystemTime] 2014-05-07T06:23:11.000000000Z EventRecordID 123672 Channel Application Computer Server1 Security

  • EventData

    CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B
    Failed 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-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 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、100,0x、Transferオブジェクトの実行が完了しました。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 AM、5 / 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、0、 0x、(null)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。Executionメソッドは成功しましたが、発生したエラーの数(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。Executionメソッドは成功しましたが、発生したエラーの数(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。Executionメソッドは成功しましたが、発生したエラーの数(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 AM、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 PackageEnd、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、パッケージ実行の終了。


データベースコピープロセスの構成方法に関する追加のデータを提供する必要があります。多分あなたはファイルレベルでそれ自身の上にDBをコピーしています。
Vesper、2014年

ウィザードでsaユーザーを使用します。およびメソッド:「SQL管理オブジェクトメソッドを使用する」。そして、確かに新しいDN名を付けました。私はテストDBでこの手順を実行しましたが、正常に動作します!!!!!。

あまり機能しなかった新しい名前で復元します。!!!!!!!!! 使用中のoldDBのエラーをスローします。私はアプリケーションを

2
復元するときは、物理ファイル名と論理名を変更する必要があります。そうしないと、使用中の既存のDBファイルの上から復元しようとすることになります。
スティーブペティファー2014年

新しい名前を付けた後の復元ウィザード。論理名と物理名は自動的に変更されません。そして私は論理的ではなく物理名を変更することができます

回答:


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 2017年

@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エージェントサービスのログオンアカウントを管理者に変更しました。その後、すべてが大丈夫です。エージェントサービスは読み取り/書き込みができなかったと思います。


これは、ここでの回答の中で最も簡単な解決策です。この問題が原因でログオンアカウントが疑われることはありません。
Lester Nubla 2017年

2

これに問題がありました。最終的に私は2つのことを行うことにしました。

  1. 「DTSパッケージ」というファイル共有を作成します。これは、ウィザードでパッケージの宛先を選択できなかったためです。SQL Serverエージェントを実行しているアカウントの共有とACLのアクセス許可がいっぱいであることを確認します(デフォルトは 'NT Service \ SQLSERVERAGENT')。

ここに画像の説明を入力してください

  1. SQL Serverエージェントアカウントへの完全なアクセス許可を、新しいデータベースが作成される宛先フォルダーにも追加します。

また、ログをファイルに記録するように変更したので、問題の原因を簡単に診断できました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.