Dump tabella SQLSERVER

martedì 26 gennaio 2010 - 09.18

ciccio_ska Profilo | Newbie

Ciao, come recita il titolo sto cercando il modo di fare il dump di una tabella.
Diciamo che avrei bisogno di fare una cosa simile al mysqldump.

Grazie

Francesco Scalise
blog: http://www.flash-hacks.com

lbenaglia Profilo | Guru

>Ciao, come recita il titolo sto cercando il modo di fare il dump
>di una tabella.
>Diciamo che avrei bisogno di fare una cosa simile al mysqldump.

Ciao Francesco,

SQL Server non permette di eseguire i dump di singole tabelle.
Il comando BACKUP DATABASE esegue il backup dell'intero database in formato binario proprietario (non viene generato un file di testo con gli statement SQL).
Ad ogni modo puoi ottenere un risultato simile a mysqldump utilizzando SQL Server Management Studio.
Connettiti all'istanza, seleziona il db di tuo interesse, tasto DX, Tasks > Generate Scripts... e segui attentamente i passi del wizard.

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ciccio_ska Profilo | Newbie

Ciao, grazie per il tuo aiuto.
Ho trovato comunque una cosa molto utile, ti rimando al mio blog :

http://www.flash-hacks.com/netdev/2010/02/backup-ms-sql-table/

A presto!

Francesco Scalise
blog: http://www.flash-hacks.com

Ferie Profilo | Newbie

Riesumo questo thred perchè mi è tornato molto utile.

Utilizzando Man Studio ho fatto il dump di una tabella.
Ora mi servirebbe poter fare il ripristino della stessa appena "backuppata": che script devo generare per poterlo fare?

lbenaglia Profilo | Guru

>Utilizzando Man Studio ho fatto il dump di una tabella.
>Ora mi servirebbe poter fare il ripristino della stessa appena
>"backuppata": che script devo generare per poterlo fare?

Ciao,

Dipende cosa intendi con "dump" (SQL Server non utilizza questo termine).
Se si tratta di un full backup puoi ripristinare il database con il comando T-SQL RESTORE; se si tratta di uno script con i comandi di CREATE... INSERT... puoi aprirlo con SSMS ed eseguirlo sull'istanza di destinazione.

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

Ferie Profilo | Newbie

Ok, allora spiego meglio: a me serve fare la copia di una tabella da un Database SQL SERVER 2000 ad un altro Database posto su un server SQL SERVER 2008 RS.

Spulciando in internet sui vari forum consigliavano di utilizzare il generatore di script di Man Studio, solo che durante il wizard di generazione di tale script mi viene chiesto di scegliere un'opzione per la generazione dello script e io non riesco a trovare una voce che faccia al caso mio.

Il consiglio che chiedo quindi ai più esperti del forum è quale essa sia e soprattutto che tipo di opzione utilizzare in un secondo momento per ripristinare la tabella così "backuppata" nel nuovo database?

Tenete presente che a me interesserebbe spostare la tabella in un nuovo database posto su un server diverso da quello dove si trova il database originario.

lbenaglia Profilo | Guru

>Tenete presente che a me interesserebbe spostare la tabella in
>un nuovo database posto su un server diverso da quello dove si
>trova il database originario.

Quante righe ha la tabella?

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

Ferie Profilo | Newbie

La tabella ha qualche milione di record

lbenaglia Profilo | Guru

>La tabella ha qualche milione di record
OK, allora il metodo migliore è quello di generare il comando di CREATE TABLE completo di constraint (lo fai da Enterprise Manager) ed eseguirlo sull'istanza di destinazione (copia e incolla in SSMS). Poi devi esportare via BCP i dati della tabella su un file di testo e reimportarla sempre via BCP (o BULK INSERT) sull'istanza di destinazione.

Sui Books Online troverai tutti i dettagli.

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

Ferie Profilo | Newbie

Ma non esistono delle query che fanno sta copia?

Questo tipo di procedimento dovrebbe essere eseguito giornalmente, se avessi le varie query potrei dedicarmi alla creazione di una programmino che fa al caso mio...

lbenaglia Profilo | Guru

>Ma non esistono delle query che fanno sta copia?
No.

>Questo tipo di procedimento dovrebbe essere eseguito giornalmente,
>se avessi le varie query potrei dedicarmi alla creazione di una
>programmino che fa al caso mio...
Se ogni giorno devi allineare milioni di righe probabilmente che c'è qualcosa che non va in fase di analisi. Prova a spiegarci meglio le tue esigenze e vedremo di suggerirti la soluzione più indicata.

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

