Was ist ein einfaches Befehlszeilenprogramm oder -skript zum Sichern von SQL Server-Datenbanken?


94

Ich war zu lässig bei der Durchführung von DB-Sicherungen auf unseren internen Servern.

Gibt es ein einfaches Befehlszeilenprogramm, mit dem ich bestimmte Datenbanken in SQL Server 2005 sichern kann? Oder gibt es ein einfaches VBScript?


6
Persönlich habe ich viel mehr Glück mit der Bestellung von Zitronenanwendungen und Anweisungen für Orangen. Command Lime-Programme sind weitaus schwieriger als sie wert sind.
Jim

Antworten:


108

Verwenden Sie osql oder sqlcmd , um eine einzelne Datenbank über die Befehlszeile zu sichern .

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

Sie sollten auch die Dokumentation zu BACKUP und RESTORE sowie die allgemeinen Verfahren lesen .


3
Es gibt ein gutes Skript, um alle Benutzerdatenbanken auf einmal zu sichern: mssqltips.com/tip.asp?tip=1070
Marnix van Valen

6
In der Dokumentation heißt es, dass WITH FORMATdas Speichermedium formatiert wird: " Die Option FORMAT macht den gesamten Medieninhalt ungültig und ignoriert alle vorhandenen Inhalte. " Stellen Sie sicher, dass dies das ist, was Sie möchten.
Alexg

4
@ Tjaart, deshalb habe ich gesagt, zuerst die Dokumentation zu lesen. Wenn Sie WITH FORMAT nicht verwenden und eine vorhandene Sicherungsdatei auswählen, wird die neue Sicherung an die vorhandenen Sicherungen in der Datei angehängt, die möglicherweise nicht Ihren Wünschen entsprechen.
Craig Trader

@Kiquenet Bzzzzzt - Dies wäre ein GUI-Produkt und daher kein einfaches Befehlszeilenprogramm oder -skript gemäß der ursprünglichen Anfrage.
Craig Trader

auf meiner Installation osql.exewar inC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Matthew Lock

9

Ich benutze ExpressMaint .

Um alle Benutzerdatenbanken zu sichern, mache ich zum Beispiel:

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

1
Meixger, ich kann keinen einzigen Grund finden, ExpressMaint zu verwenden, wenn SQLBackupAndFTP es in jedem erdenklichen Szenario schlägt

8

Planen Sie Folgendes, um alle Datenbanken zu sichern:

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)

In meinem Blog finden Sie außerdem weitere Details: So automatisieren Sie SQL Server Express-Sicherungen .


Können Sie näher erläutern, wie Sie planen sollen?
Frank Krueger

Bitte lesen Sie meinen Blog-Beitrag. Es enthält alles, was Sie wissen müssen.
GateKiller

Ich denke, die Frage fragt nach etwas, das außerhalb von SQL Server läuft .
bzlm

@bzlm, wie ich schon sagte. Mein Blog enthält Details dazu außerhalb von SQL Server :)
GateKiller

1
@GateKiller Ist Ihr Blog-Link noch gültig? Ich kann es nicht öffnen
Yash Saraiya

5

Ich habe dies auf einer Microsoft Support-Seite http://support.microsoft.com/kb/2019698 gefunden .

Es funktioniert super! Und da es von Microsoft kam, denke ich, dass es ziemlich legitim ist.

Grundsätzlich gibt es zwei Schritte.

  1. Erstellen Sie eine gespeicherte Prozedur in Ihrer Master-Datenbank. Siehe msft Link oder wenn es kaputt ist, versuchen Sie es hier: http://pastebin.com/svRLkqnq
  2. Planen Sie die Sicherung von Ihrem Taskplaner aus. Möglicherweise möchten Sie zuerst eine .bat- oder .cmd-Datei einfügen und dann diese Datei planen.

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

Ersetzen Sie natürlich YOUR_SERVER_NAME durch Ihren Computernamen oder versuchen Sie es optional. \ SQLEXPRESS und stellen Sie sicher, dass der Sicherungsordner vorhanden ist. In diesem Fall wird versucht, es in c: \ SQL_Backup abzulegen


1
Für das, was es wert ist, habe ich die oben beschriebene Methode zusammen mit dem Material von ola.hallengren.com angewendet , das meiner Meinung nach in der dba-Community sehr geschätzt wird. Es funktioniert wie ein Zauber.
John W.

5

Sie können die Sicherungsanwendung von ApexSQL verwenden. Obwohl es sich um eine GUI-Anwendung handelt, werden alle Funktionen in CLI unterstützt. Es ist möglich, entweder einmalige Sicherungsvorgänge durchzuführen oder einen Job zu erstellen, mit dem bestimmte Datenbanken regelmäßig gesichert werden. Sie können die Schalterregeln überprüfen und in den Artikeln beispielhaft finden:


4

