Qu'est-ce qu'un simple programme ou script de ligne de commande pour sauvegarder les bases de données du serveur SQL?

94

J'ai été trop laxiste en effectuant des sauvegardes de base de données sur nos serveurs internes.

Existe-t-il un programme de ligne de commande simple que je peux utiliser pour sauvegarder certaines bases de données dans SQL Server 2005? Ou y a-t-il un simple VBScript?

Frank Krueger
la source
6
Personnellement, j'ai beaucoup plus de chance avec les applications de commande de citron et les utilitaires d'instruction orange. Les programmes Command Lime sont bien plus problématiques qu'ils n'en valent.
Jim

Réponses:

108

Pour sauvegarder une seule base de données à partir de la ligne de commande, utilisez osql ou sqlcmd .

"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" 
    -E -Q "BACKUP DATABASE mydatabase TO DISK='C:\tmp\db.bak' WITH FORMAT"

Vous voudrez également lire la documentation sur la sauvegarde et la restauration et les procédures générales .

Craig Trader
la source
3
Il existe un bon script pour sauvegarder toutes les bases de données utilisateur en une seule fois ici: mssqltips.com/tip.asp?tip=1070
Marnix van Valen
7
La documentation dit que WITH FORMATformate le support de stockage: " L'option FORMAT invalide tout le contenu multimédia, ignorant tout contenu existant. " Assurez-vous que c'est ce que vous voulez.
alexg
4
@Tjaart, c'est pourquoi j'ai dit de lire d'abord la documentation. Si vous n'utilisez pas WITH FORMAT et que vous choisissez un fichier de sauvegarde existant, la nouvelle sauvegarde sera ajoutée aux sauvegardes existantes dans le fichier, ce qui peut ne pas être ce que vous voulez.
Craig Trader
@Kiquenet Bzzzzzt - Ce serait un produit GUI, et donc, pas un simple programme ou script de ligne de commande, selon la demande originale.
Craig Trader
sur mon installation osql.exeétait dansC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Matthew Lock
9

j'utilise ExpressMaint .

Pour sauvegarder toutes les bases de données utilisateur, je fais par exemple:

C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS
Martin Meixger
la source
1
Meixger, je ne trouve pas une seule raison d'utiliser ExpressMaint, quand SQLBackupAndFTP le bat dans tous les scénarios imaginables
8

Planifiez ce qui suit pour sauvegarder toutes les bases de données:

Use Master

Declare @ToExecute VarChar(8000)

