Помилка бази даних копій SQL Server 2012


10

Я хочу зробити копію бази даних в тому ж SqlServer. Отже, коли я використовую майстра копіювання баз даних, він видає помилку: (я зробив ці кроки з тестовою БД, і вона працює добре !!!!)

config:

sa користувач

Метод: "Використовувати метод об'єкта управління SQL"

Вибрав нове ім'я для бази даних призначення.

помилка:

НАЗВА: Майстер копіювання баз даних

Завдання не вдалося. Перевірте журнал подій на сервері призначення для отримання детальної інформації.

------------------------------ Кнопки:

добре

у журналі подій:

  • Система

    • Постачальник

    [Ім'я] SQLSERVERAGENT

    • EventID 208

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

    • TimeCreate

    [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 Tasks Tasks, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A 5, 5/5 / 7/2014 10:08:46 AM, 0,0x, Не вдалося перенести базу даних для 1 бази даних. OnProgress, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Tasks Tasks, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A 5, 5/5 / 7/2014 10:08:46, 100,0x, Передача об’єктів завершена. OnTaskFailed, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Tasks Tasks, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651 5M7, 5657, 5 AM7 / 7/2014 10:08:46 AM, 0,0x, (null) OnPostExecute, Server1, NT Service \ SQLSERVERAGENT, Server1_Server1_Transfer Task Task, {066BD090-26F3-45D8-AD60-B207D56D44CE}, {1CF7B713-F747-45FB-8936-5522651E0C7A}, 5/7/2014 10:08:46, 5/7/2014 10:08:46, 0, 0x, (нуль) OnWarning, Сервер1, 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, -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, 5/7/2014 10:08:46, -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, 5/7/2014 10:08:46, -2147381246 , 0x, код попередження SSIS DTS_W_MAXIMUMERRORCOUNTREACHED. Метод Execution вдався, але кількість помилок (1) досягла максимально допустимого (1); що призводить до відмови. Це відбувається, коли кількість помилок досягає числа, визначеного в MaximumErrorCount. Змініть MaximumErrorCount або виправте помилки.

OnPostExecute, Сервер1, 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-сервіс \ SQLSERVERAGENT, CDW_Server1_Server1_1, {45A6144C-8DDD-49A6-A6BA-AE81E24826D5}, {1CF7B713-891457C-7175-7C-01747-7175-B7477-F747-7C-01745-7C-01747-7115-7477-7117-77-7E5-4E5-7E5-4E5-7E5-4E5-7E5-7E5-7477-77E5) , 5/7/2014 10:08:46, 5/7/2014 10:08:46, 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, Закінчення виконання пакета.


Ви повинні надати більше даних про те, як налаштувати процес копіювання бази даних. Можливо, ви копіюєте БД над собою на рівні файлів.
Веспер

я користуюсь користувачем sa у майстрі. та метод: "Використовувати метод об'єкта управління SQL". і я впевнений, що назвав нове ім'я DN. Я зробив ці кроки з тестовою БД, і вона прекрасно працює !!!!!

Відновити з новою назвою, теж не працював. !!!!!!!!! це кидає помилку старого DB у використанні. Я зупинив додаток і перезапустив 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

Ні, якщо ви намагаєтесь скопіювати на нижчу версію сервера.
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 Server на адміністратора. Після цього все гаразд. Я думаю, що Агент не зміг прочитати / написати.


Це найпростіше рішення серед відповідей тут. Я ніколи не підозрюю, що обліковий запис для входу спричинить проблему.
Лестер Нубла

2

У мене були проблеми з цим. Врешті я вирішив зробити дві речі:

  1. Створіть спільний доступ до файлів під назвою "Пакети DTS". Це було тому, що я не зміг вибрати пункт призначення у майстра. Переконайтеся, що для облікового запису, на якому працює агент SQL Server, заповнено права доступу до доступу та ACL (за замовчуванням - "NT Service \ SQLSERVERAGENT").

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

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.