J'ai une très grande base de données de production et une très grande base de données d'environnement de test dans SQL Server 2008R2. Les deux bases de données ont une structure de table similaire mais des utilisateurs / connexions / autorisations / rôles différents.
Je n'ai besoin de rafraîchir que quelques tables de la base de données de test périodiquement depuis la production, environ une fois par mois.
La façon dont je prévois de le faire est
- Utilisez l'utilitaire BCP pour effectuer une exportation des tables dont j'ai besoin depuis Production.
- Copiez le fichier d'exportation bcp sur le serveur de test
- Désactiver les index et les contraintes sur toutes les tables que je rafraîchis dans Test
- Tronquer les tables de base de données de test
- Rechargez les données dans les tables de la base de données de test à l'aide de BCP.
- reconstruire les index et réactiver les contraintes dans Test
Tout cela semble un peu trop compliqué pour une si petite tâche. Il semble également que cela générerait beaucoup de refaire (dans le t-log) Y a-t-il une meilleure façon de le faire?
Une autre façon pour moi de le faire est de restaurer une sauvegarde de Production sur l'environnement de test - mais le problème que j'ai est qu'une sauvegarde complète serait assez volumineuse et je n'ai pas besoin de rafraîchir toutes les tables, seulement quelques- -et aussi les utilisateurs et la sécurité dans la base de données de production sont différents du test. Cela serait écrasé par les paramètres de sécurité dans la base de données de production si je restaure la base de données entière.
la source
Réponses:
Il existe 2 méthodes adaptées à vos besoins:
(Remarque: si les tables sont référencées par une clé étrangère, vous ne pourrez pas les utiliser
TRUNCATE
. Vous devez les supprimer par blocs . Vous pouvez également supprimer tous les index + clés étrangères et charger les données, puis les recréer).Base de données de destination BCP OUT et BULK INSERT INTO .
Activer l'indicateur de trace 610 - insertions journalisées minimales dans les tables indexées.
-
Méthode 2: SSIS - Ma méthode préférée dans ce cas.
Référence: Le Guide de performances de chargement de données et ma réponse pour - Insérer dans le tableau sélectionnez * à partir du tableau par rapport à l'insertion en bloc
la source
Il n'est pas nécessaire de faire des sauvegardes et des restaurations, ni d'appeler / coordonner des processus externes (c'est-à-dire BCP), ni même de jouer avec SSIS (très puissant, très cool, mais si je peux l'éviter, je le ferai certainement :). Vous pouvez gérer tout cela dans le confort de T-SQL, dans une procédure stockée que vous pouvez planifier via SQL Agent, ou un script que vous exécutez une fois par mois (bien que l'avoir dans un proc et une planification soit moins fastidieux à long terme) courir). Comment? En utilisant SQLCLR pour accéder à la
SqlBulkCopy
classe dans .NET car il s'agit essentiellement de BCP sans tout le tracas d'appeler BCP. Vous pouvez coder cela vous-même: il n'y a pas de configuration super compliquée ou quoi que ce soitSqlBulkCopy
La classe s'occupe de presque tout pour vous (vous pouvez définir la taille du lot, déclencher ou non des déclencheurs, etc.). Ou, si vous ne voulez pas jouer avec la compilation et le déploiement d'un assembly, vous pouvez utiliser une procédure stockée SQLCLR prédéfinie telle que DB_BulkCopy qui fait partie de la bibliothèque SQL # SQLCLR (dont je suis l'auteur, mais qui est stockée est dans la version gratuite). Je décris cela plus en détail, y compris un exemple d'utilisation de DB_BulkCopy , dans la réponse suivante:Importer des données d'une base de données vers un autre script
S'il n'est pas clair où placer cela dans votre plan actuel, vous feriez ce qui suit:
EXEC
de DB_BulkCopy ou tout ce que vous appelez si vous le code vous - même, qui se déplace uniquement les données du point A au point B.Il convient également de noter que
SqlBulkCopy
et DB_BulkCopy :MISE À JOUR concernant les opérations à journalisation minimale via SqlBulkCopy
Il est possible d'obtenir un nombre minimal d'opérations enregistrées, mais vous devez savoir:
[tempdb]
, puis effectuez l'insertion ordonnée dans la destination. Par conséquent, il y a une charge supplémentaire encourue, à la fois en termes d'E / S physiques vers tempdb (données et fichiers journaux) ainsi que l'opération de tri (en raison de ceORDER BY
qui est requis pour obtenir les opérations journalisées minimales)la source