2009-05-29 8 views
5

Ich habe eine Live-Datenbank, die einige Daten gelöscht hatte und ich brauche diese Daten zurück. Ich habe eine sehr aktuelle Kopie dieser Datenbank, die bereits auf einem anderen Computer wiederhergestellt wurde. Unveränderte Änderungen wurden seit der Sicherung an der Live-Datenbank vorgenommen, daher möchte ich die Live-Datenbank nicht mit einer vollständigen Wiederherstellung löschen. Die Daten, die ich brauche, sind klein - nur ein Dutzend Zeilen - aber diese Dutzend Zeilen haben jeweils ein paar Zeilen von anderen Tabellen mit Fremdschlüsseln, und diese paar Zeilen haben weiß wie viele Zeilen mit fremden Schlüsseln darauf zeigen , so wäre es schwierig, von Hand wiederherzustellen.Wie kann ich einen kleinen Teil der Daten aus einer SQL Server-Datenbanksicherung retten?

Idealerweise würde ich in der Lage sein, die Sicherungskopie der Datenbank anzugeben, um die Dutzend Zeilen, die ich brauche, und die transitive Schließung von allem, von dem sie abhängen, und allem, was von ihnen abhängt, zu exportieren und nur diese Daten zu exportieren. die ich dann in die Live-Datenbank importieren kann, ohne etwas anderes zu berühren.

Was ist der beste Ansatz hier zu nehmen? Vielen Dank.

Jeder hat sp_generate_inserts erwähnt. Wie verhindern Sie bei der Verwendung, dass Identity-Spalten alles durcheinander bringen? Schalten Sie IDENTITY INSERT einfach ein?

+0

+1, viel Glück! –

Antwort

1

Ich bin schon mal in ähnliche Situationen geraten, habe aber festgestellt, dass es für mich am besten funktioniert, es von Hand zu erledigen.

Ich habe die Sicherung auf einem zweiten Server wiederhergestellt und meine Abfrage ausgeführt, um die benötigten Informationen zu erhalten. Ich habe dann ein Skript zum Einfügen der Daten sp_generate_inserts erstellt und dann für jede meiner Tabellen mit relationalen Zeilen wiederholt.

Insgesamt hatte ich nur etwa 10 Stammdatensätze mit relationalen Daten in 2 anderen Tabellen. Es dauerte nur etwa eine Stunde, um alles wieder so zu bekommen, wie es war.

UPDATE Ihre Frage zu sp_generate_inserts beantworten, solange Sie @ owner = ‚dbo‘ angeben, es Identität einfügen auf ON gesetzt wird, und dann setzen sie am Ende des Skripts aus für Sie.

+0

Ich war erfolgreich. sp_generate_inserts ist hilfreich, schlägt aber bei Tabellen mit vielen Spalten und Tabellen mit nvarchar-Spalten fehl (wie es heißt). Und Sie sind auf 128 Zeichen für Ihre WHERE-Klausel beschränkt. Daher musste ich für jeden Tisch mindestens eine Sache manuell erledigen. –

1

müssen Sie von Hand wiederherstellen. Die sp_generate_inserts ist gut für neue Daten. aber aktualisieren Daten muss ich es so:

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 

Sie Einsätzen auf diese Weise erstellen könnte, aber sp_generate_inserts ist besser. Beobachten Sie diese Identitätswerte und viel Glück (Ich hatte dieses Problem schon vorher und weiß, wo Sie gerade sind).

nützliche Anfragen:

--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()) 
      ) 
0

SQL Server Management Studio for SQL Server 2008 ermöglicht es Ihnen, Tabellendaten als Insert-Anweisungen zu exportieren. Siehe http://www.kodyaz.com/articles/sql-server-script-data-with-generate-script-wizard.aspx. Diesem Ansatz fehlt die Flexibilität von sp_generate_inserts (Sie können z. B. keine WHERE-Klausel angeben, um die Zeilen in Ihrer Tabelle zu filtern), aber sie ist möglicherweise zuverlässiger, da sie Teil des Produkts ist.