Select @ToExecute = Coalesce(@ToExecute + 'Backup Database ' + [Name] + ' To Disk =     ''D:\Backups\Databases\' + [Name]   + '.bak'' With Format;' + char(13),'')
From
Master..Sysdatabases
Where
[Name] Not In ('tempdb')
and databasepropertyex ([Name],'Status') = 'online'

Execute(@ToExecute)

Il y a aussi plus de détails sur mon blog: comment automatiser les sauvegardes SQL Server Express .

GateKiller
la source
Pouvez-vous expliquer comment planifier?
Frank Krueger
Veuillez lire mon article de blog. Il détaille tout ce que vous devez savoir.
GateKiller
Je pense que la question demande quelque chose qui fonctionne en dehors de SQL Server.
bzlm le
@bzlm, comme je l'ai dit. Mon blog contient des détails sur la façon de faire cela en dehors de SQL Server :)
GateKiller
1
@GateKiller Le lien de votre blog est-il toujours valide? Je ne peux pas l'ouvrir
Yash Saraiya
5

J'ai trouvé cela sur une page de support Microsoft http://support.microsoft.com/kb/2019698 .

Cela fonctionne très bien! Et comme il vient de Microsoft, j'ai l'impression que c'est assez légitime.

Fondamentalement, il y a deux étapes.

  1. Créez une procédure stockée dans votre base de données principale. Voir le lien msft ou s'il est cassé, essayez ici: http://pastebin.com/svRLkqnq
  2. Planifiez la sauvegarde à partir de votre planificateur de tâches. Vous souhaiterez peut-être placer d'abord dans un fichier .bat ou .cmd, puis planifier ce fichier.

    sqlcmd -S YOUR_SERVER_NAME\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='C:\SQL_Backup\', @backupType='F'"  1>c:\SQL_Backup\backup.log            

Remplacez évidemment YOUR_SERVER_NAME par le nom de votre ordinateur ou essayez éventuellement. \ SQLEXPRESS et assurez-vous que le dossier de sauvegarde existe. Dans ce cas, il essaie de le mettre dans c: \ SQL_Backup

John W.
la source
1
Pour ce que ça vaut, j'ai fini par utiliser la méthode ci-dessus de concert avec le contenu de ola.hallengren.com qui, je pense, est très respecté dans la communauté dba. Cela fonctionne comme un charme.
John W.
5

Vous pouvez utiliser l'application de sauvegarde par ApexSQL. Bien qu'il s'agisse d'une application GUI, toutes ses fonctionnalités sont prises en charge dans CLI. Il est possible d'effectuer des opérations de sauvegarde ponctuelles ou de créer un travail qui sauvegarderait régulièrement des bases de données spécifiées. Vous pouvez vérifier les règles de commutation et examinées dans les articles:

P.Thompson
la source
4

J'utilise tsql sur une infrastructure Linux / UNIX pour accéder aux bases de données MSSQL. Voici un simple script shell pour vider une table dans un fichier:

#!/usr/bin/ksh
#
#.....
(
tsql -S {database} -U {user} -P {password} <<EOF
select * from {table}
go
quit
EOF
) >{output_file.dump}
Ira C
la source
3

Eventuel si vous ne disposez pas d'une connexion approuvée comme le déclare le commutateur –E

Utilisez la ligne de commande suivante

"[program dir]\[sql server version]\Tools\Binn\osql.exe" -Q "BACKUP DATABASE mydatabase TO DISK='C:\tmp\db.bak'" -S [server] –U [login id] -P [password]

[rép programme] est le répertoire où se trouve osql.exe

Sur un système d'exploitation 32 bits c: \ Program Files \ Microsoft SQL Server \
Sur OS 64 bits c: \ Program Files (x86) \ Microsoft SQL Server \

[version serveur sql] votre version serveur SQL 110 ou 100 ou 90 ou 80 commence par le plus grand nombre

[serveur] votre nom de serveur ou IP de serveur

[identifiant de connexion] votre nom de connexion utilisateur du serveur ms-sql

[password] le mot de passe de connexion requis

George Vrynios
la source
1
C:\tmpest le chemin dans le serveur ou local ?
Kiquenet
les sauvegardes sont toujours stockées sur les disques du serveur, donc le c: \ tmp est sur le serveur
George Vrynios
1

La réponse de Microsoft à la sauvegarde de toutes les bases de données utilisateur sur SQL Express est ici :

Le processus est le suivant: copiez, collez et exécutez leur code (voir ci-dessous. J'ai commenté quelques lignes étrangement non commentées en haut) comme une requête sur votre serveur de base de données. Cela signifie que vous devez d'abord installer SQL Server Management Studio (ou vous connecter autrement à votre serveur de base de données avec SSMS). Cette exécution de code créera une procédure stockée sur votre serveur de base de données.

Créez un fichier de commandes pour exécuter la procédure stockée, puis utilisez le Planificateur de tâches pour planifier une exécution périodique (par exemple tous les soirs) de ce fichier de commandes. Mon code (qui fonctionne) est une version légèrement modifiée de leur premier exemple:

sqlcmd -S SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\SQLBackups\', @backupType='F'" 

Cela a fonctionné pour moi et j'aime ça. Chaque fois que vous l'exécutez, de nouveaux fichiers de sauvegarde sont créés. Vous aurez besoin de concevoir une méthode de suppression des anciens fichiers de sauvegarde sur une base régulière. J'ai déjà une routine qui fait ce genre de chose, donc je vais garder quelques jours de sauvegardes sur disque (assez longtemps pour qu'elles soient sauvegardées par ma routine de sauvegarde normale), puis je les supprimerai. En d'autres termes, j'aurai toujours quelques jours de sauvegardes sous la main sans avoir à restaurer à partir de mon système de sauvegarde.

Je vais coller le script de création de procédure stockée de Microsoft ci-dessous:

--// Copyright © Microsoft Corporation.  All Rights Reserved.
--// This code released under the terms of the
--// Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)

USE [master] 
GO 

/****** Object:  StoredProcedure [dbo].[sp_BackupDatabases] ******/ 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 


-- ============================================= 
-- Author: Microsoft 
-- Create date: 2010-02-06
-- Description: Backup Databases for SQLExpress
-- Parameter1: databaseName 
-- Parameter2: backupType F=full, D=differential, L=log
-- Parameter3: backup file location
-- =============================================

CREATE PROCEDURE [dbo].[sp_BackupDatabases]  
            @databaseName sysname = null,
            @backupType CHAR(1),
            @backupLocation nvarchar(200) 
AS 

       SET NOCOUNT ON; 

            DECLARE @DBs TABLE
            (
                  ID int IDENTITY PRIMARY KEY,
                  DBNAME nvarchar(500)
            )

             -- Pick out only databases which are online in case ALL databases are chosen to be backed up

             -- If specific database is chosen to be backed up only pick that out from @DBs

            INSERT INTO @DBs (DBNAME)
            SELECT Name FROM master.sys.databases
            where state=0
            AND name=@DatabaseName
            OR @DatabaseName IS NULL
            ORDER BY Name


           -- Filter out databases which do not need to backed up

           IF @backupType='F'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','AdventureWorks')
                  END
            ELSE IF @backupType='D'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
                  END
            ELSE IF @backupType='L'
                  BEGIN
                  DELETE @DBs where DBNAME IN ('tempdb','Northwind','pubs','master','AdventureWorks')
                  END
            ELSE
                  BEGIN
                  RETURN
                  END


            -- Declare variables

            DECLARE @BackupName varchar(100)
            DECLARE @BackupFile varchar(100)
            DECLARE @DBNAME varchar(300)
            DECLARE @sqlCommand NVARCHAR(1000) 
        DECLARE @dateTime NVARCHAR(20)
            DECLARE @Loop int                  

            -- Loop through the databases one by one

            SELECT @Loop = min(ID) FROM @DBs
       WHILE @Loop IS NOT NULL
      BEGIN

-- Database Names have to be in [dbname] format since some have - or _ in their name

      SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']'


-- Set the current date and time n yyyyhhmmss format

      SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' +  REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')  


