Как восстановить небольшую часть данных из резервной копии базы данных SQL Server?

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

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

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

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

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


person Greg Smalter    schedule 29.05.2009    source источник


Ответы (3)


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

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

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

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

person Eppz    schedule 29.05.2009
comment
Я был успешным. Процедура sp_generate_inserts полезна, но она не работает (как заявлено) в таблицах с большим количеством столбцов и таблицах со столбцами nvarchar. И вы ограничены 128 символами для вашего предложения WHERE. В результате мне пришлось делать по крайней мере одну вещь вручную для каждой таблицы. - person Greg Smalter; 30.05.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())
            )
person KM.    schedule 29.05.2009

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 для фильтрации строк в таблице), но он может быть более надежным, поскольку он является частью продукта.

person William Gross    schedule 29.05.2010