Il miglior strumento per migrare un database PostgreSQL su MS SQL 2005?


8

Ho un database in PostgreSQL 8.3.1 che vorrei migrare a MS SQL Server 2005 (o forse 2008), includendo sia lo schema della tabella che i dati. Il database ha una dimensione di circa 50 GB con circa 400.000.000 di righe, quindi penso che le semplici istruzioni INSERT siano fuori questione. Qualcuno potrebbe raccomandare lo strumento migliore per eseguire questa migrazione? Ovviamente deve essere affidabile, quindi i dati sono esattamente gli stessi nel DB di destinazione come in quello di origine e devono essere in grado di copiare questo volume di dati in un tempo ragionevole.


4
solo per curiosità: perché mai vuoi farlo?
wzzrd,

Presumo che ti stai trasferendo su un server Windows per qualche altro motivo oltre alla semplice funzionalità db? Spero :)
Warren,

Risposte:


6

Ho finito per non utilizzare alcuno strumento di terze parti per i dati poiché nessuno di quelli che ho provato ha funzionato per le tabelle di grandi dimensioni. Anche SSIS fallito. Però ho usato uno strumento commerciale per lo schema. Quindi il mio processo di conversione è stato il seguente:

  1. Conversione completa Enterprise per copiare lo schema (nessun dato).
  2. pg_dump per esportare i dati da Postgres in formato "testo semplice", che è fondamentalmente un file di valori separati da tabulazione (TSV).
  3. Capirebbero gli script Python per trasformare i file esportati in un formato bcp.
  4. bcp per importare i dati in MSSQL.

La fase di trasformazione ha preso in considerazione alcune differenze nei formati utilizzati da pg_dump e bcp, come:

  • pg_dump mette alcune cose specifiche di Postgres all'inizio del file e termina i dati con ".", mentre bcp si aspetta che l'intero file contenga dati
  • pg_dump memorizza i valori NULL come "\ N", mentre bcp non si aspetta nulla al posto di un NULL (ovvero nessun dato tra i separatori di colonne)
  • pg_dump codifica le schede come "\ t" e le nuove righe come "\ n", mentre bcp le tratta letteralmente
  • pg_dump utilizza sempre schede e newline come separatori, mentre bcp consente all'utente di specificare i separatori. Ciò diventa necessario se i dati contengono schede o nuove righe, poiché non sono codificati.

Ho anche scoperto che alcuni vincoli unici che andavano bene in Postgres sono stati violati in MSSQL, quindi ho dovuto eliminarli. Questo perché NULL = NULL in MSSQL (ovvero NULL è trattato come un valore univoco), ma non in Postgres.


Questa è una stranezza di SQL Server. Invece di un vincolo univoco, è necessario impostare un INDICE univoco filtrato (DOVE nome_colonna NON È NULL).
Quandary,

Mi hai guidato uno strumento che ho convinto il mio capo ad acquistare. È fantastico #FullConvert
mugume david

6

Se hai i driver di supporto Postgres appropriati installati sul tuo box SQL 2005 (o desideri utilizzare Postgres tramite ODBC o desideri scaricare i dati da Postgres in un file e importare da quello) puoi usare la procedura guidata di importazione / esportazione in SQL Server in per copiare i dati. Questo ti farà una serie di domande e quindi eseguirà l'importazione come processo del pacchetto di SQL Server Integration Services (SSIS), utilizzando le operazioni di inserimento batch appropriate.

Tuttavia, se tale procedura guidata non è un'opzione, vale la pena considerare che, sebbene si disponga di un numero elevato di righe, la dimensione individuale delle righe è in media <135 byte e viene fornito uno spazio di registro delle transazioni sufficiente per consentire l'esecuzione di una transazione di 50 GB " le dichiarazioni di semplice inserimento non sono esse stesse fuori questione.


1
Cerca di utilizzare BCP (è un'utilità fornita con SQL Server), se finisci per esportare i dati e quindi importarli in SQL Server. L'uso di SSIS è una buona idea, tuttavia, se si desidera ottenerlo direttamente dal server PG, ma è possibile che si verifichino problemi di accesso.
ColtonCat,

Il pacchetto SSIS sembrava molto promettente e l'ho provato, ma sfortunatamente esaurisce la memoria e fallisce. :( ERRORE [HY000] Memoria insufficiente durante la lettura delle tuple .; Errore durante l'esecuzione della query (PSQLODBC35W.DLL)
EMP


0

Quasi 10 anni dopo, e questo non è ancora un problema semplice. Ho finito con una soluzione ibrida, ho arrotolato il mio mapper dello schema esportando lo schema e i commenti di tabella / colonna usando il comando seguente:

pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql

Ho quindi scritto uno script PHP che ha tradotto lo schema in T-SQL. Successivamente, ho utilizzato il seguente software di terze parti per eseguire l'importazione effettiva di righe (nessuna affiliazione):

http://www.convert-in.com/pgs2mss.htm

È stato un po 'lento, ma finora tutto bene. Il nostro database era più piccolo del tuo, solo 15 GB, ma quello strumento sembrava gestirlo bene. È stato anche il più economico che ho trovato a circa $ 50. Finora è valsa la pena investire.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.