Comment puis-je sauvegarder une base de données SQL Server distante sur un lecteur local?

241

J'ai besoin de copier une base de données d'un serveur distant vers un serveur local. J'ai essayé d'utiliser SQL Server Management Studio, mais il ne sauvegarde que sur un lecteur sur le serveur distant.

Des points:

  • Je n'ai pas accès au serveur distant de manière à pouvoir copier des fichiers;
  • Je n'ai pas accès à la configuration d'un chemin UNC vers mon serveur;

Avez-vous des idées sur la façon de copier cette base de données? Dois-je utiliser des outils tiers?

Fernando
la source
1
Je pense que si vous n'avez pas du tout accès à la structure du répertoire, vous aurez du mal à le faire.
JNK
3
Vous essayez simplement de copier la base de données plutôt que de la sauvegarder spécifiquement? Si tel est le cas, vous pouvez utiliser l'Assistant Copie de base de données ou (dans SQL Server 2008) utiliser l'option "Générer des scripts" pour créer un script pour le schéma et les données. Redgate SQL Compare et Data Compare peuvent également être utiles ici.
Martin Smith
1
@MartinSmith Selon votre suggestion, j'ai généré un script en utilisant l' Generate and Publish Scriptsoption. J'obtiens toutes les tables et le schéma, mais je n'ai pas obtenu de données avec les tables. Comment puis-je réparer cela.
ur vraiment ami le

Réponses:

182

Dans Microsoft SQL Server Management Studio, vous pouvez cliquer avec le bouton droit sur la base de données que vous souhaitez sauvegarder et cliquer sur Tâches -> Générer des scripts.

Cela ouvre un assistant dans lequel vous pouvez définir les éléments suivants afin d'effectuer une sauvegarde décente de votre base de données, même sur un serveur distant :

  • Sélectionnez la base de données que vous souhaitez sauvegarder et cliquez sur Suivant,
  • Dans les options qu'il vous présente:
    1. En 2010: sous les options Table / View, remplacez «Script Data» et «Script Indexes» par True et cliquez sur Next,
    2. En 2012: sous «Général», remplacez «Types de données à script» de «Schéma uniquement» par «Schéma et données»
    3. En 2014: l'option de script des données est désormais "masquée" à l'étape "Définir les options de script", vous devez cliquer sur "Avancé" et définir la valeur "Types de données à script" sur "Schéma et données"
  • Dans les quatre fenêtres suivantes, appuyez sur «Tout sélectionner», puis sur Suivant,
  • Choisissez de créer un script dans une nouvelle fenêtre de requête

Une fois que c'est fait, vous aurez un script de sauvegarde prêt devant vous. Créez une nouvelle base de données locale (ou distante) et modifiez la première instruction 'USE' du script pour utiliser votre nouvelle base de données. Enregistrez le script dans un endroit sûr et allez-y et exécutez-le sur votre nouvelle base de données vide. Cela devrait vous créer une base de données locale (presque) en double que vous pouvez ensuite sauvegarder à votre guise.

Si vous avez un accès complet à la base de données distante, vous pouvez choisir de cocher 'script tous les objets' dans la première fenêtre de l'assistant, puis changer l'option 'Script Database' sur True dans la fenêtre suivante. Attention cependant, vous devrez effectuer une recherche complète et remplacer le nom de la base de données dans le script par une nouvelle base de données que dans ce cas, vous n'aurez pas à créer avant d'exécuter le script. Cela devrait créer un doublon plus précis mais n'est parfois pas disponible en raison de restrictions d'autorisations.

Daniel Gill
la source
9
Dans SQL Server Management Studio 2012, il n'existe pas d'option telle que «Données de script», donc dans les versions plus récentes, procédez comme suit pour l'étape 2: sous «Général», modifiez «Types de données à script» de «Schéma uniquement» à «Schéma et données ».
berezovskyi
1
Je l'ai vérifié sur SQL Server 2008 R2 et cela a fonctionné comme un charme. Dans le souci de l'utiliser pour la stratégie de sauvegarde, j'ai besoin d'un travail supplémentaire, mais je pense que c'est mieux que d'utiliser des outils tiers comme RedGate, etc. Peut-être que je suis paranoïaque, mais je pense que la plupart des outils tiers ont du code supplémentaire et auront contrôler et réduire la simplicité et la clarification du script. Merci beaucoup.
QMaster
2
@ShaunLuttin Si vous vous assurez de changer «Types de données à script» de «Schéma uniquement» à «Schéma et données dans la deuxième étape (en 2012), les instructions INSERT devraient s'afficher.
Daniel Gill
6
Dans SSMS 2014, l'option de passer du schéma uniquement au schéma et aux données est désormais masquée derrière un "Avancé" lors de la sélection de l'emplacement d'enregistrement du script.
MushinNoShin
2
Lorsque j'essaie d'exécuter un script à l'aide de cette méthode, j'obtiens une erreur du studio de gestion de SQL Server sur "Mémoire insuffisante pour continuer l'exécution du programme. (Mscorelib)"
Rob
51

