Co to jest prosty program wiersza poleceń lub skrypt do tworzenia kopii zapasowych baz danych serwera SQL?

94

Byłem zbyt niedbały w wykonywaniu kopii zapasowych bazy danych na naszych wewnętrznych serwerach.

Czy istnieje prosty program wiersza polecenia, którego mogę użyć do tworzenia kopii zapasowych niektórych baz danych w programie SQL Server 2005? A może istnieje prosty VBScript?

Frank Krueger
źródło
6
Osobiście mam dużo większe szczęście, jeśli chodzi o zamawianie aplikacji z cytryną i instrukcje dotyczące pomarańczowych narzędzi. Programy Command Lime są o wiele bardziej kłopotliwe niż warte.
Jim

Odpowiedzi:

108

Aby wykonać kopię zapasową pojedynczej bazy danych z wiersza poleceń, użyj osql lub 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"

Będziesz także chciał przeczytać dokumentację dotyczącą tworzenia kopii zapasowych i przywracania oraz ogólnych procedur .

Craig Trader
źródło
3
Tutaj jest dobry skrypt do tworzenia kopii zapasowych wszystkich baz danych użytkowników za jednym razem: mssqltips.com/tip.asp?tip=1070
Marnix van Valen
7
Dokumentacja mówi, że WITH FORMATformatuje nośnik danych: „ Opcja FORMAT unieważnia całą zawartość multimedialną, ignorując wszelkie istniejące treści. ” Upewnij się, że tego chcesz.
alexg
4
@Tjaart, Dlatego powiedziałem, że najpierw przeczytaj dokumentację. Jeśli nie używasz Z FORMATEM i wybierzesz istniejący plik kopii zapasowej, nowa kopia zapasowa zostanie dołączona do istniejących kopii zapasowych w pliku, co może nie być tym, czego chcesz.
Craig Trader
@Kiquenet Bzzzzzt - To byłby produkt z graficznym interfejsem użytkownika, a zatem nie prosty program lub skrypt wiersza poleceń, zgodnie z pierwotnym zapytaniem.
Craig Trader
na mojej instalacji osql.exebyłaC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Matthew Lock
9

Używam ExpressMaint .

Aby wykonać kopię zapasową wszystkich baz danych użytkowników, na przykład:

C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS
Martin Meixger
źródło
1
Meixger, nie mogę znaleźć ani jednego powodu, by używać ExpressMaint, skoro SQLBackupAndFTP bije go w każdym możliwym scenariuszu
8

Zaplanuj wykonanie kopii zapasowych wszystkich baz danych:

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)

Więcej szczegółów znajduje się na moim blogu: jak zautomatyzować kopie zapasowe SQL Server Express .

GateKiller
źródło
Czy możesz wyjaśnić, jak zaplanować?
Frank Krueger,
Przeczytaj mój post na blogu. Zawiera szczegółowe informacje o wszystkim, co musisz wiedzieć.
GateKiller
Myślę, że pytanie dotyczy czegoś, co działa poza SQL Server.
bzlm
@bzlm, jak powiedziałem. Mój blog zawiera szczegółowe informacje o tym, jak to zrobić poza SQL Server :)
GateKiller
1
@GateKiller Czy link do Twojego bloga jest nadal ważny? Nie mogę go otworzyć
Yash Saraiya,
5

Znalazłem to na stronie pomocy technicznej firmy Microsoft http://support.microsoft.com/kb/2019698 .

Działa świetnie! A ponieważ pochodzi od Microsoftu, czuję, że jest całkiem legalny.

Zasadniczo są dwa kroki.

  1. Utwórz procedurę składowaną w swojej głównej bazie danych. Zobacz link msft lub, jeśli jest uszkodzony, spróbuj tutaj: http://pastebin.com/svRLkqnq
  2. Zaplanuj kopię zapasową z harmonogramu zadań. Możesz najpierw umieścić w pliku .bat lub .cmd, a następnie zaplanować ten plik.

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

Oczywiście zamień YOUR_SERVER_NAME na nazwę swojego komputera lub opcjonalnie spróbuj. \ SQLEXPRESS i upewnij się, że folder kopii zapasowej istnieje. W tym przypadku próbuje umieścić go w c: \ SQL_Backup

John W.
źródło
1
Co jest warte, zastosowałem powyższą metodę w połączeniu z materiałami z ola.hallengren.com, który moim zdaniem jest bardzo szanowany w społeczności dba. Działa jak urok.
John W.
5

Możesz skorzystać z aplikacji do tworzenia kopii zapasowych ApexSQL. Chociaż jest to aplikacja z interfejsem graficznym, ma wszystkie funkcje obsługiwane w interfejsie CLI. Możliwe jest wykonanie jednorazowych operacji tworzenia kopii zapasowych lub utworzenie zadania, które będzie regularnie tworzyć kopie zapasowe określonych baz danych. Możesz sprawdzić zasady przełączania i przykłady w artykułach:

