5

一部のデータが削除されたライブ データベースがあり、そのデータを元に戻す必要があります。そのデータベースのごく最近のコピーがあり、別のマシンで既に復元されています。バックアップ以降、関係のない変更がライブ データベースに加えられているため、フル リストアでライブ データベースを消去したくありません。

私が必要とするデータは小さいです-わずか12行-しかし、それらの12行にはそれぞれ、外部キーを持つ他のテーブルからの数行があり、それらの数行には、外部キーがそれらを指している行がいくつあるかを神が知っているので、手で復元するのは複雑です。

理想的には、データベースのバックアップ コピーに、必要な数十行を選択するように指示し、それらが依存するすべてのものとそれらに依存するすべてのものを推移的に閉じ、そのデータだけをエクスポートできるようにすることができます。他に何も触れずにライブデータベースにインポートします。

ここで取るべき最善のアプローチは何ですか?ありがとう。

誰もが sp_generate_inserts について言及しています。これを使用する場合、ID 列がすべてを台無しにしないようにするにはどうすればよいでしょうか? IDENTITY INSERTをオンにするだけですか?

4

3 に答える 3

1

手で復元する必要があります。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の方が優れています。これらの ID 値に注意してください。幸運を祈ります (私は以前にこの問題に遭遇したことがありますが、あなたが今どこにいるのかを知っています)。

便利なクエリ:

--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())
            )
于 2009-05-29T15:29:07.137 に答える
1

以前にも同様の状況に遭遇したことがありますが、手動で行うのが最も効果的であることがわかりました。

2 番目のサーバーにバックアップを復元し、クエリを実行して必要な情報を取得しました。次に、データsp_generate_insertsを挿入するスクリプトを作成し、リレーショナル行を含むテーブルごとに繰り返しました。

合計で、他の 2 つのテーブルにリレーショナル データを含む約 10 のマスター レコードしかありませんでした。すべてを元に戻すのに約1時間かかりました。

更新sp_generate_inserts に関する質問に答えるには、@owner='dbo' を指定している限り、ID 挿入をオンに設定し、スクリプトの最後でオフに設定します。

于 2009-05-29T15:19:56.843 に答える
0

SQLServer2008用のSQLServerManagement Studioを使用すると、テーブルデータを挿入ステートメントとしてエクスポートできます。http://www.kodyaz.com/articles/sql-server-script-data-with-generate-script-wizard.aspxを参照してください。このアプローチには、sp_generate_insertsの柔軟性の一部が欠けています(たとえば、テーブル内の行をフィルタリングするためにWHERE句を指定することはできません)が、製品の一部であるため、より信頼性が高い可能性があります。

于 2010-05-29T18:46:49.787 に答える