Tout d'abord, accordez des autorisations de contrôle total à un chemin local sur votre machine (comme indiqué ci-dessous) avec Tout le monde. (Ou bien accordez des autorisations spécifiquement au compte de l'Agent SQL Server).

Ensuite, exécutez ce qui suit:

BACKUP DATABASE [dev] TO  DISK = N'\\myMachine\c\dev.bak' WITH COPY_ONLY, INIT;
T. Webster
la source
14
C'est la réponse à la question. Cela "sauvegarde une base de données SQL Server distante sur un lecteur local", et non "des tables de script et des données". Quelqu'un: Veuillez marquer cette réponse comme acceptée et supprimer la mauvaise réponse de Daniel Gill
Henrik Holmgaard Høyer
alors que je pense que c'est la meilleure réponse, la question demande "Des idées sur la façon de copier cette base de données?" pas spécifiquement la sauvegarde.
Oliver Townshend
11
Cela suppose que la machine distante a accès aux fichiers de vos machines locales, ce qui n'est pas le cas général.
Anders Lindén
J'aimerais pouvoir vous voter plus d'une fois. C'est la réponse parfaite, et quelque chose que je voulais faire depuis des années. Si simple ... si parfait. Cela ne résoudra pas tous les cas dans le monde, mais cela a parfaitement fonctionné pour le mien où je suis déporté dans une machine, mais pas la machine qui a SQL Server.
Wade Hatler
Cela a aussi du travail pour moi. Partagez simplement le dossier local temporairement avec tout le monde , effectuez la sauvegarde, puis désactivez le partage. Je pense également que cela devrait être la bonne réponse.
Fred Rogers
51

Pour copier uniquement les données et le schéma (ne copiera pas les procédures stockées, les fonctions, etc.), utilisez l'Assistant d'importation et d'exportation de SQL Server et choisissez Nouveau ... lorsque vous choisissez la base de données de destination.

Cliquez avec le bouton droit sur Base de données> Tâches> Importer des données.

Choisissez une source de données

  • Source de données : SQL Server Native Client
  • Nom du serveur : le serveur distant
  • Authentification :
  • Base de données : le nom de la base de données

Choisissez une destination

  • Source de données : SQL Server Native Client
  • Nom du serveur : le serveur local
  • Authentification :
  • Base de données :New...

Le reste est simple.

Shaun Luttin
la source
2
Cela a fonctionné beaucoup mieux pour moi que la réponse acceptée. Gère les relations entre les tables beaucoup plus proprement.
MushinNoShin
7
Welp. Il ne définit malheureusement pas les identités et les contraintes par défaut. :(
MushinNoShin
1
C'est bien mieux que de générer des scripts. Les scripts peuvent parfois être assez volumineux. Préférence personnelle. Aucune infraction :)
Vikas
C'est beaucoup plus simple et ce serait mon choix, mais si pour une raison quelconque vous avez besoin de colonnes comme object_id, create_data, modifiez la date TEL QUEL dans sys.tables, souvenez-vous simplement qu'elles seront modifiées lors de la création.
Crismogramme
@MushinNoShin, vous pouvez d'abord générer des scripts, puis importer / exporter des données en activant l'insertion d'identité à l'étape de mappage.
HasanG
29

Vous ne pouvez pas créer une sauvegarde d'un serveur distant vers un disque local - il n'y a tout simplement aucun moyen de le faire. Et il n'y a pas non plus d'outils tiers pour le faire, à ma connaissance.

Tout ce que vous pouvez faire est de créer une sauvegarde sur la machine du serveur distant, et demandez à quelqu'un de la compresser et de vous l'envoyer.

marc_s
la source
5
Je ne suis pas d'accord. Dans de nombreuses circonstances, vous pouvez utiliser la commande «Générer des scripts» de MS SQL Server Management Studio pour créer un script qui peut être exécuté pour générer une base de données locale que vous pouvez ensuite utiliser comme vous le souhaitez. Voir ma réponse ci-dessous ou le commentaire de Martin Smith sur la question.
Daniel Gill
19
@Rafid: oui -mais ce n'est PAS une vraie SAUVEGARDE - c'est une exportation de script / données .....
marc_s
2
@marc_s Qu'y a-t-il d'une "vraie sauvegarde" différente d'une copie exportée? Le journal? Rien d'autre?
Dronz
31
@Dronz: OUI! L'exportation de script reproduira la structure et peut-être même les données d'une table, mais elle ne peut pas inclure des éléments tels que les journaux de transactions et les statistiques et d'autres parties vitales d'une base de données SQL Server.
marc_s
1
@ShaunLuttin, vous pouvez inclure les données.
Erwin Rooijakkers
17

Je sais que c'est une réponse tardive mais je dois faire un commentaire sur la réponse la plus votée qui dit d'utiliser l'option de génération de scripts dans SSMS.

Le problème est que cette option ne génère pas nécessairement un script dans un ordre d'exécution correct car elle ne prend pas en compte les dépendances.

Pour les petites bases de données, ce n'est pas un problème, mais pour les plus grandes, c'est certainement parce qu'il nécessite de réorganiser manuellement ce script. Essayez cela sur 500 bases de données d'objets;)