Ferie Profilo | Newbie

Dunque, ci sono due server, uno vecchio (SQL SERVER 2000) che però è ancora in uso e lo sarà ancora per qualche tempo, uno più nuovo (SQL SERVER 2008 RS) ove sono stati portati tutti i database (che sono suddivisi per anni) di quello vecchio.
Un programma già in esecuzione creato da me in PHP esegue giornalmente i backup di tutti i database del corrente anno, li sposta sul nuovo server e ne fa il restore. Eccetto uno.

Uno di questi database, il più grosso in assoluto del corrente anno, invece è strutturato in modo che i caricamenti giornalieri che avvengono su di esso, vengano eseguiti in maniera divisa.
Mi spiego meglio: per alcuni tipi di caricamenti vengono utilizzare direttamente le tabelle che si trovano sul nuovo server, per altri tipi caricamenti viene utilizza ancora una tabella sul vecchio server (lo so che è astruso però la situazione è questa finchè non entrerà in funzione completamente e definitivamente il nuovo server).
Ora della tabella che si trova sul vecchio server, si vuole creare una sorta di backup (o di sincronizzazione, chiamatela come volete), si vorrebbe cioè che, una volta al giorno (o se il processo è lento anche una volta ogni 2/3 giorni), questa si sincronizzasse con quella presente sul nuovo server.

E' quindi impossibile far fare il backup dell'intero database sia da una parte sia dall'altra perchè verrebbero a perdersi milioni di record necessari.
Per dovere di completezza, la tabella in questione contiene qualche centinaio di milione di record. Il database pesa, al momento, circa 9 GB (a fine anno dovrebbe arrivare attorno a 40 GB).

Questa la situazione, se avete qualche soluzione ben venga...

lbenaglia Profilo | Guru

>Ora della tabella che si trova sul vecchio server, si vuole creare
>una sorta di backup (o di sincronizzazione, chiamatela come volete),
>si vorrebbe cioè che, una volta al giorno (o se il processo è
>lento anche una volta ogni 2/3 giorni), questa si sincronizzasse
>con quella presente sul nuovo server.

Con sincronizzazione cosa intendi?

1) Inserire le nuove righe, eliminare quelle cancellate, aggiornare quelle modificate?
2) Brasare tutte le volte la tabella 2008 e ricaricarla da 0 con quella 2000?

SQL Server 2008 offre il comando MERGE per eseguire le attività descritte al punto 1 ma con un numero così consistente di righe le prestazioni saranno con molta probabilità inaccettabili. Il punto 2 lo puoi automatizzare definendo un package SSIS sul server 2008 (sempre che non sia una Express) che esegua prima di tutto una TRUNCATE TABLE, seguita da un popolamento bulk con l'apposito Bulk Insert Task (http://msdn.microsoft.com/en-us/library/ms141239.aspx) e schedulando il package con un normalissimo job.

Se stai attento ai requisiti descritti qui http://msdn.microsoft.com/en-us/library/ms190422.aspx, 100 milioni di righe te le importa in un paio di minuti (a stare larghi).

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

Ferie Profilo | Newbie

Non riesco a capire come poter utilizzare questo tipo di strumento ad esempio in PHP...

Mi hanno suggerito anche il SSIS e pure questo mi risulta difficile poterlo implementare in PHP.
In particolare mi hanno suggerito il wizard che utilizza SSIS per creare il package della funzione "esporta dati" da una parte all'altra, che tra l'altro è la cosa più semplice e veloce che ho trovato e soprattutto funzionante.
Il problema è che utilizzo una versione di Man Studio che non consente il salvataggio del package e provandolo a salvare direttamente sul server che supporta SQL 2008 RS, con la sua versione di Man Studio, ho ottenuto un file .dtsx che sembra "una sorta di xml" con un sacco di tag che aprono e chiudono opzioni e impostazioni alcune delle quali immesse durante la procedura di wizard. Da quello che posso capire però, non riesco a trovare un comando che esegua effettivamente la tanto fantomatica copia dei dati e della tabella...

A parte questo file, mi sorge una domanda: è non è possibile automatizzare questo processo di esportazione di dati?
Con "automatizzare" intendo far in modo di poter schedulare tale operazione affinchè avvenga ogni giorno lavorativo.

lbenaglia Profilo | Guru

