2009-06-04 17 views
5

Ho un grande file SQL che non si adatta alla memoria e deve essere eseguito su Microsoft SQL Server 2008. Sembra che lo strumento sqlcmd.exe lo carichi sempre prima in memoria, cosa impossibile in questo caso. Qualche idea?Come eseguire un file SQL da 3 GB (Microsoft SQL Server)?

Sfortunatamente, non posso dividere lo script perché è generato dall'eccellente confronto dati SQL di Red Gate. L'intero script è una grande transazione e voglio lasciarla così. Non avevo mai pensato che avere uno script gigantesco fosse insolito perché avere un sacco di dati è comune nel mondo del database. Lo script ha una dimensione di 3 GB.

+2

Il file SQL non si adatta alla memoria? Veramente??? – Rockcoder

+1

Qual è la dimensione esatta? – NinethSense

+1

Quanto è grande il file?!?!?!?!?!? – OneSHOT

risposta

1

Cosa/chi ha creato lo script SQL? Ottieni tutto ciò che ha creato il file per suddividere lo script in blocchi logici, mediante transazione o istruzione (a seconda di come è strutturato il file). Se la fonte non può fare ciò, quindi creare uno script per dividere il file logicamente.

1

Se è così grande, lo script è troppo complesso o ripetitivo. In entrambi i casi, come altri hanno suggerito, l'unica cosa sensata è scomporla in blocchi gestibili.

È un esercizio una tantum o un evento regolare?

1

Ho avuto questo problema prima in cui lo script aveva un'enorme stringa XML che veniva utilizzata con OpenXML. L'SQL reale era piuttosto minimale, aggiornando alcuni valori in una tabella.

Ho finito per inserire i dati (in blocchi) in una tabella temporanea fino a quando non sono state memorizzate tutte le informazioni contenute nell'XML. Quindi ho eseguito la mia dichiarazione di aggiornamento.

aggiunto in seguito, dopo più dati ricevuti postato:

Si consiglia di selezionare grandi blocchi nello strumento e hanno dati SQL confrontare generare gli script in pezzi. In questo modo ottieni le transazioni. Puoi selezionare sezioni grandi semplicemente evidenziando un intervallo e premendo la barra spaziatrice.

3

Il confronto SQL di RedGate ha un'opzione per eseguire direttamente le istruzioni, invece di generare uno script SQL ed eseguirlo in seguito. C'è una ragione per cui questo non funzionerebbe - in altre parole, c'è un motivo per cui hai bisogno di uno script SQL e non puoi usare la funzionalità "sincronizza ora" dell'applicazione?

+0

Questo è un buon punto (Redgate produce alcuni fantastici prodotti) ma potrebbe non avere accesso agli aggiornamenti nel suo ambiente. Questa è la posizione in cui mi trovo. Devo generare script e passarli agli amministratori di database per l'esecuzione. – wcm

+0

Touche. In tal caso, è necessario aggiornare ogni singola tabella in una singola transazione? Puoi invece interrompere l'operazione in 3-4 diversi script, ovvero eseguire lo strumento Porta rossa su solo 1/4 dei tuoi tavoli ogni volta (selezionando i tavoli in modo da bilanciare le dimensioni di ogni script)? Anche se questa non è una pura transazione per l'intero aggiornamento, ogni pezzo è una transazione, quindi i tuoi dati non saranno lasciati in uno stato "danneggiato" se uno script fallisce e potresti persino richiedere che i DBA li eseguano simultaneamente durante finestra di manutenzione, in modo che gli utenti non vedano i dati parzialmente aggiornati. – SqlRyan

+0

Si potrebbe rendere l'argomento che il DBA potrebbe eseguire per SQL Data confrontare per lui. La domanda per me è se SQL Data Compare avrà lo stesso problema. Voglio dire, non è che Redgate sta semplicemente eseguendo lo script per te nello stesso modo in cui Management Studio esegue lo script. Non sto dicendo di non provarlo.È una buona idea – wcm

0

1-800-Redgate-support .....

o

  • rottura sceneggiatura transazione in file più piccoli
  • banca dati insieme in modalità utente singolo
  • FullBackup della banca dati
  • esegue ogni file di script più piccolo; se v'è un fallimento: ripristinare il backup, correggere lo script, riprovare
  • indietro di modalità utente singolo, tutto fatto
1

mi sono imbattuto in questo problema qualche mese fa. Genero script di sincronizzazione con SQLDataCompare su base settimanale e mensile per molti dei nostri database di catalogo e sono regolarmente superiori a 500 MB. La mia soluzione stava scrivendo un VBscript che taglia lo script di aggiornamento in 50 a 1000 batch di comandi. Il problema con questo approccio sta perdendo la possibilità di ripristinare tutte le modifiche se qualcosa si rompe a metà nell'aggiornamento del database.

0

utilizzare il comando

sqlcmd

Esempio sqlcmd -S myServer \ instanceName -i C: \ MyScript.sql

0

Il modo in cui ho capito, SSMS è a 32 bit in modo che non è possibile caricare uno script su 1,5-2 GB. È possibile eseguire lo script in SQLCMD.exe, ma è possibile che si verifichino problemi a causa delle dimensioni della transazione: SqlCmd manterrà un'intera transazione in memoria. Quindi ciò che puoi fare in SQL Data Compare è andare nelle opzioni e usare "split transaction", che può essere d'aiuto.

SQL Data Compare eseguirà anche aggiornamenti parziali ai BLOB, che risolveranno il problema "enorme BLOB".

Questo ovviamente se basato sulla versione più recente di Data Compare. Alcune versioni potrebbero non avere queste funzionalità.

Un'altra opzione potrebbe essere l'utilizzo di SQL Compare per creare uno script di schema in una cartella, quindi utilizzare SDC per sincronizzare i dati in tale cartella. Quindi hai un file per ogni tabella piuttosto che un file enorme.

Spero che questo aiuti.

Problemi correlati