Что представляет собой простая программа или сценарий командной строки для резервного копирования баз данных SQL-сервера?

94

Я слишком небрежно выполнял резервное копирование БД на наших внутренних серверах.

Есть ли простая программа командной строки, которую я могу использовать для резервного копирования определенных баз данных в SQL Server 2005? Или есть простой VBScript?

Франк Крюгер
источник
6
Лично мне намного больше повезло с заказом лимонных приложений и инструкций по апельсиновым утилитам. Командные программы извести - гораздо больше проблем, чем они того стоят.
Джим

Ответы:

108

Для резервного копирования отдельной базы данных из командной строки используйте osql или 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"

Вы также захотите прочитать документацию по BACKUP и RESTORE и общим процедурам .

Крейг Трейдер
источник
3
Здесь есть хороший сценарий для резервного копирования всех пользовательских баз данных за один раз: mssqltips.com/tip.asp?tip=1070
Марникс ван Вален,
7
В документации указано, что WITH FORMATформатирует носитель: « Параметр FORMAT делает недействительным все содержимое мультимедиа, игнорируя любое существующее содержимое». Убедитесь, что это то, что вы хотите.
alexg
4
@Tjaart, вот почему я сказал сначала прочитать документацию. Если вы не используете WITH FORMAT и выбираете существующий файл резервной копии, то новая резервная копия будет добавлена ​​к существующей резервной копии в файле, что может быть не тем, что вам нужно.
Craig Trader
@Kiquenet Bzzzzzt - это будет продукт с графическим интерфейсом, а, следовательно, не простая программа или сценарий командной строки, согласно исходному запросу.
Craig Trader
на моей установке osql.exeбылC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Мэтью Лок
9

Я использую ExpressMaint .

Например, для резервного копирования всех пользовательских баз данных я делаю:

C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS
Мартин Мейксгер
источник
1
Мейксгер, я не могу найти ни одной причины для использования ExpressMaint, когда SQLBackupAndFTP превосходит его во всех мыслимых сценариях
8

Запланируйте следующее для резервного копирования всех баз данных:

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)

В моем блоге также есть более подробная информация: как автоматизировать резервное копирование SQL Server Express .

GateKiller
источник
Не могли бы вы рассказать, как составлять график?
Фрэнк Крюгер,
Пожалуйста, прочтите мой пост в блоге. В нем подробно описано все, что вам нужно знать.
GateKiller
Я думаю, что вопрос касается чего-то, что работает вне SQL Server.
bzlm
@bzlm, как я уже сказал. В моем блоге есть подробности о том, как это сделать вне SQL Server :)
GateKiller
1
@GateKiller. Ссылка на ваш блог еще действительна? Я не могу его открыть
Яш Сарайя
5

Я нашел это на странице поддержки Microsoft http://support.microsoft.com/kb/2019698 .

Отлично работает! И поскольку он был разработан Microsoft, я считаю, что это вполне законно.

В основном это два шага.

  1. Создайте хранимую процедуру в своей главной базе данных. См. Ссылку msft или, если она не работает, попробуйте здесь: http://pastebin.com/svRLkqnq
  2. Запланируйте резервное копирование в планировщике задач. Вы можете сначала поместить в файл .bat или .cmd, а затем запланировать этот файл.

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

Очевидно, замените YOUR_SERVER_NAME именем своего компьютера или, при желании, попробуйте. \ SQLEXPRESS и убедитесь, что папка резервной копии существует. В этом случае он пытается поместить его в c: \ SQL_Backup

Джон В.
источник
1
Как бы то ни было, я в конечном итоге использовал метод, описанный выше, совместно с материалами с ola.hallengren.com, которые, как мне кажется, очень уважаемы в сообществе dba. Это работает как шарм.
John W.
5

Вы можете использовать приложение резервного копирования от ApexSQL. Хотя это приложение с графическим интерфейсом пользователя, все его функции поддерживаются в интерфейсе командной строки. Можно либо выполнить одноразовые операции резервного копирования, либо создать задание, которое будет выполнять резервное копирование определенных баз данных на регулярной основе. Вы можете проверить правила переключения и примеры в статьях:

П. Томпсон
источник
4