Ich verwende tsql in einer Linux / UNIX-Infrastruktur, um auf MSSQL-Datenbanken zuzugreifen. Hier ist ein einfaches Shell-Skript zum Speichern einer Tabelle in einer Datei:

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

3

Eventuell, wenn Sie keine vertrauenswürdige Verbindung haben, wie der Switch –E deklariert

Verwenden Sie die folgende Befehlszeile

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

Wo

[Programmverzeichnis] ​​ist das Verzeichnis, in dem die Datei osql.exe vorhanden ist

Unter 32-Bit-Betriebssystem c: \ Programme \ Microsoft SQL Server \
Unter 64-Bit-Betriebssystem c: \ Programme (x86) \ Microsoft SQL Server \

[SQL Server-Version] Ihre SQL Server-Version 110 oder 100 oder 90 oder 80 beginnt mit der größten Anzahl

[Server] Ihr Servername oder Ihre Server-IP

[Login-ID] Ihr MS-SQL Server-Benutzer-Login-Name

[Passwort] das erforderliche Login-Passwort


1
C:\tmpIst der Pfad im Server oder lokal ?
Kiquenet

Die Backups werden immer auf den Datenträgern des Servers gespeichert, sodass sich c: \ tmp auf dem Server befindet
George Vrynios

1

Die Antwort von Microsoft zum Sichern aller Benutzerdatenbanken in SQL Express finden Sie hier :

Der Prozess ist: Kopieren, Einfügen und Ausführen des Codes (siehe unten. Ich habe oben einige seltsam nicht kommentierte Zeilen kommentiert) als Abfrage auf Ihrem Datenbankserver. Das heißt, Sie sollten zuerst das SQL Server Management Studio installieren (oder auf andere Weise mit SSMS eine Verbindung zu Ihrem Datenbankserver herstellen). Diese Codeausführung erstellt eine gespeicherte Prozedur auf Ihrem Datenbankserver.

Erstellen Sie eine Batchdatei, um die gespeicherte Prozedur auszuführen, und verwenden Sie dann den Taskplaner, um einen regelmäßigen (z. B. nächtlichen) Lauf dieser Batchdatei zu planen. Mein Code (der funktioniert) ist eine leicht modifizierte Version ihres ersten Beispiels:

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

Das hat bei mir funktioniert und ich mag es. Jedes Mal, wenn Sie es ausführen, werden neue Sicherungsdateien erstellt. Sie müssen eine Methode zum routinemäßigen Löschen alter Sicherungsdateien entwickeln. Ich habe bereits eine Routine, die so etwas macht, also werde ich Backups im Wert von ein paar Tagen auf der Festplatte aufbewahren (lang genug, damit sie von meiner normalen Backup-Routine gesichert werden), und sie dann löschen. Mit anderen Worten, ich habe immer Backups im Wert von ein paar Tagen zur Hand, ohne sie von meinem Backup-System wiederherstellen zu müssen.

Ich werde das Skript zur Erstellung gespeicherter Prozeduren von Microsoft unten einfügen:

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

Sie könnten ein VB-Skript verwenden, das ich genau für diesen Zweck geschrieben habe: https://github.com/ezrarieben/mssql-backup-vbs/

Planen Sie eine Aufgabe im "Task Scheduler", um das Skript nach Ihren Wünschen auszuführen. Die gesamte Datenbank wird in einer BAK-Datei gesichert und an einer beliebigen Stelle gespeichert.


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

Wenn Sie die DB-Dateien finden können ... "cp DBFiles backup /"

Fast sicher nicht ratsam in den meisten Fällen , aber es ist einfach wie alles aufstehen.


1
Tun Sie dies NICHT, wenn SQL Server ausgeführt wird, auch wenn nichts verwendet wird.
Craig Trader

6
Die Chancen, mit dieser Methode eine Datenbank erfolgreich zu sichern und wiederherzustellen, sind sehr gering. Dies funktioniert nur, wenn sowohl während der Sicherung als auch der Wiederherstellung keine SQL Server-Prozesse ausgeführt werden. Sie identifizieren und kopieren ALLE beteiligten Binärdateien. Sie führen genau dieselbe Version und Patch-Ebene von SQL Server (und / oder) aus Windows). Das Sicherungsdateiformat ist so konzipiert, dass es versionübergreifend portabel ist. Die binären Datenbankdateien sind NICHT. Dies gilt für ALLE Datenbanken, nicht nur für SQL Server. Tu es einfach nicht. JA WIRKLICH. MACH DAS NICHT.
Craig Trader

Diese Antwort ist zu 98,7% ein Witz. OTOH, wenn Sie nur das exakt gleiche Setup wiederherstellen (auch bekannt als Wiederherstellen / Zurücksetzen) und es heruntergefahren werden kann (auch bekannt als lokaler Entwickler-Server) und wahrscheinlich ein paar andere Dinge ...
BCS
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.