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?
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?
Antworten:
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 .
WITH FORMAT
das 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.
osql.exe
war inC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
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
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 .
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.
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
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:
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}
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
C:\tmp
Ist der Pfad im Server oder lokal ?
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
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.
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
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.