SQL sunucu veritabanlarını yedeklemek için basit bir komut satırı programı veya komut dosyası nedir?


94

Dahili sunucularımızda DB yedeklemeleri yapmak konusunda çok gevşek davrandım.

SQL Server 2005'te belirli veritabanlarını yedeklemek için kullanabileceğim basit bir komut satırı programı var mı? Veya basit bir VBScript var mı?


6
Kişisel olarak, limon siparişi uygulamaları ve turuncu hizmetlerin talimatlarında çok daha şanslıyım. Komut kireç programları, değerlerinden çok daha fazla sorundur.
Jim

Yanıtlar:


108

Komut satırından tek bir veritabanını yedeklemek için osql veya sqlcmd kullanın .

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

YEDEKLEME ve GERİ YÜKLEME ile ilgili belgeleri ve genel prosedürleri de okumak isteyeceksiniz .


3
Tüm kullanıcı veritabanlarını tek seferde yedeklemek için iyi bir komut dosyası var: mssqltips.com/tip.asp?tip=1070
Marnix van Valen

7
Belgeler WITH FORMAT, depolama ortamını biçimlendirdiğini söylüyor : " BİÇİMLENDİR seçeneği, mevcut içeriği yok sayarak tüm ortam içeriğini geçersiz kılar. " İstediğinizin bu olduğundan emin olun.
alexg

4
@Tjaart, Bu yüzden önce belgeleri okumamı söyledim. FORMAT İLE kullanmazsanız ve mevcut bir yedekleme dosyasını seçerseniz, yeni yedekleme, dosyadaki mevcut yedeklemelere eklenir ve bu sizin istediğiniz gibi olmayabilir.
Craig Trader

@Kiquenet Bzzzzzt - Bu bir GUI ürünü olurdu ve bu nedenle, orijinal soruya göre basit bir komut satırı programı veya komut dosyası değil.
Craig Trader

Benim yüklemesinde osql.exeolduC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Matthew Lock

9

Kullandığım ExpressMaint .

Örneğin tüm kullanıcı veritabanlarını yedeklemek için:

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

1
Meixger, SQLBackupAndFTP akla gelebilecek her senaryoda onu

8

Tüm Veritabanlarını yedeklemek için aşağıdakileri planlayın:

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)

Blogumda daha fazla ayrıntı var: SQL Server Express Yedeklemelerini Otomatikleştirme .


Nasıl programlanacağını detaylandırır mısın?
Frank Krueger

Lütfen Blog Yazımı okuyun. Bilmeniz gereken her şeyi ayrıntılarıyla anlatıyor.
GateKiller

Sanırım soru SQL Server dışında çalışan bir şey istiyor .
bzlm

@bzlm, Dediğim gibi. Blogumda bunun SQL Server dışında nasıl yapılacağına dair ayrıntılar var :)
GateKiller

1
@GateKiller Blog bağlantınız hala geçerli mi? Onu açmak alamıyorum
Yash Saraiya

5

Bunu bir Microsoft Destek sayfasında http://support.microsoft.com/kb/2019698 buldum .

Harika çalışıyor! Ve Microsoft'tan geldiğinden beri, oldukça yasal olduğunu hissediyorum.

Temelde iki adım var.

  1. Ana veritabanınızda bir saklı yordam oluşturun. Msft bağlantısına bakın veya bozuksa buradan deneyin: http://pastebin.com/svRLkqnq
  2. Yedeklemeyi görev zamanlayıcınızdan planlayın. Önce bir .bat veya .cmd dosyasına koyup ardından bu dosyayı planlamak isteyebilirsiniz.

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

Açıkça YOUR_SERVER_NAME yerine bilgisayar adınızı yazın veya isteğe bağlı olarak. \ SQLEXPRESS'i deneyin ve yedekleme klasörünün var olduğundan emin olun. Bu durumda onu c: \ SQL_Backup içine koymaya çalışıyor


1
Ne olursa olsun, yukarıdaki yöntemi , dba topluluğu arasında çok saygı gördüğünü düşündüğüm ola.hallengren.com'dan gelen şeylerle uyumlu bir şekilde kullandım . Büyüleyici çalışıyor.
John W.

5

Yedekleme uygulamasını ApexSQL ile kullanabilirsiniz. Bir GUI uygulaması olmasına rağmen, CLI'de desteklenen tüm özelliklerine sahiptir. Tek seferlik yedekleme işlemleri gerçekleştirmek veya belirli veritabanlarını düzenli olarak yedekleyecek bir iş oluşturmak mümkündür. Anahtar kurallarını kontrol edebilir ve makalelerde örneklendirebilirsiniz:


4

