Ошибка копирования базы данных SQL Server 2012

10

Я хочу сделать копию базы данных в том же SqlServer. Итак, когда я использую Copy Database Wizard, он выдает ошибку: (Я сделал это с тестовой БД, и она отлично работает !!!!)

конфигурации:

пользователь sa

Метод: «Используйте метод объекта управления SQL»

Выберите новое имя для базы данных назначения.

ошибка:

НАЗВАНИЕ: Мастер копирования базы данных

Работа не удалась. Проверьте подробности в журнале событий на конечном сервере.

------------------------------ КНОПКИ:

ОК

в журнале событий:

  • система

    • поставщик

    [Имя] SQLSERVERAGENT

    • EventID 208

    [Квалификаторы] 16384 Уровень 3 Задача 3 Ключевые слова 0x80000000000000

    • TimeCreated

    [SystemTime] 2014-05-07T06: 23: 11.000000000Z EventRecordID 123672 Канальное приложение Компьютер Server1 Безопасность

  • EventData

    CDW_Server1_Server1_3 0x666DE807F406D7438C65B09171211D7B
    Failed 2014-05-07 10:52:50 Задание не выполнено. Задание было вызвано пользователем sa. Последним шагом, который нужно было выполнить, был шаг 1 (CDW_Server1_Server1_3_Step).

последние строки файла журнала:

OnProgress, Сервер1, Служба NT \ SQLSERVERAGENT, Задача объектов Server1_Server1_Transfer, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5:46 2014 / 7/2014 10:08:46, 0,0x, Передача базы данных не удалась для 1 базы данных. OnProgress, Сервер1, Служба NT \ SQLSERVERAGENT, Задача объектов Server1_Server1_Transfer, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5:46 2014 / 7/2014 10:08:46, 100,0x, Передача объектов завершена. OnTaskFailed, Сервер1, Служба NT \ SQLSERVERAGENT, Задача объектов Server1_Server1_Transfer, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A 10, 5/7 2014, 5: 7/7 2014, 5/7/2014 10, 7/7 2014, 5/7/2014) 5 / 7/2014 10:08:46 AM, 0,0x, (null) OnPostExecute, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Objects Задача, {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, Сервер1, Служба NT \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-4646A 10) 10B1 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, 5/7/2014 10:08:46, -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, 5/7/2014 10:08:46, -2147381246 , 0x, код предупреждения службы SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Метод Выполнение завершился успешно, но количество возникших ошибок (1) достигло максимально допустимого значения (1); приводя к провалу. Это происходит, когда количество ошибок достигает числа, указанного в MaximumErrorCount. Измените MaximumErrorCount или исправьте ошибки.

OnPostExecute, Сервер1, Служба NT \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F747-45FB-8936-5522651:07, 746/746/7} 7A / 2014 10:08:46, 0,0x, (ноль) DiagnosticEx, Сервер1, Служба NT \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-F736E55F765-55F765-55B775-55F765-55F765-55F745-55F765-55F765-55F765-55F5 , 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, 5/7/2014 10:08:46, 1,0x, Конец выполнения пакета.

irmorteza
источник
Вы должны предоставить больше данных о том, как вы настраиваете процесс копирования базы данных. Может быть, вы копируете БД поверх себя на уровне файлов.
Вечерня
Я использую пользователя SA в мастере. и метод: «Использовать метод объекта управления SQL». и я уверен, назвал новое имя DN. Я сделал эти шаги с тестовой БД, и она отлично работает !!!!!.
Восстановление с новым именем, тоже не сработало. !!!!!!!!! это выдает ошибку oldDB в использовании. я остановил приложение и перезапустил SQLServer тоже, но не работал
2
Вы должны убедиться, что при восстановлении вы изменяете физическое имя файла, а также логическое имя, в противном случае вы пытаетесь восстановить поверх существующих файлов БД, которые будут использоваться.
Стив Петтифер
В мастере восстановления после ввода нового имени. Логическое и физическое имя не изменяется автоматически. и я просто могу изменить физическое имя не логично

Ответы:

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
Reaces
источник
Нет, если вы пытаетесь скопировать на более низкую версию сервера.
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 Packages». Это было потому, что я не смог выбрать пункт назначения пакета в мастере. Убедитесь, что разрешения для общего ресурса и ACL заполнены для учетной записи, под которой работает агент SQL Server (по умолчанию «NT Service \ SQLSERVERAGENT»).

введите описание изображения здесь

  1. Добавьте полные права доступа к учетной записи агента SQL Server в папку назначения, где также будет создана новая база данных.

Я также изменил ведение журнала, чтобы записать в файл, чтобы было легче диагностировать, что пошло не так.

NER1808
источник