2009-11-18 14 views
2

J'ai besoin de prendre un "instantané" d'une base de données courante et de la cloner dans la même base de données, avec de nouvelles clés primaires.Comment copier un grand ensemble de données dans SQLServer db

Le schéma en question est constitué d'environ 10 tables, mais certaines tables contiennent potentiellement des centaines de milliers à 1 million d'enregistrements qui doivent être dupliqués.

Quelles sont mes options ici? Je crains que l'écriture d'un SPROC nécessite un verrouillage des lignes de la base de données en question (pour la simultanéité) pendant toute la durée de l'opération, ce qui est assez ennuyeux pour les autres utilisateurs. Combien de temps prendrait une telle opération, en supposant que nous puissions l'optimiser dans toute la mesure possible? Est-ce que ça va prendre 30 secondes à 1 minute pour effectuer autant d'insertions? Je ne suis pas en mesure de verrouiller la totalité de la ou des tables et d'effectuer une insertion en bloc, car d'autres utilisateurs utilisant d'autres comptes utilisent indépendamment les mêmes tables. En fonction des attentes en termes de performances, une alternative consisterait à vider la base de données actuelle dans un fichier xml, puis à cloner de manière asynchrone la base de données de ce fichier xml en arrière-plan. L'avantage évident de ceci est que la base de données n'est verrouillée que le temps nécessaire pour effectuer le vidage xml et que les insertions peuvent s'exécuter en arrière-plan.

Si un bon administrateur de base de données peut exécuter l'opération "clone" du début à la fin en moins de 10 secondes, cela ne vaut probablement pas la complexité de la solution xmldump/webservice. Mais si c'est une cause perdue, et que l'insertion potentielle de millions de lignes est susceptible de se dérouler dans le temps, alors je préférerais commencer par l'approche xml tout de suite. Ou peut-être qu'il y a une approche entièrement meilleure?

Merci beaucoup pour toutes les idées que vous pouvez fournir.

+0

Quelle version (2000 , 2005, 2008) et edtion (express, groupe de travail, standard, entreprise) de Sql Server utilisez-vous? – chadhoc

+0

Le «avec de nouvelles clés primaires» est-il une exigence? –

+0

nouvelles clés primaires est une exigence, en ce sens que celles-ci doivent être des enregistrements en double qui seront ensuite associés en tant que "version" différente de ces données. J'utilise SQL Server 2005 édition standard – Scott

Répondre

1

Je suggère de sauvegarder la base de données, puis de le restaurer en tant que nouvelle base de données sur votre serveur. Vous pouvez utiliser cette nouvelle base de données comme source. Je vais certainement recommander contre l'idée de vidage xml ..

+0

+1. Exactement ce que j'étais sur le point d'écrire ... – Heinzi

+0

Je pensais à ça aussi ... mais cela préserverait-il les clés primaires? (Je pense que oui) et la façon dont le PO l'a formulé, je ne suis pas sûr si des clés différentes sont une exigence ou juste un côté acceptable. –

+0

Bien sûr. Tout le but de la sauvegarde de base de données est de pouvoir restaurer la base de données exactement comme elle l'était. – Heinzi

0

Faut-il être dans les mêmes tableaux? Vous pourriez faire une série de tableaux « instantanés » où tous ces documents vont, vous seulement besoin d'un seul insert + select, comme

insert into snapshots_source1 (user,col1, col2, ..., colN) 
select 'john', col1, col2, ..., colN from source1 

et ainsi de suite.

Vous pouvez faire snapshots_* pour avoir une colonne IDENTITY qui créera le «nouveau PK» et qui peut également conserver l'ancien si vous le souhaitez.

Ceci a (presque) aucun problème de verrouillage et semble beaucoup plus sain.

Cela nécessite une modification du code, mais ne devrait pas être trop difficile pour que l'application pointe vers la table des instantanés, le cas échéant.

Cela facilite également les problèmes de nettoyage et d'entretien

---8<------8<------8<---outdated answer---8<---8<------8<------8<------8<---

Pourquoi ne pas vous venez de prendre une sauvegarde en direct et faire la manipulation de données (changement clé) sur le clone de destination?

Maintenant, en général, cet instantané avec de nouvelles idées de clés primaires semble suspect.Si vous voulez une réplique, vous disposez d'un service d'envoi de journaux et de cluster, si vous souhaitez qu'une copie des données génère une «nouvelle instance d'application», un processus de sauvegarde/restauration/manipulation devrait suffire.

Vous ne dites pas combien votre DB occupera, mais vous pouvez certainement sauvegarder 20 millions de lignes (800 Mo?) En 10 secondes environ en fonction de la vitesse de votre sous-système disque est ...

+0

s'il vous plaît voir mon commentaire ci-dessus. – Scott