-- Create backup filename in path\filename.extension format for full,diff and log backups

      IF @backupType = 'F'
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK'
      ELSE IF @backupType = 'D'
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_DIFF_'+ @dateTime+ '.BAK'
      ELSE IF @backupType = 'L'
            SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, '[',''),']','')+ '_LOG_'+ @dateTime+ '.TRN'


-- Provide the backup a name for storing in the media

      IF @backupType = 'F'
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' full backup for '+ @dateTime

      IF @backupType = 'D'
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' differential backup for '+ @dateTime

      IF @backupType = 'L'
            SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' log backup for '+ @dateTime


-- Generate the dynamic SQL command to be executed

       IF @backupType = 'F' 
                  BEGIN
               SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'
                  END

       IF @backupType = 'D'
                  BEGIN
               SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'        
                  END

       IF @backupType = 'L' 
                  BEGIN
               SET @sqlCommand = 'BACKUP LOG ' +@DBNAME+  ' TO DISK = '''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'        
                  END


-- Execute the generated SQL command

       EXEC(@sqlCommand)


-- Goto the next database

SELECT @Loop = min(ID) FROM @DBs where ID>@Loop


END
CraigD
la source
0

Vous pouvez utiliser un script VB que j'ai écrit exactement à cet effet: https://github.com/ezrarieben/mssql-backup-vbs/

Planifiez une tâche dans le "Planificateur de tâches" pour exécuter le script comme vous le souhaitez et il sauvegardera l'ensemble de la base de données dans un fichier BAK et l'enregistrera où vous le spécifiez.

ezrarieben
la source
0
SET NOCOUNT ON;
declare @PATH VARCHAR(200)='D:\MyBackupFolder\'
 -- path where you want to take backups
IF OBJECT_ID('TEMPDB..#back') IS NOT NULL

