8 votes

Copier la base de données SQL Server Express sur un autre ordinateur

J'augmente la taille du back-end de l'application Access d'un client demain et je dois être prêt avec un plan pour un problème particulier avec ce client. Le patron doit être en mesure de sortir le fichier de données du bureau où se trouve le serveur SQL sur une base régulière (généralement mensuelle) et d'effectuer des analyses statistiques sur les données.

J'ai regardé Le moyen le plus simple de copier une base de données complète d'un serveur SQL vers un serveur SQL Express local. et les solutions proposées ne fonctionnent pas dans ce scénario car.. :

  1. ne peut pas utiliser une solution ponctuelle (Assistant de publication de base de données), car celle-ci doit pouvoir être scriptée.

  2. Je ne peux pas utiliser de méthode qui dépende de la mise en réseau des deux ordinateurs, car ce n'est pas une option - les données doivent être transférées via une clé USB (donc, pas de réplication).

  3. ne peut pas utiliser une méthode qui dépend de l'exécution des outils de gestion du serveur SQL à partir de la console du serveur ou de la station de travail pour la sauvegarde.

  4. ne peut pas se connecter directement à la base de données SQL Server pour l'analyse, car les données doivent être portables vers d'autres emplacements.

Ce dont j'ai besoin, c'est d'un moyen d'appeler un script qui crée un fichier de sauvegarde, puis de copier le résultat sur la clé USB. J'ai ensuite besoin d'un second script pour copier le fichier de sauvegarde depuis la clé USB et le restaurer sur l'autre serveur SQL.

Les données transportées sont en lecture seule (c'est-à-dire que les modifications apportées n'ont pas besoin de revenir au serveur principal), et les données ne seront pas mises à jour dans le second emplacement. Le script est actuellement composé d'un simple fichier batch pour copier le fichier MDB du serveur principal, et j'ai besoin de quelque chose d'aussi simple pour l'utilisateur.

Il ne peut pas avoir de dépendances sur, par exemple, Powershell (de SQL Server Management Studio), parce que je ne veux pas qu'il doive être installé sur l'ordinateur à partir duquel l'utilisateur exécute le script (il y a une demi-douzaine de postes de travail à partir desquels le script doit pouvoir être exécuté, et je ne veux pas avoir à installer quelque chose sur chacun d'eux).

Je vais configurer l'agent de sauvegarde pour qu'il crée une sauvegarde chaque nuit, de sorte que je pourrais peut-être copier ce fichier sans avoir besoin de lancer la sauvegarde avant la copie. Ainsi, je pourrais n'avoir besoin que de script la restauration sur l'ordinateur cible.

Réflexions, suggestions, conseils ?

14voto

marc_s Points 321990

Vous devriez certainement être capable de créer quelque chose comme ça.

Une partie serait un T-SQL CREATE BACKUP script comme une .sql script, et l'exécuter à partir d'un batch Windows standard ( *.bat ) ou de commande ( *.cmd ) en utilisant le fichier sqlcmd outil de ligne de commande.

Ce serait quelque chose comme ça :

backup.sql

BACKUP DATABASE YourDatabase
TO DISK = 'Z:\Backup\YourDatabase.bak'
WITH FORMAT;

La deuxième partie serait un fichier .sql avec un T-SQL RESTORE script, qui consiste essentiellement à lire les données à partir d'un emplacement donné sur le disque et à les restaurer dans cette instance de SQL Server à cet endroit.

restaurer.sql

RESTORE DATABASE YourDatabase
   FROM AdventureWorks2008R2Backups 
   WITH 
     MOVE 'YourDatabase_Data' TO 'C:\MSSQL\Data\YourDatabase.mdf',
     MOVE 'YourDatabase_Log' TO 'C:\MSSQL\Data\YourDatabase_Log.ldf';
GO

Bien entendu, vous devez adapter ces noms et ces chemins à vos besoins réels, mais cela devrait vous donner un aperçu de la façon de commencer cette entreprise.

Pour exécuter un de ces .sql script en utilisant sqlcmd vous avez besoin de quelque chose comme :

sqlcmd -S (name of server) -U (login) -P (password) -I (name of script file)

par exemple

sqlcmd -S (local) -U someuser -P top$secret -I backup.sql

Ressources :

2voto

pghcpa Points 352

J'ai eu ce même problème lors du transport de la base de données entre la production (serveur) et le test-développement (local dans un autre endroit) et également lors du transport de la base de données terminée vers le serveur hébergé.

Il s'avère que je peux transporter le .MDF tout seul.

  1. Assurez-vous que la base de données cible n'a pas cette base de données attachée, supprimez-la d'abord dans SSMS.
  2. Déplacez le fichier .MDF seul (sans le fichier journal).
  3. A l'emplacement cible par défaut c : \program fichiers...sql.. \DATA Assurez-vous que toutes les instances précédentes de MDF et LDF ont été déplacées ou supprimées - si le logiciel voit un .ldf, il s'embrouille.
  4. Dans SSMS, choisissez de joindre. Appuyez sur Ajouter, sélectionnez le fichier .mdf.
  5. À ce stade, dans l'encadré ci-dessous, il sera indiqué qu'un MDF et un LDF sont attachés et que le LDF est manquant. Cliquez sur le LDF et appuyez sur le bouton REMOVE.
  6. Maintenant le MDF sera attaché et un LDF nouveau/vide sera ajouté.

Je fais cela tout le temps ; cela fonctionne parfaitement - cela évite d'avoir à transporter un gros .ldf. (J'utilise souvent dropbox.com au lieu d'une clé USB et je crypte d'abord le fichier avec PKZIP/SecureZip).

Je ne suis pas sûr de ce qui se passe si vous copiez le MDF avec le serveur démarré, bien que je ne l'arrête pas avant la copie. Je ne sais pas comment rendre cette opération scriptable - l'attachement peut être scriptable mais je ne suis pas sûr de la suppression du .LDF avant de procéder.

Vous pourriez script le serveur pour faire une copie instantanée de la base de données, puis transporter ce MDF en sachant qu'il n'était pas mis à jour.

Une autre idée - écrire un programme pour insérer tous les enregistrements dans un fichier d'édition compacte de SQL-Server et le transporter ? Je ne l'ai pas essayé, mais j'ai lu des articles à ce sujet.

1voto

Kevin Ross Points 5312

C'est juste une idée, mais s'il part actuellement avec une copie d'un fichier MDB contenant toutes les données pour lui seul, pourquoi ne pas continuer comme ça ? Vous pourriez simplement faire tout cela en Access avec une requête pour chaque table.

Si vous configurez votre MDB "reporting" avec les tables liées et appelées "tblFoo_LINKED" et une table locale appelée "tblFoo", vous pourriez alors simplement exécuter un bout de code VBA qui bouclerait sur toutes les tables et exécuterait quelque chose comme

INSERT INTO tblFoo SELECT * FROM tblFoo_LINKED

La restauration de la sauvegarde du serveur SQL est toujours l'option que je choisirais, mais je vous propose une autre façon de voir les choses qui pourrait répondre à vos besoins.

0voto

Steve Points 66

Pourquoi ne pas continuer à copier l'ensemble du fichier de la base de données ? Il s'agit d'une opération suffisamment petite pour s'en sortir avec une pause momentanée : Vous pourriez réduire la base de données, la détacher et copier les fichiers directement. Sur le système cible, vous pourriez joindre la BD SQLExpress par nom de fichier dans la chaîne de connexion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X