Malheureusement, dans ce cas, la seule solution est des outils tiers.

J'ai utilisé avec succès des outils de comparaison d' ApexSQL (Diff et Data Diff) pour des tâches similaires, mais vous ne pouvez pas vous tromper avec les autres déjà mentionnés ici, en particulier Red Gate.

Phill C
la source
1
je ne suis pas d'accord, pour moi sql commande toujours correctement les dépendances, avez-vous un exemple spécifique de la façon de reproduire le comportement que vous avez mentionné?
sawe
aussi, il y a une option pour prendre cette question en compte
Gaspa79
13

Vous pouvez essayer SQLBackupAndFTP . Il créera des scripts pour créer tous les objets de votre base de données et des instructions INSERT pour toutes les lignes de vos tables. Dans n'importe quelle base de données, vous pouvez exécuter ce fichier de script et la base de données entière sera recréée.

adinas
la source
4
Appuyé. J'ai dû installer une nouvelle version de SQL Server Management Studio et ne pouvais pas écrire de script comme je le faisais auparavant. Cet outil s'en est occupé rapidement et sans problèmes, même sans avoir un accès complet au serveur distant (module complémentaire sqlserver appharbor)
Daniel Gill
1
Veuillez noter que ce logiciel utilise beaucoup de ressources.
Dementic
En plus d'être bogué et pas tout à fait sûr que cela fonctionne correctement. Peut se connecter sans problème à un serveur distant via PHP, mais cela ne peut pas? Lorsque j'ai des paramètres appropriés sur le serveur lui-même. Alors ouais ... continuons.
Shawn Rebelo
7

Regardez ce blog pour une description comment copier une base de données distante:

Sauvegarder une base de données SQL Server 2008 à partir d'un environnement d'hébergement partagé

Marcel W
la source
1
Cette approche explique comment créer un script pour la structure de la base de données, la créer localement, puis utiliser les outils de gestion SQL pour copier des données entre une base de données locale et distante.
Drew Noakes
1
Vous pouvez basculer l'option 'Script Data' sur True afin de scripter les données en une seule fois.
Daniel Gill
La copie et la sauvegarde sont deux choses différentes.
Anders Lindén
C'était parfait car j'ai besoin de travailler sur une base de données 2016 en utilisant SQL Server 2012 et je ne peux pas utiliser une sauvegarde 2016 en 2012.
majjam
6

Il y a la solution à 99% pour obtenir le fichier bak du serveur SQL distant vers votre PC local. Je l'ai décrit dans mon article http://www.ok.unsode.com/post/2015/06/27/remote-sql-backup-to-local-pc

En général, cela ressemblera à ceci:

  • exécuter le script sql pour générer des fichiers bak

  • exécuter le script sql pour insérer chaque fichier bak dans la table temporaire avec le type de champ varbinary et sélectionner cette ligne et télécharger les données

  • répéter prev. étape autant de fois que vous avez de fichiers bak

  • exécuter le script sql pour supprimer toutes les ressources temporaires

ça y est, vous avez vos fichiers bak sur votre PC local.

okarpov
la source
5

Vous pouvez utiliser Copier la base de données ... cliquer avec le bouton droit sur la base de données distante ... sélectionner des tâches et utiliser copier la base de données ... il vous posera des questions sur le serveur source et le serveur de destination. que votre source est la télécommande et la destination est votre instance locale du serveur SQL.