DROP TABLE #back

CREATE TABLE #back
(
RN INT IDENTITY (1,1),
DatabaseName NVARCHAR(200)

)

INSERT INTO #back 
SELECT       'MyDatabase1'
UNION SELECT 'MyDatabase2'
UNION SELECT 'MyDatabase3'
UNION SELECT 'MyDatabase4'

-- your databases List

DECLARE @COUNT INT =0 ,  @RN INT =1, @SCRIPT NVARCHAR(MAX)='',  @DBNAME VARCHAR(200)

PRINT '---------------------FULL BACKUP SCRIPT-------------------------'+CHAR(10)
SET @COUNT = (SELECT COUNT(*) FROM #back)
PRINT 'USE MASTER'+CHAR(10)
WHILE(@COUNT > = @RN)
BEGIN

SET @DBNAME =(SELECT DatabaseName FROM #back WHERE RN=@RN)
SET @SCRIPT ='BACKUP DATABASE ' +'['+@DBNAME+']'+CHAR(10)+'TO DISK =N'''+@PATH+@DBNAME+ N'_Backup_'
+ REPLACE ( REPLACE ( REPLACE ( REPLACE ( CAST ( CAST ( GETDATE () AS DATETIME2 ) AS VARCHAR ( 100 )), '-' , '_' ), ' ' , '_' ), '.' , '_' ), ':' , '' )+'.bak'''+CHAR(10)+'WITH COMPRESSION, STATS = 10'+CHAR(10)+'GO'+CHAR(10)
PRINT @SCRIPT
SET @RN=@RN+1
END

 PRINT '---------------------DIFF BACKUP SCRIPT-------------------------'+CHAR(10)

  SET  @COUNT  =0 SET  @RN  =1 SET @SCRIPT ='' SET @DBNAME =''
 SET @COUNT = (SELECT COUNT(*) FROM #back)
PRINT 'USE MASTER'+CHAR(10)
WHILE(@COUNT > = @RN)
BEGIN
SET @DBNAME =(SELECT DatabaseName FROM #back WHERE RN=@RN)
SET @SCRIPT ='BACKUP DATABASE ' +'['+@DBNAME+']'+CHAR(10)+'TO DISK =N'''+@PATH+@DBNAME+ N'_Backup_'
+ REPLACE ( REPLACE ( REPLACE ( REPLACE ( CAST ( CAST ( GETDATE () AS DATETIME2 ) AS VARCHAR ( 100 )), '-' , '_' ), ' ' , '_' ), '.' , '_' ), ':' , '' )+'.diff'''+CHAR(10)+'WITH DIFFERENTIAL, COMPRESSION, STATS = 10'+CHAR(10)+'GO'+CHAR(10)
PRINT @SCRIPT
SET @RN=@RN+1
END
Sagar Mahajan
la source
-10

Si vous pouvez trouver les fichiers DB ... "cp DBFiles backup /"

Presque à coup sûr pas conseillé dans la plupart des cas , mais c'est simple comme tout.

BCS
la source
1
Ne faites PAS cela si SQL Server est en cours d'exécution, même si rien ne l'utilise.
Craig Trader
6
Les chances d'utiliser cette méthode pour réussir la sauvegarde et la restauration d'une base de données sont très minces. Cela ne fonctionnera que SI, pendant la sauvegarde et la restauration: aucun processus SQL Server n'est en cours d'exécution, vous identifiez et copiez TOUS les fichiers binaires impliqués, vous exécutez EXACTEMENT la même version et le même niveau de correctif de SQL Server (et / ou Les fenêtres). Le format de fichier de sauvegarde est conçu pour être portable entre plusieurs versions; les fichiers de base de données binaires ne le sont PAS. Cela est vrai pour TOUTES les bases de données, pas seulement pour SQL Server. Ne fais pas ça. VRAIMENT. NE FAITES PAS CELA.
Craig Trader
Cette réponse est à 98,7% une blague. OTOH si vous ne restaurez que sur la même configuration exacte (aka restauration / retour) et qu'il peut être arrêté (c'est un serveur de développement local) et probablement quelques autres choses ...
BCS