web-dev-qa-db-fra.com

Outil / script de ligne de commande pour sauvegarder une base de données SQL Server distante sur le disque local

Je fais des recherches et google depuis 10 heures et je n'ai rien trouvé, alors j'ai décidé de demander ici. Je recherche un outil en ligne de commande ou un script (fonctionnant sous Windows) qui peut sauvegarder un serveur SQL distant dans un fichier local (.sql, sauvegarde SQL Server, même CSV, tous les formats sont acceptables).

P.S. Je ne peux pas utiliser le partage à distance SMB pour sauvegarder la base de données. Aussi pas d'interface graphique, juste une ligne de commande ou des scripts

P.P.S. La base de données se trouve à distance et je souhaite sauvegarder les données de la base de données dans n'importe quel format possible sur ma machine locale (serveur Windows, pas SMB partage la connexion entre disponible/possible)

4
GMX Rider

Il existe deux façons courantes de procéder:

Un moyen simple - avec des sauvegardes de base de données "normales" - lorsque vous exécutez la commande BACKUP DATABASE, le service SQL Server sur la boîte distante doit écrire la sauvegarde dans un fichier. Le service doit pouvoir écrire sur le chemin de destination. Pour faire ça:

  • Configurer un dossier partagé sur votre machine locale
  • Accordez au service SQL Server des autorisations pour écrire sur ce partage (soit en lui accordant spécifiquement, soit en laissant tout le monde y écrire - ce n'est pas une conférence sur la sécurité, évidemment)
  • Exécutez la sauvegarde SQL Server et utilisez le chemin UNC vers le partage de votre ordinateur local pour la cible de sauvegarde, comme:

Si vous le faites via T-SQL, cela pourrait ressembler à:

BACKUP DATABASE MyReallyImportantDB TO DISK = '\\MyDesktop\SharedFolderName\MyBackup.bak'

Difficile - exportation des données - si le serveur SQL distant ne peut pas écrire sur votre machine locale pour une raison quelconque, comme les pare-feu réseau ou les autorisations, alors vous peut exporter les données. Quelques outils courants sont:

Mais sachez que ces méthodes peuvent être beaucoup plus lentes et non cohérentes sur le plan des transactions. Ils conviennent mieux aux petites bases de données - par exemple, moins de 10 Go.

Exigences mises à jour - vous n'avez noté aucune interface graphique, aucun accès au système de fichiers et aucune sauvegarde. Compte tenu de ces exigences, vous effectuerez un travail manuel:

  • Utilisez un outil ETL comme SSIS pour exporter les données
  • Créez une application personnalisée (C #, Java, peu importe) pour exporter les données
  • Utilisez un outil de synchronisation de données comme Redgate SQL Data Compare
3
Brent Ozar

Vos besoins nécessitent l'utilisation des deux outils suivants:

  • sqlcmd (outil CMD intégré à SQL Server)
  • psexec (outil d'exécution à distance SysInternals)

SQLCMD

Vous devez d'abord avoir une commande SQLCMD valide. Cela pourrait ressembler à ceci:
intentionnellement répertorié sur plusieurs lignes

sqlcmd 
    -S . 
    -U sa 
    -P ThisIsNotMyPassword 
    -d master 
    -Q "Backup Database StackExchange TO DISK='\\127.0.0.1\C$\Temp\StackExchange' WITH COPY_ONLY"

Les différents paramètres sont les suivants:

-S : The server you are connecting to. (IP or Hostname or Localhost [.])
-U : The SQL Login you are using to connect with
-P : The password of the SQL Login
-E : Trusted connection (Log in using your current Windows Account) 
     [to be used instead of -U and -P]
-d : The [initial] database you are connecting to
-Q : The command (in quotes) that you wish to execute

Le disque distant (du point de vue de la cible) sur lequel vous sauvegardez doit être accessible à partir de l'ordinateur/serveur à partir duquel vous sauvegardez.

Vous avez donc la commande ensemble, maintenant il vous suffit de l'envoyer de votre ordinateur vers l'ordinateur distant. Et c'est là que cela peut devenir compliqué.

PSEXEC

Nous utiliserons SysInternals PSEXEC.exe outil pour exécuter à distance le SQLCMD.EXE.

Une commande pour exécuter la commande à distance pourrait ressembler à ceci:
intentionnellement répertorié sur plusieurs lignes

psexec
    \\192.168.1.23
    -p ThisIsNotMyWindowsPassword
    -u Domain\User
    -accepteula
    SQLCMD (from above)

Les différents paramètres sont assez explicites.

Si vous ne fournissez pas de nom d'utilisateur (-u) et de mot de passe (-p), vous vous connecterez à l'aide de vos informations d'identification actuelles.

Les emballer ensemble

La commande entière ressemblera alors à ceci:
Pas de sauts de ligne pour augmenter la portabilité.

psexec \\127.0.0.1 -accepteula sqlcmd -S RemoteServer -U sa -P ThisIsNotMyPassword -d master -Q "Backup Database StackExchange TO DISK='\\127.0.0.1\C$\Temp\StackExchange' WITH COPY_ONLY"

Cet exemple fonctionne sur ma machine locale à des fins de démonstration et peut nécessiter quelques ajustements en fonction de votre environnement.

En cas de succès:

C:\work\SITools>psexec -accepteula sqlcmd -S . -U sa -P ThisIsNotMyPassword -d master -Q "Backup Database StackExchange TO DISK='\\127.0.0.1\C$\Temp\StackExchange.bak' WITH COPY_ONLY"

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

sqlcmd exited with error code 0.

Matériel de référence

1
John aka hot2use

Cela ressemble à l'utilisation parfaite d'un nouvel outil par Microsoft, mssql-scriptter . Cette open source, python bad bad boy devrait pouvoir faire tout ce dont vous avez besoin. Attention: elle est toujours techniquement en alpha.

  • Ligne de commande - Oui
  • Peut exporter localement - Oui
  • Peut exporter le schéma et les données vers un .sql - Oui

Exemple d'utilisation

# script the database schema and data piped to a file.
mssql-scripter -S localhost -d AdventureWorks -U sa --schema-and-data  > ./adventureworks.sql

# execute the generated above script with sqlcmd
sqlcmd -S mytestserver -U sa -i ./adventureworks.sql

documentation est disponible sur GitHub.

1
LowlyDBA

Je ne sais pas exactement de quoi vous parlez lorsque vous parlez d'un fichier local. Est-ce local sur le serveur SQL ou local sur la machine à partir de laquelle vous exécutez le script?

S'il s'agit de ce dernier, vous pouvez utiliser PowerShell pour sauvegarder les fichiers sur un chemin local sur le serveur SQL, puis RoboCopy les fichiers sur la machine exécutant le script.

0
Steve Strelzyk