P.Thompson
źródło
4

Używam tsql w infrastrukturze Linux / UNIX, aby uzyskać dostęp do baz danych MSSQL. Oto prosty skrypt powłoki, który zrzuca tabelę do pliku:

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

Ostatecznie, jeśli nie masz zaufanego połączenia, jak deklaruje przełącznik –E

Użyj następującego wiersza poleceń

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

Gdzie

[katalog programu] to katalog, w którym istnieje plik osql.exe

W 32-bitowym systemie operacyjnym c: \ Program Files \ Microsoft SQL Server \
W 64-bitowym systemie operacyjnym c: \ Program Files (x86) \ Microsoft SQL Server \

[wersja serwera sql] wersja serwera sql 110 lub 100, 90 lub 80 zaczyna się od największej liczby

[serwer] nazwa serwera lub adres IP

[identyfikator logowania] nazwa logowania użytkownika serwera ms-sql

[hasło] wymagane hasło logowania

George Vrynios
źródło
1
C:\tmpto ścieżka na serwerze czy lokalna ?
Kiquenet
kopie zapasowe są zawsze przechowywane na dyskach serwera, więc c: \ tmp jest na serwerze
George Vrynios
1

Odpowiedź firmy Microsoft na tworzenie kopii zapasowych wszystkich baz danych użytkowników w SQL Express jest tutaj :

Proces jest następujący: skopiuj, wklej i wykonaj ich kod (patrz poniżej. Skomentowałem kilka dziwnie niekomentowanych wierszy na górze) jako zapytanie na serwerze bazy danych. Oznacza to, że należy najpierw zainstalować SQL Server Management Studio (lub w inny sposób połączyć się z serwerem bazy danych za pomocą programu SSMS). To wykonanie kodu spowoduje utworzenie procedury składowanej na serwerze bazy danych.

Utwórz plik wsadowy, aby wykonać procedurę składowaną, a następnie użyj Harmonogramu zadań, aby zaplanować okresowe (np. Nocne) uruchamianie tego pliku wsadowego. Mój kod (który działa) to nieco zmodyfikowana wersja ich pierwszego przykładu:

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

To zadziałało dla mnie i podoba mi się. Za każdym razem, gdy go uruchamiasz, tworzone są nowe pliki kopii zapasowych. Musisz wymyślić metodę rutynowego usuwania starych plików kopii zapasowych. Mam już procedurę, która robi tego typu rzeczy, więc zachowam kopie zapasowe na kilka dni na dysku (wystarczająco długo, aby zostały one zarchiwizowane przez moją normalną procedurę tworzenia kopii zapasowych), a następnie je usunę. Innymi słowy, zawsze będę mieć pod ręką kopie zapasowe na kilka dni bez konieczności przywracania danych z systemu kopii zapasowych.

Wkleję poniżej skrypt tworzenia procedury składowanej Microsoftu:

--// 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
źródło
0

Możesz użyć skryptu VB, który napisałem dokładnie w tym celu: https://github.com/ezrarieben/mssql-backup-vbs/

Zaplanuj zadanie w „Harmonogramie zadań”, aby wykonać skrypt tak, jak chcesz, a utworzy on kopię zapasową całej bazy danych do pliku BAK i zapisze go w dowolnym miejscu.

ezrarieben
źródło
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
źródło
-10

Jeśli możesz znaleźć pliki DB ... "cp DBFiles backup /"

Prawie na pewno nie jest to wskazane w większości przypadków , ale jest to proste jak każdy strój.

BCS
źródło
1
NIE rób tego, jeśli SQL Server jest uruchomiony, nawet jeśli nic go nie używa.
Craig Trader
6
Szanse na użycie tej metody do pomyślnego tworzenia kopii zapasowych i przywracania bazy danych są bardzo niewielkie. Będzie działać tylko wtedy, gdy zarówno podczas tworzenia kopii zapasowej, jak i przywracania: żadne procesy SQL Server nie są uruchomione, zidentyfikujesz i skopiujesz WSZYSTKIE zaangażowane pliki binarne, uruchomisz DOKŁADNIE tę samą wersję i poziom poprawki SQL Server (i / lub Windows). Format pliku kopii zapasowej jest przeznaczony do przenoszenia między różnymi wersjami; binarne pliki bazy danych NIE są. Dotyczy to WSZYSTKICH baz danych, nie tylko SQL Server. Po prostu tego nie rób. NAPRAWDĘ. NIE RÓB TEGO.
Craig Trader
Ta odpowiedź w 98,7% to żart. OTOH, jeśli przywracasz tylko do dokładnie tej samej konfiguracji (czyli przywracania / przywracania) i można go zamknąć (aka jest to lokalny serwer deweloperski) i prawdopodobnie kilka innych rzeczy ...
BCS