MSSQL veritabanlarına erişmek için Linux / UNIX altyapısında tsql kullanıyorum. Bir tabloyu bir dosyaya dökmek için basit bir kabuk betiği:

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

3

–E anahtarının belirttiği gibi güvenilir bir bağlantınız yoksa

Aşağıdaki komut satırını kullanın

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

Nerede

[program dizini] osql.exe dosyasının bulunduğu dizindir

32bit OS'de c: \ Program Files \ Microsoft SQL Server \
64bit OS üzerinde c: \ Program Files (x86) \ Microsoft SQL Server \

[sql server version] sql server version 110 veya 100 veya 90 veya 80 en büyük sayıyla başlar

[sunucu] sunucu adınız veya sunucu ipiniz

[oturum açma kimliği] ms-sql sunucusu kullanıcı oturum açma adınız

[parola] gerekli oturum açma parolası


1
C:\tmpyol sunucuda mı yoksa yerel mi?
Kiquenet

yedekler her zaman sunucunun disklerinde saklanır, bu nedenle c: \ tmp sunucuda
George Vrynios

1

Microsoft'un SQL Express'teki tüm kullanıcı veritabanlarını yedeklemeye cevabı burada :

Süreç şudur: kodlarını kopyalayın, yapıştırın ve çalıştırın (aşağıya bakın. En üstte garip bir şekilde yorumlanmamış bazı satırları yorumladım) veritabanı sunucunuzda bir sorgu olarak. Bu, önce SQL Server Management Studio'yu kurmanız (veya başka bir şekilde veritabanı sunucunuza SSMS ile bağlanmanız) gerektiği anlamına gelir. Bu kod yürütme, veritabanı sunucunuzda bir saklı yordam oluşturacaktır.

Depolanan yordamı yürütmek için bir toplu iş dosyası oluşturun, ardından bu toplu iş dosyasının periyodik (örneğin her gece) çalışmasını planlamak için Görev Zamanlayıcı'yı kullanın. Kodum (işe yarayan), ilk örneklerinin biraz değiştirilmiş bir sürümü:

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

Bu benim için çalıştı ve hoşuma gitti. Her çalıştırdığınızda, yeni yedekleme dosyaları oluşturulur. Eski yedekleme dosyalarını rutin olarak silmek için bir yöntem geliştirmeniz gerekecektir. Zaten bu tür şeyleri yapan bir rutinim var, bu yüzden diskte birkaç günlük yedek tutacağım (normal yedekleme rutinim tarafından yedeklenmeleri için yeterince uzun), sonra onları sileceğim. Diğer bir deyişle, yedekleme sistemimden geri yükleme yapmak zorunda kalmadan her zaman elimde birkaç günlük yedeklemeye sahip olacağım.

Microsoft'un saklı yordam oluşturma komut dosyasını aşağıya yapıştıracağım:

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

Tam olarak bu amaç için yazdığım bir VB Script'i kullanabilirsiniz: https://github.com/ezrarieben/mssql-backup-vbs/

Komut dosyasını istediğiniz gibi çalıştırmak için "Görev Zamanlayıcı" da bir görev planlayın ve tüm DB'yi bir BAK dosyasına yedekleyecek ve belirttiğiniz yere kaydedecektir.


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 dosyalarını bulabilirseniz ... "cp DBFiles backup /"

Neredeyse kesin olarak çoğu durumda tavsiye edilmez , ancak her şey kadar basit.


1
SQL Server çalışıyorsa, onu hiçbir şey kullanmasa bile bunu YAPMAYIN.
Craig Trader

6
Bir veritabanını başarıyla yedeklemek ve geri yüklemek için bu yöntemi kullanma olasılığı çok düşüktür. Hem yedekleme hem de geri yükleme sırasında yalnızca IF çalışacaktır: hiçbir SQL Server işlemi çalışmıyorsa, ilgili TÜM ikili dosyaları tanımlar ve kopyalarsınız, tam olarak SQL Server'ın aynı sürümünü ve yama düzeyini (ve / veya Pencereler). Yedek dosya biçimi, sürümler arası taşınabilir olacak şekilde tasarlanmıştır; ikili veritabanı dosyaları DEĞİLDİR. Bu sadece SQL Server için değil TÜM veritabanları için geçerlidir. Sadece yapma. GERÇEKTEN Mİ. BUNU YAPMA.
Craig Trader

Bu cevap% 98.7 şaka. OTOH, yalnızca aynı kuruluma geri yükleyecekseniz (diğer adıyla geri yükleme / geri döndürme) ve kapatılabilir (diğer bir deyişle, yerel bir geliştirme sunucusu) ve muhtemelen birkaç başka şey ...
BCS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.