C'est si facile

Pouyan
la source
La copie de la base de données nécessite des privilèges SysAdmin. Ce n'est pas une solution pour les utilisateurs réguliers de la base de données.
Buggieboy
Dans mon numéro d'aujourd'hui, notre équipe de développement dispose de privilèges d'administrateur système. Je vais donc utiliser l'approche de Pouyan.
Codes avec Hammer
mais je dois le faire quotidiennement et j'ai besoin d'un script pour accomplir cela
clarificateur
3

Le gang AppHarbor a eu du mal avec cela et a développé une solution temporaire en utilisant des objets de gestion de serveur SQL et SqlBulkCopy.

Consultez leur blog à ce sujet ou allez directement au code .

Ils ne l'ont testé qu'avec AppHarbor, mais cela vaut peut-être la peine d'être vérifié.

Daniel Gill
la source
3

Les réponses ci-dessus ne sont tout simplement pas correctes. Un script SQL même avec des données n'est pas une sauvegarde. Une sauvegarde est un fichier BAK qui contient la base de données complète dans sa structure actuelle, y compris les indizes.

Bien sûr, un fichier BAK contenant la sauvegarde complète avec toutes les données et les index d'une base de données SQL Server distante peut être récupéré sur un système local.

Cela peut être fait avec un logiciel commercial, pour enregistrer directement un fichier BAK de sauvegarde sur votre machine locale, par exemple Celui-ci créera directement une sauvegarde à partir d'une base de données SQL distante sur votre machine locale.

Matthias
la source
Pour ce faire, vous avez besoin d'autorisations sysadmin.
LarryBud
Droite. Le compte (serveur Windows ou SQL) utilisé pour se connecter à distance à l'instance du serveur SQL a besoin d'autorisations sysadmin pour récupérer les fichiers de sauvegarde et les stocker sur votre ordinateur local. L'outil mentionné de FIDA Software crypte et compresse le trafic réseau depuis et vers le serveur SQL lors de la récupération des fichiers de sauvegarde. Une fois que vous avez le fichier bak sur votre machine, vous pouvez le restaurer où vous le souhaitez.
Matthias
1

Comme l'a dit Martin Smith, si vous n'avez pas accès à la machine ou au système de fichiers, vous devrez utiliser des outils tiers, comme Red Gate ou Adept pour comparer les systèmes source et de destination. Les outils de Red Gate vous permettront de copier les objets et les schémas ET les données.

Vinnie
la source
1

Vous pouvez également effectuer une sauvegarde d'une instance distante de SQL Server sur votre lecteur local, étant donné que la condition suivante est remplie:

  1. Vous avez un dossier partagé sur votre disque local.
  2. le dossier partagé est accessible à partir de la zone SQL Server.

Maintenant, lorsque vous spécifiez la commande de sauvegarde, utilisez le chemin du dossier partagé lorsque vous spécifiez l'option de disque.

Naresh
la source
Et en quoi votre réponse est-elle différente de celle de @Vivek?
Martin Schröder
1

essayez celui-ci:

1) Partagez un dossier avec une autorisation complète sur votre ordinateur

2) dans votre serveur SQL: panneau de configuration -> outils d'administration -> services -> clic droit sur tous les services SQL

sur l'onglet de connexion doit commencer par votre administrateur de domaine

3) dans l'assistant de maintenance du serveur SQL, placez l'emplacement et le dossier de sauvegarde (\ votrenom_ordinateur \ sharedfoldernam)

J'ai fait une sauvegarde à distance sur 8 serveurs de SQL Server 2008 dans notre entreprise

Parsaria
la source
1

