Che cos'è un semplice programma o script della riga di comando per eseguire il backup dei database del server SQL?


94

Sono stato troppo negligente nell'eseguire i backup del DB sui nostri server interni.

Esiste un semplice programma a riga di comando che posso utilizzare per eseguire il backup di determinati database in SQL Server 2005? O c'è un semplice VBScript?


6
Personalmente, ho molta più fortuna con le applicazioni order lemon e le utility orange di istruzioni. I programmi di comando lime sono molto più problemi di quanto valgano.
Jim,

Risposte:


108

Per eseguire il backup di un singolo database dalla riga di comando, utilizzare osql o 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"

Ti consigliamo inoltre di leggere la documentazione su BACKUP e RESTORE e le procedure generali .


3
C'è un buon script per eseguire il backup di tutti i database degli utenti in uno, vai qui: mssqltips.com/tip.asp?tip=1070
Marnix van Valen,

7
La documentazione dice che WITH FORMATformatta il supporto di memorizzazione: " L'opzione FORMAT invalida l'intero contenuto del supporto, ignorando qualsiasi contenuto esistente. " Assicurati che questo sia ciò che desideri.
alexg

4
@ Tjaart, ecco perché ho detto di leggere prima la documentazione. Se non utilizzi WITH FORMAT e scegli un file di backup esistente, il nuovo backup verrà aggiunto ai backup esistenti nel file, il che potrebbe non essere quello che desideri.
Craig Trader

@Kiquenet Bzzzzzt - Sarebbe un prodotto GUI, e quindi, non un semplice programma o script a riga di comando, secondo la domanda originale.
Craig Trader

sulla mia installazione osql.exeera inC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Matthew Lock

9

Uso ExpressMaint .

Per eseguire il backup di tutti i database degli utenti, ad esempio:

C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS

1
Meixger, non riesco a trovare una sola ragione per usare ExpressMaint, quando SQLBackupAndFTP lo batte in ogni scenario immaginabile

8

Pianificare quanto segue per eseguire il backup di tutti i database:

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)

Ci sono anche ulteriori dettagli sul mio blog: come automatizzare i backup di SQL Server Express .


Puoi spiegarci come programmare?
Frank Krueger,

Si prega di leggere il mio post sul blog. Descrive in dettaglio tutto ciò che devi sapere.
GateKiller

Penso che la domanda chieda qualcosa che viene eseguito al di fuori di SQL Server.
bzlm

@bzlm, come ho detto. Il mio blog contiene dettagli su come eseguire questa operazione al di fuori di SQL Server :)
GateKiller

1
@GateKiller Il link del tuo blog è ancora valido? Non riesco ad aprirlo
Yash Saraiya

5

Ho trovato questo in una pagina del supporto Microsoft http://support.microsoft.com/kb/2019698 .

Funziona benissimo! E poiché proviene da Microsoft, mi sento come se fosse abbastanza legittimo.

Fondamentalmente ci sono due passaggi.

  1. Crea una stored procedure nel tuo database master. Vedi il link msft o se è rotto prova qui: http://pastebin.com/svRLkqnq
  2. Pianifica il backup dal tuo pianificatore di attività. Potresti voler prima inserire un file .bat o .cmd e quindi pianificare quel file.

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

Ovviamente sostituisci YOUR_SERVER_NAME con il nome del tuo computer o opzionalmente prova. \ SQLEXPRESS e assicurati che la cartella di backup esista. In questo caso sta cercando di metterlo in c: \ SQL_Backup


1
Per quello che vale, ho finito per usare il metodo sopra in concerto con il materiale di ola.hallengren.com che penso sia molto rispettato dalla comunità dba. Funziona come un incantesimo.
John W.

5

È possibile utilizzare l'applicazione di backup di ApexSQL. Sebbene sia un'applicazione GUI, ha tutte le sue funzionalità supportate nella CLI. È possibile eseguire operazioni di backup una tantum o creare un lavoro che esegua regolarmente il backup dei database specificati. Puoi controllare le regole di cambio ed esempio negli articoli:


4

Sto usando tsql su un'infrastruttura Linux / UNIX per accedere ai database MSSQL. Ecco un semplice script di shell per eseguire il dump di una tabella in un file:

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

3

Eventuale se non si dispone di una connessione attendibile come dichiara lo switch –E

Usa la seguente riga di comando

"[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]

Dove

[program dir] è la directory in cui esiste osql.exe

Su sistema operativo a 32 bit c: \ Programmi \ Microsoft SQL Server \
Su sistema operativo a 64 bit c: \ Programmi (x86) \ Microsoft SQL Server \

[versione server sql] la versione 110 o 100 o 90 o 80 del server sql inizia con il numero più grande

[server] il tuo nome server o IP del server

[ID di accesso] il nome di accesso dell'utente del server ms-sql

[password] la password di accesso richiesta


1
C:\tmpè il percorso nel server o locale ?
Kiquenet

i backup sono sempre archiviati nei dischi del server, quindi c: \ tmp è sul server
George Vrynios

1

La risposta di Microsoft al backup di tutti i database utente su SQL Express è qui :

Il processo è: copia, incolla ed esegui il loro codice (vedi sotto. Ho commentato alcune righe stranamente non commentate in alto) come una query sul tuo server database. Ciò significa che devi prima installare SQL Server Management Studio (o altrimenti connetterti al tuo server di database con SSMS). Questa esecuzione di codice creerà una procedura memorizzata sul server del database.

Creare un file batch per eseguire la procedura memorizzata, quindi utilizzare l'Utilità di pianificazione per pianificare un'esecuzione periodica (ad es. Notturna) di questo file batch. Il mio codice (che funziona) è una versione leggermente modificata del loro primo esempio:

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

Questo ha funzionato per me e mi piace. Ogni volta che lo esegui, vengono creati nuovi file di backup. Avrai bisogno di escogitare un metodo per eliminare i vecchi file di backup su base regolare. Ho già una routine che fa questo genere di cose, quindi terrò un paio di giorni di backup su disco (abbastanza a lungo da consentirne il backup con la mia normale routine di backup), quindi li cancellerò. In altre parole, avrò sempre a disposizione alcuni giorni di backup senza dover eseguire il ripristino dal mio sistema di backup.

Incollare lo script di creazione della stored procedure di Microsoft di seguito:

--// 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


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

-10

Se riesci a trovare i file DB ... "cp DBFiles backup /"

Quasi sicuramente non è consigliabile nella maggior parte dei casi , ma è semplice come tutti i getup.


1
NON farlo se SQL Server è in esecuzione, anche se non viene utilizzato da nulla.
Craig Trader,

6
Le probabilità di utilizzare questo metodo per eseguire correttamente il backup e il ripristino di un database sono molto scarse. Funzionerà solo SE, sia durante il backup che durante il ripristino: nessun processo SQL Server è in esecuzione, si identificano e copiano TUTTI i file binari coinvolti, si esegue ESATTAMENTE la stessa versione e livello di patch di SQL Server (e / o Finestre). Il formato del file di backup è progettato per essere portabile tra versioni diverse; i file di database binari NON lo sono. Questo è vero per TUTTI i database, non solo per SQL Server. Basta non farlo. VERAMENTE. NON FARLO.
Craig Trader,

Questa risposta è per il 98,7% uno scherzo. OTOH se ripristinerai solo la stessa identica configurazione (ovvero ripristino / ripristino) e può essere spento (ovvero è un server di sviluppo locale) e probabilmente alcune altre cose ...
BCS
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.