Как спасти небольшую часть данных из резервной копии базы данных SQL Server? - PullRequest
5 голосов
/ 29 мая 2009

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

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

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

Какой лучший подход здесь? Спасибо.

Каждый упомянул sp_generate_inserts. При использовании этого, как вы препятствуете тому, чтобы столбцы Identity все испортили? Вы просто включаете IDENTITY INSERT?

Ответы [ 3 ]

1 голос
/ 29 мая 2009

вам придется восстанавливать вручную. sp_generate_inserts подходит для новых данных. но для обновления данных я делаю это так:

SELECT 'Update YourTable '
    +'SET Column1='+COALESCE(''''+CONVERT(varchar,Column1Name)+'''','NULL')
    +', Column2='+COALESCE(''''+CONVERT(varchar,Column2Name)+'''','NULL')
    +' WHERE Key='+COALESCE(''''+CONVERT(varchar,KeyColumn)+'''','NULL') FROM backupserver.databasename.owner.YourTable

вы также можете создавать вставки таким же образом, но sp_generate_inserts лучше. Следите за этими значениями идентичности и удачи (у меня была эта проблема раньше, и я знаю, где вы сейчас находитесь).

полезных запросов:

--find out if there are missing rows, and which ones
SELECT
    b.key,c.key
    from backupserver.databasename.owner.YourTable b
        LEFT OUTER JOIN YourTable                  c ON b.key=c.key
    WHERE c.Key is NULL

--find differences
SELECT
    b.key,c.key
    from YourTable                                                c 
        LEFT OUTER JOIN backupserver.databasename.owner.YourTable b ON c.key=b.key
    WHERE  b.Key is not null
        AND (   ISNULL(c.column1,-9999)     != ISNULL(b.column1,-9999)
             OR ISNULL(c.column2,'~')       != ISNULL(b.column2,'~')
             OR ISNULL(c.column2,GETDATE()) != ISNULL(b.column2,GETDATE())
            )
1 голос
/ 29 мая 2009

Я сталкивался с подобными ситуациями раньше, но обнаружил, что делать это вручную лучше всего помогло мне.

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

В общей сложности у меня было только 10 основных записей с реляционными данными в 2 других таблицах. Мне потребовалось около часа, чтобы вернуть все обратно, как было.

ОБНОВЛЕНИЕ Чтобы ответить на ваш вопрос о sp_generate_inserts, если вы укажете @ owner = 'dbo', он установит идентификационную вставку в положение ON, а затем выключит ее конец сценария для вас.

0 голосов
/ 29 мая 2010

SQL Server Management Studio для SQL Server 2008 позволяет экспортировать данные таблицы в виде операторов вставки. См. http://www.kodyaz.com/articles/sql-server-script-data-with-generate-script-wizard.aspx.. В этом подходе отсутствует некоторая гибкость sp_generate_inserts (например, вы не можете указать предложение WHERE для фильтрации строк в вашей таблице), но он может быть более надежным, поскольку он является частью продукта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...