Що таке проста програма або сценарій командного рядка для резервного копіювання баз даних сервера SQL?


94

Я був надто розхитаний із виконанням резервних копій БД на наших внутрішніх серверах.

Чи існує проста програма командного рядка, яку я можу використовувати для резервного копіювання певних баз даних у SQL Server 2005? Або існує простий VBScript?


6
Особисто мені набагато більше пощастило із замовленням лимонних аплікацій та інструкціями щодо апельсинових програм. Програми Command lime - це набагато більше проблем, ніж вони варті.
Джим,

Відповіді:


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"

Ви також захочете прочитати документацію щодо РЕЗЕРВУВАННЯ та ВІДНОВЛЕННЯ та загальні процедури .


3
Тут є хороший сценарій для резервного копіювання всіх баз даних користувача одним рухом
Marnix van Valen

7
У документації йдеться про WITH FORMATформатування носія інформації: " Параметр FORMAT робить недійсною весь вміст мультимедіа, ігноруючи будь-який наявний вміст. " Переконайтеся, що це саме те, що ви хочете.
alexg

4
@Tjaart, ось чому я сказав спочатку прочитати документацію. Якщо ви не використовуєте WITH FORMAT і вибрали існуючий файл резервної копії, тоді нова резервна копія буде додана до існуючих резервних копій у файлі, що може бути не тим, що ви хочете.
Крейг Трейдер

@Kiquenet Bzzzzzt - це буде продукт із графічним інтерфейсом, а отже, не проста програма або сценарій командного рядка, відповідно до оригінального запиту.
Крейг Трейдер

на моїй установці 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

Я думаю, що питання запитує щось, що працює поза 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. Це працює як шарм.
Джон У.

5

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


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 починається з найбільшого числа

[сервер] ваше ім'я сервера або ip сервера

[ідентифікатор входу] ваше ім'я для входу користувача сервера ms-sql

[пароль] необхідний пароль для входу


1
C:\tmpшлях на сервері чи локальний ?
Kiquenet

резервні копії завжди зберігаються на дисках сервера, тому c: \ tmp знаходиться на сервері
George Vrynios,

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

0

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

Заплануйте завдання в "Планувальнику завдань", щоб виконати сценарій, як вам подобається, і він зробить резервну копію всієї БД у файлі BAK і збереже її, де б ви не вказали.


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

Якщо ви можете знайти файли DB ... "cp DBFiles backup /"

Майже напевно не рекомендується в більшості випадків , але це просто, як і всі випадки.


1
НЕ робіть цього, якщо працює SQL Server, навіть якщо він нічим не користується.
Крейг Трейдер

6
Шанси використання цього методу для успішного створення резервної копії та відновлення бази даних дуже малі. Це працюватиме Тільки, ЩО під час резервного копіювання та відновлення: жоден процес SQL Server не запущений, ви ідентифікуєте та копіюєте ВСІ задіяні двійкові файли, ви працюєте ТОЧНО ту саму версію та рівень виправлення SQL Server (та / або Windows). Формат файлу резервної копії розроблений для перенесення між версіями; файли двійкової бази даних НЕ. Це стосується ВСІХ баз даних, а не лише SQL Server. Тільки не роби цього. РЕАЛЬНО. НЕ РОБИ ЦЬОГО.
Крейг Трейдер

Ця відповідь - 98,7% жарт. OTOH, якщо ви будете лише відновлювати до тих самих налаштувань (він же відновлення / відновлення), і його можна вимкнути (він же локальний сервер розробників) і, можливо, ще кілька речей ...
BCS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.