J'ai besoin de synchroniser une grande table ~ 500 millions de lignes sans clé primaire entre SQL Server et MySQL. La table n'a qu'un index composite non unique en cluster.
J'ai une connexion ODBC entre les serveurs, mais une importation de ~ 8 millions de lignes a pris environ 45 minutes, donc je pense qu'une importation unique plus importante serait déraisonnable car des interruptions peuvent survenir à tout moment. Je ne peux pas changer la structure de table existante, je peux ajouter d'autres tables. Après une lecture supplémentaire, offset / fetch n'est pas une option pour les grandes tables. "Sélectionnez ... où x entre ... et ..." n'est pas une option car je n'ai pas de clé unique.
Comment exporter la table en lots garantis pour contenir toutes les lignes? Mon problème est que, puisque la clé en cluster n'est pas unique, la commande après cela ne garantirait pas que les lignes physiques ont le même ordre entre les requêtes consécutives et la commande après toutes les colonnes prendrait trop de temps. Et comment recommanderiez-vous de migrer les lots, via des fichiers ODBC ou CSV?
la source
Réponses:
En supposant que vous n'avez pas de mises à jour ou de suppressions sur la table source, vous pouvez essayer ce qui suit:
1. Faites une copie de la table existante en utilisant la syntaxe CTAS (pour SQLServer c'est
SELECT * into source_table_copy FROM source_table
). Une telle opération est très rapide même pour des tables énormes.2. Ajoutez un
after insert
déclencheur sursource_table
lequel copie le ou les nouveaux enregistrementssource_table_copy
.3. Maintenant, lorsque tous les nouveaux enregistrements
source_table
sontsource_table_copy
également affichés, vous pouvez déplacer les données de la table copiée vers Mysql par lots. Par exemple, si vous avez un lien entre 2 serveurs, tout peut être fait dans le corps de la procédure stockée TSQL.Par exemple, un morceau de code qui déplace jusqu'à 20 enregistrements vers un nouveau serveur pourrait ressembler
Il est également possible d'utiliser CURSOR pour lire les données puis les supprimer avec la
where current of
clause.** Idéalement, vous devez empêcher les applications d'insérer des données au
source_table
cours de l'étape 1. Si c'est absolument impossible, j'irai avec unafter insert
déclencheur qui est ajouté juste avant l'étape 1 et supprimé juste après qu'il soit fait qui copie les données dans une autre table que je peux fusionner plus tard avecsource_table_copy
.la source