Восстановление базы данных Powershell SQL Server (с CDC)

Я пытаюсь создать сценарий Powershell для восстановления базы данных на моем ноутбуке с моего рабочего стола. У меня есть сценарий, который создает файлы резервных копий, и почти заработал сценарий восстановления, за исключением странной ошибки, которую я получаю с базой данных с поддержкой CDC. В итоге я получаю автономную однопользовательскую базу данных. Я должен вернуть его в сеть и вручную изменить его на многопользовательский. Вот соответствующие биты моего кода powershell...

$instance = "(local)"
$server = New-Object Microsoft.SqlServer.Management.Smo.Server $instance

$restore = New-Object Microsoft.SqlServer.Management.Smo.Restore
$restore.Action = "Database"
$restore.Database = $dbname
$restore.NoRecovery = $false
$restore.ReplaceDatabase = $true
$restore.Devices.AddDevice($filename, "File")
$restore.SqlRestore($server)

Я получаю сообщение об ошибке, говорящее...

*System.Data.SqlClient.SqlException: не удалось обновить метаданные, указывающие, что база данных xxxxx не включена для отслеживания измененных данных. Сбой произошел при выполнении команды '[sys].[sp_MScdc_ddl_database запускает 'drop''. Была возвращена ошибка 15517: «Невозможно выполнить в качестве участника базы данных, поскольку принципал «dbo» не существует, этот тип принципала не может быть олицетворен или у вас нет разрешения» *

и чуть ниже...

*База данных отключена. См. раздел MSSQL_ENG003165 в электронной документации по SQL Server*.

дальше ...

Преобразование базы данных "xxxxx" из версии 655 в текущую версию 661.
База данных "xxxxx" выполняет этап обновления с версии 655 до версии 660.
База данных "xxxxx" выполняет этап обновления с версии от 660 до 661.

Хотя я могу вернуть базу данных в пригодное для использования состояние, в идеале я бы хотел, чтобы она была полностью написана сценарием. Идея этого заключается в том, что я могу запустить сценарий резервного копирования на своем рабочем столе, а затем запустить сценарий восстановления на моем ноутбуке, который затем восстанавливает базы данных на моем ноутбуке, поэтому у меня есть рабочая копия той же базы данных, когда мне нужно работать удаленно. .

Любое понимание было бы здорово, даже лучше, если бы кто-то столкнулся и решил ту же проблему.


person Antony Scott    schedule 13.08.2012    source источник
comment
Я думаю, что это ошибка, которая была исправлена ​​в недавнем CU.   -  person usr    schedule 14.08.2012
comment
Спасибо, я не знаком с CU. что это означает и как я могу получить исправление ошибки? Я предполагаю, что U означает обновление.   -  person Antony Scott    schedule 14.08.2012
comment
Найдите накопительное обновление. Я не могу найти подходящий прямо сейчас. Если есть возможность, просто установите самую новую.   -  person usr    schedule 14.08.2012
comment
Я вижу свойство KeepReplication в классе восстановления, вы можете попробовать установить для него значение false msdn.microsoft.com/en-us/library/   -  person Chad Miller    schedule 14.08.2012
comment
Я применил CU # 14, и у меня все еще есть проблема.   -  person Antony Scott    schedule 15.08.2012


Ответы (1)


Когда мне нужно было установить явную настройку CDC в сценарии восстановления, я сделал что-то вроде:

    $script_lines = $restore.script( $server )
    $script_lines += ', keep_cdc'
    $script = ''
    foreach ($line in $script_lines) {
            $script += $line
    }

    $script
    invoke-sqlcmd -ServerInstance $server.name -Query $script -QueryTimeout 65535
person Ben Thul    schedule 14.08.2012
comment
Заработало после небольших доработок. Мне пришлось выполнить скрипт, используя базу данных master. У меня получилось так... $masterDatabase = $server.Databases | Where-Object { $_.Name -eq master } ... Затем я выполнил скрипт следующим образом ... $masterDatabase.ExecuteNonQuery ($ script) - person Antony Scott; 15.08.2012