Я использую tsql в инфраструктуре Linux / UNIX для доступа к базам данных MSSQL. Вот простой сценарий оболочки для выгрузки таблицы в файл:

#!/usr/bin/ksh
#
#.....
(
tsql -S {database} -U {user} -P {password} <<EOF
select * from {table}
go
quit
EOF
) >{output_file.dump}
Ира С
источник
3

В конечном итоге, если у вас нет доверенного соединения, как объявляет переключатель –E

Используйте следующую командную строку

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

куда

[программный каталог] - это каталог, в котором существует osql.exe.

В 32-битной ОС c: \ Program Files \ Microsoft SQL Server \
В 64-битной ОС c: \ Program Files (x86) \ Microsoft SQL Server \

[версия сервера sql] ваш сервер sql версии 110, 100, 90 или 80 начинается с наибольшего числа

[server] ваше имя сервера или IP-адрес сервера

[идентификатор входа] ваше имя пользователя для входа на сервер ms-sql

[пароль] требуемый пароль для входа

Георгий Вриниос
источник
1
C:\tmpпуть на сервере или локальный ?
Kiquenet
резервные копии всегда хранятся на дисках сервера, поэтому c: \ tmp находится на сервере
Джордж Вриниос
1

Ответ Microsoft на резервное копирование всех пользовательских баз данных в SQL Express находится здесь :

Процесс состоит в следующем: скопируйте, вставьте и выполните их код (см. Ниже. Я прокомментировал несколько странно не прокомментированных строк вверху) в качестве запроса на вашем сервере базы данных. Это означает, что вы должны сначала установить SQL Server Management Studio (или иным образом подключиться к серверу базы данных с помощью SSMS). Выполнение этого кода создаст хранимую процедуру на вашем сервере базы данных.

Создайте пакетный файл для выполнения хранимой процедуры, а затем используйте планировщик задач для планирования периодического (например, ночного) запуска этого пакетного файла. Мой код (который работает) - это немного измененная версия их первого примера:

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

У меня это сработало, и мне это нравится. Каждый раз, когда вы запускаете его, создаются новые файлы резервных копий. Вам нужно будет разработать метод удаления старых файлов резервных копий на регулярной основе. У меня уже есть такая процедура, поэтому я буду хранить резервные копии на пару дней на диске (достаточно долго для их резервного копирования с помощью обычной процедуры резервного копирования), а затем я удалю их. Другими словами, у меня всегда будут под рукой резервные копии на несколько дней без необходимости восстановления из моей системы резервного копирования.

Я вставлю ниже скрипт создания хранимой процедуры Microsoft:

--// 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
источник
0

Вы можете использовать сценарий VB, который я написал именно для этой цели: https://github.com/ezrarieben/mssql-backup-vbs/

Запланируйте задачу в «Планировщике заданий» для выполнения сценария по своему усмотрению, и он создаст резервную копию всей БД в файл BAK и сохранит его в любом месте.

Ezrarieben
источник
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

Если вы можете найти файлы БД ... "cp DBFiles backup /"

Почти наверняка не рекомендуется в большинстве случаев , но это просто, как и любой костюм.

БКС
источник
1
НЕ делайте этого, если SQL Server запущен, даже если его ничто не использует.
Craig Trader,
6
Шансы использования этого метода для успешного резервного копирования и восстановления базы данных очень малы. Он будет работать только в том случае, если во время резервного копирования и восстановления: процессы SQL Server не запущены, вы идентифицируете и копируете ВСЕ задействованные двоичные файлы, вы используете ТОЧНО ту же версию и уровень исправлений SQL Server (и / или Windows). Формат файла резервной копии рассчитан на переносимость между версиями; файлы двоичной базы данных НЕ. Это верно для ВСЕХ баз данных, а не только для SQL Server. Просто не делай этого. ДЕЙСТВИТЕЛЬНО. НЕ ДЕЛАЙТЕ ЭТОГО.
Craig Trader,
Этот ответ на 98,7% является шуткой. OTOH, если вы будете восстанавливать только ту же настройку (также известную как восстановление / возврат), и ее можно выключить (она же локальный сервер разработки) и, возможно, еще кое-что ...
BCS