2009-05-29 8 views
5

Ho un database attivo con alcuni dati cancellati e ho bisogno di recuperare i dati. Ho una copia molto recente di quel database che è già stato ripristinato su un'altra macchina. Le modifiche non correlate sono state apportate al database live dal backup, quindi non voglio cancellare il database live con un ripristino completo.Come si salva una piccola parte di dati da un backup del database SQL Server?

I dati che ho bisogno è piccola - solo una decina di righe - ma quei dozzina di righe hanno ciascuno un paio di righe da altre tabelle con chiavi esterne ad esso, e quelli paio di righe di avere Dio sa quante righe con chiavi esterne che punta al loro , quindi sarebbe complicato ripristinare a mano.

Idealmente sarei in grado di indicare la copia di backup del database per selezionare la dozzina di righe che mi servono, e la chiusura transitiva di tutto ciò di cui dipendono, e tutto ciò che dipende da loro, ed esportare solo quei dati, che posso quindi importare nel database live senza toccare altro.

Qual è l'approccio migliore da prendere qui? Grazie.

Tutti hanno menzionato sp_generate_inserts. Quando si utilizza questo, come si impedisce alle colonne Identity di rovinare tutto? Attiva semplicemente IDENTITY INSERT?

+0

+1, buona fortuna! –

risposta

1

Mi sono imbattuto in situazioni simili prima, ma ho scoperto che farlo a mano ha funzionato al meglio per me.

Ho ripristinato il backup su un secondo server e ha fatto la mia domanda per ottenere le informazioni di cui avevo bisogno, ho poi costruire uno script per inserire i dati sp_generate_inserts e quindi ripetuto per ciascuno dei miei tavoli che avevano le righe relazionali.

In totale avevo solo circa 10 record master con dati relazionali in 2 altre tabelle. Mi ci è voluta solo un'ora per riprendere tutto com'era.

AGGIORNAMENTO per rispondere alla tua domanda circa sp_generate_inserts, a patto che si specifica @ proprietario = 'dbo', si imposterà inserimento di identità su ON e quindi impostarlo fuori alla fine dello script per voi.

+0

Ho avuto successo. sp_generate_inserts è utile, ma fallisce (come dice che lo sarà) su tabelle con molte colonne e tabelle con colonne nvarchar. E, sei limitato a 128 caratteri per la tua clausola WHERE. Di conseguenza, ho praticamente dovuto fare almeno una cosa manualmente per ogni tavolo. –

1

dovrai eseguire il ripristino a mano. Lo sp_generate_inserts è adatto per i nuovi dati. ma per aggiornare i dati lo faccio in questo modo:

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 

si potrebbe creare inserti in questo modo anche, ma sp_generate_inserts è meglio. Guarda quei valori di identità e buona fortuna (ho già avuto questo problema e so dove sei adesso).

query utili:

--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 per SQL Server 2008 consente di esportare i dati della tabella come istruzioni INSERT. Vedi http://www.kodyaz.com/articles/sql-server-script-data-with-generate-script-wizard.aspx. Questo approccio manca della flessibilità di sp_generate_inserts (non è possibile specificare una clausola WHERE per filtrare le righe nella tabella, ad esempio) ma potrebbe essere più affidabile poiché fa parte del prodotto.