J'ai besoin de déplacer un tas (100+) de grandes tables (des millions de lignes) d'une base de données SQL2008 à une autre.
À l'origine, je viens d'utiliser l'assistant d'importation / exportation, mais toutes les tables de destination manquaient de clés primaires et étrangères, d'index, de contraintes, de déclencheurs, etc. (les colonnes d'identité ont également été converties en INT simples, mais je pense que j'ai raté une case à cocher dans sorcier.)
Quelle est la bonne façon de procéder?
S'il ne s'agissait que de quelques tables, je retournerais à la source, je rédigerais la définition de la table (avec tous les index, etc.), puis exécuterais les parties de création d'index du script sur la destination. Mais avec autant de tableaux, cela semble peu pratique.
S'il n'y avait pas autant de données, je pourrais utiliser l'assistant "Créer des scripts ..." pour créer un script pour la source, y compris les données, mais un script de 72 m de ligne ne semble tout simplement pas être une bonne idée!
Réponses:
Scénariser les tables, puis utiliser SSIS pour transférer les données serait le moyen le plus fiable et le plus efficace de déplacer les données vers la nouvelle base de données.
la source
Nous l'avons fait en utilisant beaucoup de scripts manuels en conjonction avec l'assistant d'importation, mais ce matin, j'ai trouvé une meilleure réponse, gracieuseté de l'article de blog de Tibor Karaszi .
Une partie de notre frustration était que l ' «Assistant d'importation / exportation DTS» de SQL 2000 rend cela très facile en sélectionnant «Copier les objets et les données»:
Cette troisième option est celle qui contient la possibilité d'inclure des index / déclencheurs, etc.:
Cette option a été SUPPRIMÉE de l' Assistant d'importation SQL 2005/2008 . Pourquoi? Aucune idée:
En 2005/2008, vous devez apparemment créer manuellement un package SSIS dans BIDS et utiliser la tâche de transfert d'objets SQL Server , qui contient toutes les mêmes options que celles de l'assistant 2000:
la source
J'envisagerais de créer un script pour la table ou d'utiliser un outil de comparaison (par exemple, Red Gate) pour générer les tables dans la base de données cible. Sans index ni contraintes pour le moment.
J'envisagerais alors de restaurer la base de données avec un nom différent sur le même serveur et de faire
.. pour chaque table, avec SET IDENTITY INSERT ON si nécessaire
Ensuite, j'ajoutais des index et des contraintes après le chargement des données.
Cela dépend de votre niveau de confort avec SSIS (réponse de mrdenny) ou si vous préférez du SQL brut.
la source
J'ajouterais à la réponse de M. Denny: Scriptez le schéma des tables puis utilisez BCP pour déplacer les données. Si vous n'êtes pas familier avec SSIS, l'utilisation de BCP et des lots devrait être facile à faire. Pour des millions de lignes, rien ne vaut BCP (encart en vrac) :).
la source
Je suis celui qui est complètement mal à l'aise avec SSIS.
Lorsque les tables source n'ont pas de colonnes d'identité
Maintenant, le T-SQL pour générer les instructions Select * into ...
Cela génère une ligne pour chaque table à copier comme
Dans le cas où les tables contiennent des colonnes d'identité, je script les tables, y compris la propriété d'identité et les clés primaires.
Je n'utilise pas d'insertion dans ... sélectionnez ... en utilisant un serveur lié dans ce cas, car ce n'est pas une technique en vrac. Je travaille sur certains scripts PowerShell similaires à [cette question SO 1 , mais je travaille toujours sur la gestion des erreurs. Les très grandes tables peuvent provoquer des erreurs de mémoire insuffisante, car une table entière est chargée en mémoire, avant d'être envoyée via SQLBulkCopy à la base de données.
La récréation des index, etc. est similaire au cas ci-dessus. Cette fois, je peux sauter la recréation des clés primaires.
la source
Vous pouvez utiliser des outils de comparaison qui comparent les schémas de base de données et les données et synchroniser d'abord un schéma de base de données vierge avec la base de données d'origine, pour créer toutes les tables.
Ensuite, synchronisez les données de la base de données d'origine avec la nouvelle (toutes les tables sont là, mais elles sont toutes vides) pour insérer les enregistrements dans les tables
J'utilise ApexSQL Diff et ApexSQL Data Diff pour cela, mais il existe d'autres outils similaires.
La bonne chose à propos de ce processus est que vous n'avez pas vraiment à synchroniser les bases de données à l'aide de l'outil, car cela peut être assez pénible pour des millions de lignes.
Vous pouvez simplement créer un script SQL INSERT INTO (ne soyez pas surpris s'il s'agit de plusieurs concerts) et l'exécuter.
Comme les scripts de grande taille ne peuvent même pas être ouverts dans SQL Server Management Studio, j'utilise sqlcmd ou osql
la source
Comme l'a mentionné @mrdenny -
Au lieu d'utiliser SSIS, utilisez BCP pour insérer des données
bcp sortir les données en utilisant le script ci-dessous. définissez SSMS en mode texte et copiez la sortie générée par le script ci-dessous dans un fichier bat.
Exécutez le fichier bat qui générera les fichiers .dat dans le dossier que vous avez spécifié.
Exécutez le script ci-dessous sur le
Exécutez la sortie à l'aide de SSMS pour réinsérer les données dans les tables.
C'est une méthode bcp très rapide car elle utilise le mode natif.
la source