>Non riesco a capire come poter utilizzare questo tipo di strumento
>ad esempio in PHP...
Non devi usarlo in PHP, è una funzionalità nativa di SQL Server.

>Mi hanno suggerito anche il SSIS e pure questo mi risulta difficile
>poterlo implementare in PHP.
Idem con patate

>In particolare mi hanno suggerito il wizard che utilizza SSIS
>per creare il package della funzione "esporta dati" da una parte
>all'altra, che tra l'altro è la cosa più semplice e veloce che
>ho trovato e soprattutto funzionante.
Con milioni di righe? Ne dubito...

>Il problema è che utilizzo una versione di Man Studio che non
>consente il salvataggio del package e provandolo a salvare direttamente
>sul server che supporta SQL 2008 RS, con la sua versione di Man
>Studio, ho ottenuto un file .dtsx che sembra "una sorta di xml"
>con un sacco di tag che aprono e chiudono opzioni e impostazioni
>alcune delle quali immesse durante la procedura di wizard. Da
>quello che posso capire però, non riesco a trovare un comando
>che esegua effettivamente la tanto fantomatica copia dei dati
>e della tabella...
Quello è il codice sorgente di un package SSIS.

>A parte questo file, mi sorge una domanda: è non è possibile
>automatizzare questo processo di esportazione di dati?
Se leggi attentamente i miei precedenti post, troverai la risposta al quesito (hints: Job e SQL Server Agent).

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

Ferie Profilo | Newbie

Ho provato con il linked server di cui vai tanto parlando e per far ciò ho eseguito la query
sp_addlinkedserver VecchioServer
poi per copiare i dati da una parte all'altra ho eseguito quest'altra query:
INSERT INTO NuovoServer.MioDatabase2012.dbo.MiaTabella SELECT * FROM VecchioServer.MioDatabase2012.dbo.MiaTabella
e come c'era da aspettarsi ecco l'errore, perchè il nuovo server non "vede" quello vecchio:
OLE DB provider "SQLNCLI10" for linked server "VecchioServer" returned message "Login timeout expired". OLE DB provider "SQLNCLI10" for linked server "VecchioServer" returned message "A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.". Msg 53, Level 16, State 1, Line 0 Named Pipes Provider: Could not open a connection to SQL Server [53].
Sto cercando anche altrove e dicono che con "SQL Server Data Tools" potrei riuscire a creare i famosi SSIS package che potrebbero risolvere il problema per poterli aggiungere ad una schedulazione con il Job agent fatta con l'esporta dati che al momento è l'unica cosa che mi funziona ed è pure veloce, te lo confermo, in 15 minuti mi sposta tutta la tabella. Questa esecuzione però la faccio partire dal VecchioServer sempre per il motivo dell'errore precedente.

E' una buona strada?

lbenaglia Profilo | Guru

>Ho provato con il linked server di cui vai tanto parlando e per
>far ciò ho eseguito la query
Io? E dove l'avrei scritto in questo thread?

>Sto cercando anche altrove e dicono che con "SQL Server Data
>Tools" potrei riuscire a creare i famosi SSIS package che potrebbero
>risolvere il problema per poterli aggiungere ad una schedulazione
>con il Job agent fatta con l'esporta dati che al momento è l'unica
>cosa che mi funziona ed è pure veloce, te lo confermo, in 15
>minuti mi sposta tutta la tabella. Questa esecuzione però la
>faccio partire dal VecchioServer sempre per il motivo dell'errore
>precedente.
>
>E' una buona strada?
Dato che il vecchio server è un SQL 2000 potrai al più definire dei DTS (non dei SSIS) che crei da Enterprise Manager. Comunque è bello suggerirti delle procedure e vedere che comunque fai di testa tua

In bocca al lupo.

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

Ferie Profilo | Newbie

ok non hai mai parlato dei linked server, è che siccome sto seguendo vari forum, mi viene più facile copiare il messaggio e vedere chi mi risponde con le più diverse soluzioni.
ho provato anche le tue e devo dire che dato che non ne so mezza delle t-sql quindi creare dei bulk mi viene piuttosto complesso. volevo qualcosa che mi automatizzasse il processo di backup di questa singola tabella, una query standard magari, solamente da implementare con i corretti settaggi.
ad ogni modo mi hai dato un'ottima strada da seguire che è quella dell'enterprise manager che ho trovato sul server 2000 e che mi dà addirittura la possibilità di schedulare l'export della tabella.
sto facendo tentativi e tentativi, ti farò sapere se è la strada più facile e rapida.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5