Je suis étonné que personne ne l' a mentionné la solution de sauvegarde scénarisé offerte par Ola Hallengren qui absolument ne vous permet de sauvegarder un DB à partir d' un serveur distant vers un chemin UNC sur votre réseau gratuitement (je suis en fait l' utiliser comme type I pour sauvegarder une base de données à partir d'un serveur de développement auquel je n'ai aucun accès à distance autre que via SSMS à un partage sur mon PC de développement). Il est disponible depuis 2008 et fonctionne sur SQL Server 2005 jusqu'en 2014.

Vous devez vous assurer que le partage que vous avez configuré dispose d'un accès suffisant: j'ai tendance à autoriser la lecture / écriture complète au groupe AD `` Tout le monde '' pendant la durée du processus de sauvegarde, car je suis trop paresseux pour comprendre quoi que ce soit de plus restrictif, mais c'est choix personnel.

Il est bien utilisé, bien documenté et très flexible. J'ai tendance à mettre les procs et la table de journalisation dans leur propre petite base de données utilitaires, puis à les lancer. À condition que tout se trouve dans votre domaine AD et non à distance dans le sens où il se trouve sur un serveur colocalisé ou quelque chose, cela fonctionne très bien.

Toutes mes excuses pour avoir ajouté à un fil de discussion très ancien, mais je suis tombé sur ce problème en cherchant autre chose et je me suis dit que c'était un ajout intéressant pour quiconque recherchait ce sujet.

Steve Pettifer
la source
1

Pour 2019, je recommanderais d'utiliser mssql-scriptter si vous souhaitez une sauvegarde locale réelle. Oui, ce sont des scripts, mais vous pouvez l'ajuster pour inclure ce que vous voulez, ce qui peut inclure toutes les données. J'ai écrit un script bash pour effectuer des sauvegardes quotidiennes automatisées en utilisant cela sur une machine Linux. Découvrez mon essentiel:

https://gist.github.com/tjmoses/45ee6b3046be280c9daa23b0f610f407
Tim Moses
la source
0

Je pourrais le faire une fois ... Pour ce faire, vous devez avoir un partage ouvert sur le serveur distant. alors vous pouvez directement placer la sauvegarde sur le partage lui-même, que l'emplacement par défaut ...

Habituellement, l'administrateur prend la sauvegarde et la partage avec nous dans un dossier partagé. J'ai essayé si cela fonctionne si j'y place la sauvegarde. Ça a marché.

Vivek
la source
0

Si vous utilisez les scripts de génération sous SSMS, cliquez sur le bouton Avancé. Sous l'option «Générer des scripts pour les objets dépendants», cliquez sur True. En cliquant sur, toutes les dépendances de chaque objet seront également scriptées dans le bon ordre.

user2684
la source
True est la valeur par défaut dans SSMS v17.8.1.
Chris Catignani
0

Certains programmes de sauvegarde tiers permettent de définir le transfert de fichiers avec des autorisations réseau spécifiques. Il est très utile lorsque le service SQL Server s'exécute sous un compte restreint et n'a pas suffisamment d'autorisations réseau. Essayez d'utiliser EMS SQL Backup qui résout cette tâche.

curandero
la source
0

J'utilise les outils de Redgate Backup Pro 7 à cet effet. vous pouvez créer un miroir à partir du fichier de sauvegarde dans la vignette de création à un autre emplacement. et peut copier le fichier de sauvegarde après la création sur le réseau et sur le stockage hôte automatiquement.

mehdi lotfi
la source
0

Créer un dossier partagé local, avec des privilèges de lecture / écriture "tout le monde"

Connectez-vous à la base de données cible, démarrez la sauvegarde et pointez sur le partage comme ci-dessous

\ mymachine \ dossier_partagé \ mybackup.bak

(Testé sur un environnement de domaine Windows)

Rajesh Thampi
la source
0

Je sais que c'est un article plus ancien, mais pour ce que ça vaut, j'ai trouvé que la solution "la plus simple" consiste à simplement cliquer avec le bouton droit sur la base de données et sélectionner "Tâches" -> "Exporter l'application de niveau de données". Il est possible que cette option ne soit disponible que parce que le serveur est hébergé sur Azure (d'après ce que je me souviens avoir travaillé avec Azure dans le passé, le format .bacpac y était assez courant).

Une fois cela fait, vous pouvez cliquer avec le bouton droit de la souris sur la liste "Bases de données" de votre serveur local et utiliser "Importer une application de niveau" pour obtenir les données sur votre ordinateur local à l'aide du fichier .bacpac.

N'oubliez pas que l'exportation pourrait prendre beaucoup de temps. Il a fallu environ deux heures au mien pour terminer l'exportation. L'importation est cependant beaucoup plus rapide.

Kiran Ramaswamy
la source
-1

Si vous êtes sur un réseau local, vous pouvez partager un dossier sur votre ordinateur local et l'utiliser comme dossier de destination pour la sauvegarde.

Exemple:

  • Dossier local:

    C:\MySharedFolder -> URL: \\MyMachine\MySharedFolder

  • Serveur SQL distant:

    Select your database -> Tasks -> Back Up -> Destination -> Add -> Apply '\\MyMachine\MySharedFolder'

Tonatio
la source