Moyen le plus simple de migrer une base de données PostgreSQL vers une base SQL Server

J'ai une base de données PostgreSQL que je veux déplacer vers SQL Server - à la fois le schéma et les données. Je suis pauvre, donc je ne veux pas payer d'argent. Je suis aussi paresseux, donc je ne veux pas faire beaucoup de travail. Actuellement, je fais cette table par table, et il y a environ 100 tables à faire. C'est extrêmement fastidieux.

Y a-t-il une sorte de truc qui fait ce que je veux?

42
demandé sur marc_s 2011-07-03 19:45:59

2 réponses

Je crois que vous avez peut-être obtenu des votes négatifs en raison de la facilité incroyable de générer un script SQL simple à partir de PostgreSQL qui peut (théoriquement) être exécuté à nouveau à peu près N'importe quel SGBD. Si l'on est un utilisateur PostgreSQL régulier, sonne comme une question stupide.

Ce n'est pas juste car il s'avère que c'est en fait un problème modérément difficile (bien que plus dû à la syntaxe et à l'interface bizarres de SQL Server que tout échec de PostgreSQL).

Vous devriez pouvoir en trouver informations utiles dans la réponse acceptée dans cette page Serverfault: https://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql-2005.

Si vous pouvez obtenir le schéma converti sans les données, vous pouvez être en mesure de raccourcir les étapes pour les données en utilisant cette commande:

pg_dump --data-only --column-inserts your_db_name > data_load_script.sql

Cette charge sera assez lente, mais l'option --column-inserts génère les instructions INSERT les plus génériques possibles pour chaque ligne de données et devrait être compatible.

EDIT: Suggestions sur la conversion du schéma suit:

Je commencerais par vider le schéma, mais en supprimant tout ce qui a à voir avec la propriété ou les autorisations. Cela devrait suffire:

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

Modifiez ce fichier pour ajouter la ligne BEGIN TRANSACTION; Au début et ROLLBACK TRANSACTION; à la fin. Vous pouvez maintenant le charger et l'exécuter dans une fenêtre de requête dans SQL Server. Si vous obtenez des erreurs, assurez - vous d'aller au bas du fichier, mettez en surbrillance l'instruction ROLLBACK et exécutez-la (par appuyez sur F5 alors que l'instruction est en surbrillance).

Fondamentalement, vous devez résoudre chaque erreur jusqu'à ce que le script s'exécute proprement. Vous pouvez ensuite modifier la ROLLBACK TRANSACTION à COMMIT TRANSACTION et exécuter une dernière fois.

Malheureusement, je ne peux pas aider avec quelles erreurs vous pouvez voir car je ne suis jamais passé de PostgreSQL à SQL Server, seulement l'inverse. Certaines choses que je m'attendrais à être un problème, cependant (évidemment, pas une liste exhaustive):

  • PostgreSQL fait incrémenter automatiquement les champs en reliant un champ NOT NULL INTEGER à un SEQUENCE à l'aide d'un DEFAULT. Dans SQL Server, il s'agit d'une colonne IDENTITY, mais ce n'est pas exactement la même chose. Je ne suis pas sûr qu'ils soient équivalents, mais si votre schéma d'origine est plein de champs "id", vous pourriez avoir des problèmes. Je ne sais pas si SQL Server a CREATE SEQUENCE, donc vous devrez peut-être les supprimer.
  • les fonctions de base de données / procédures stockées ne se traduisent pas entre les plates-formes SGBDR. Vous devrez supprimer toutes les instructions CREATE FUNCTION et traduire les algorithmes manuellement.
  • faites attention à l'encodage du fichier de données. Je suis une personne Linux, donc je n'ai aucune idée de comment vérifier l'encodage dans Windows, mais vous devez vous assurer que ce que SQL Server attend est le même que le fichier que vous importez depuis PostgreSQL. pg_dump a une option --encoding= qui vous permettra de définir un encodage spécifique. Je semble me rappeler que Windows a tendance à utiliser l'encodage UTF-16 à deux octets pour Unicode où PostgreSQL utilise UTF-8. J'ai eu un problème à partir de SQL Serveur à PostgreSQL en raison de la sortie UTF-16, Il serait donc utile de faire des recherches.
  • le type de données PostgreSQL TEXT est simplement un VARCHAR sans longueur maximale. Dans SQL Server, TEXT est... compliqué (et déconseillé). Chaque champ de votre schéma d'origine déclaré comme TEXT devra être examiné pour un type de données SQL Server approprié.
  • SQL Server a des types de données supplémentaires pour les données UNICODE. Je ne suis pas assez familier avec elle pour faire des suggestions. Je signale simplement qu'il peut être un problème.
45
répondu Matthew Wood 2017-08-14 15:26:11

J'ai trouvé plus rapide et plus facile d'y parvenir.

Copiez D'abord votre table (ou requête) dans un fichier délimité par des tabulations comme suit:

COPY (SELECT siteid, searchdist, listtype, list, sitename, county, street, 
   city, state, zip, georesult, elevation, lat, lng, wkt, unlocated_bool, 
   id, status, standard_status, date_opened_or_reported, date_closed, 
   notes, list_type_description FROM mlocal) TO 'c:\SQLAzureImportFiles\data_script_mlocal.tsv' NULL E''

Ensuite, vous devez créer votre table en SQL, cela ne gérera aucun schéma pour vous. Le schéma doit correspondre à votre fichier tsv exporté dans l'ordre des champs et les types de données.

Enfin, vous exécutez l'utilitaire bcp de SQL pour introduire le fichier tsv comme suit:

bcp MyDb.dbo.mlocal in "\\NEWDBSERVER\SQLAzureImportFiles\data_script_mlocal.tsv" -S tcp:YourDBServer.database.windows.net -U YourUserName -P YourPassword -c

Quelques choses à noter que j'ai rencontrées. Postgresql et SQL Server gérer champs booléens différemment. Votre schéma SQL Server doit avoir vos champs booléens définis sur varchar (1) et les données résultantes seront 'f', 't' ou null. Vous devrez alors convertir ce champ en un bit. faire quelque chose comme:

ALTER TABLE mlocal ADD unlocated bit;
UPDATE mlocal SET unlocated=1 WHERE unlocated_bool='t';
UPDATE mlocal SET unlocated=0 WHERE unlocated_bool='f';
ALTER TABLE mlocal DROP COLUMN unlocated_bool;

Une autre chose est que les champs de géographie/géométrie sont très différents entre les deux plates-formes. Exportez les champs de géométrie en tant que WKT à l'aide de ST_AsText(geo) et convertissez-les de manière appropriée à la fin de SQL Server.

Il peut y avoir plus d'incompatibilités nécessitant des réglages comme ce.

Modifier. Donc, alors que cette technique fonctionne techniquement, j'essaie de transférer plusieurs millions d'enregistrements de 100+ tables à SQL Azure et bcp à SQL Azure est assez floconneux il s'avère. Je continue à être intermittent incapable d'ouvrir les erreurs du fichier de données hôte BCP, le serveur temporise par intermittence et pour une raison quelconque, certains enregistrements ne sont pas transférés sans aucune indication d'erreurs ou de problèmes. Cette technique n'est donc pas stable pour transférer de grandes quantités de données pour Azure SQL.

1
répondu Brad Mathews 2017-09-28 19:53:26