SQL सर्वर डेटाबेस बैकअप के लिए एक साधारण कमांड लाइन प्रोग्राम या स्क्रिप्ट क्या है?


94

मैं हमारे आंतरिक सर्वरों पर DB बैकअप करने के साथ बहुत ढीला हो गया हूं।

वहाँ एक साधारण कमांड लाइन कार्यक्रम है कि मैं SQL Server 2005 में कुछ डेटाबेस का बैकअप लेने के लिए उपयोग कर सकता हूं? या एक साधारण VBScript है?


6
व्यक्तिगत रूप से, मेरे पास ऑर्डर नींबू अनुप्रयोगों और अनुदेश नारंगी उपयोगिताओं के साथ कहीं बेहतर भाग्य है। कमांड लाइम प्रोग्राम वैसे ही अधिक परेशान करने वाले होते हैं जितना वे लायक होते हैं।
जिम

जवाबों:


108

कमांड लाइन से एकल डेटाबेस का बैकअप लेने के लिए, ऑस्कल या एसक्यूएलसीएमडी का उपयोग करें ।

"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
Marnix van Valen

7
प्रलेखन का कहना है कि WITH FORMATभंडारण माध्यम को प्रारूपित करता है: " किसी भी मौजूदा सामग्री को अनदेखा करते हुए FORMAT विकल्प संपूर्ण मीडिया सामग्री को अमान्य कर देता है। " सुनिश्चित करें कि आप यही चाहते हैं।
अलेग्ज १०'१२ को

4
@ टार्टार्ट, यही कारण है कि मैंने पहले प्रलेखन को पढ़ने के लिए कहा। यदि आप FORMAT का उपयोग नहीं करते हैं और आप एक मौजूदा बैकअप फ़ाइल चुनते हैं, तो नया बैकअप मौजूदा बैकअप (s) फ़ाइल में जोड़ा जाएगा, जो कि आप नहीं चाहते।
क्रेग ट्रेडर

@Kiquenet Bzzzzzt - यह एक GUI उत्पाद होगा, और इसलिए मूल पूछने के लिए एक साधारण कमांड लाइन प्रोग्राम या स्क्रिप्ट नहीं है।
क्रेग ट्रेडर

मेरी स्थापना पर 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
Meixger, मुझे 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 सर्वर एक्सप्रेस बैकअप को स्वचालित कैसे करें ।


क्या आप अनुसूची के बारे में विस्तार से बता सकते हैं?
फ्रैंक क्रुएगर

कृपया मेरी ब्लॉग पोस्ट पढ़ें। यह आपको जानने के लिए आवश्यक हर चीज का विवरण देता है।
गेटकिलर

मुझे लगता है कि प्रश्न SQL सर्वर के बाहर चलने वाली चीज़ के लिए पूछता है ।
15

@bzlm, जैसा मैंने कहा। मेरे ब्लॉग में एसक्यूएल सर्वर के बाहर ऐसा करने के बारे में विवरण है :)
गेटकेलर

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 द्वारा बैकअप एप्लिकेशन का उपयोग कर सकते हैं। हालाँकि यह एक GUI एप्लिकेशन है, लेकिन इसमें CLI में समर्थित सभी सुविधाएँ हैं। यह संभव है कि या तो एक बार बैकअप संचालन करना, या एक नौकरी बनाना जो नियमित आधार पर निर्दिष्ट डेटाबेस का बैकअप लेगा। आप स्विच नियमों की जांच कर सकते हैं और लेखों में जांच कर सकते हैं:


4

मैं MSSQL डेटाबेस का उपयोग करने के लिए एक लिनक्स / यूनिक्स बुनियादी ढांचे पर tsql का उपयोग कर रहा हूं। फ़ाइल को तालिका को डंप करने के लिए यहां एक सरल शेल स्क्रिप्ट है:

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

3

यदि आपके पास विश्वसनीय कनेक्शन नहीं है, तो -ई स्विच की घोषणा के रूप में

कमांड लाइन का उपयोग करें

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

कहाँ पे

[कार्यक्रम dir] वह निर्देशिका है जहां osql.exe मौजूद है

32bit OS c पर: \ Program Files \ Microsoft SQL Server \
64bit OS c पर: \ Program Files (x86) \ Microsoft SQL Server \

[sql सर्वर संस्करण] आपका sql सर्वर संस्करण ११० या १०० या ९ ० या ]० सबसे बड़ी संख्या के साथ शुरू होता है

[सर्वर] आपका सर्वरनाम या सर्वर आईपी

[लॉगिन आईडी] आपका एमएस-एसक्यूएल सर्वर उपयोगकर्ता लॉगिन नाम

[पासवर्ड] आवश्यक लॉगिन पासवर्ड


1
C:\tmpसर्वर या स्थानीय में पथ है ?
किकेटनेट

बैकअप हमेशा सर्वर के डिस्क में संग्रहीत होते हैं, इसलिए c: \ tmp सर्वर पर होता है
जॉर्ज Vrynios

1

SQL एक्सप्रेस पर सभी उपयोगकर्ता डेटाबेस का बैकअप लेने के लिए Microsoft का जवाब यहाँ है :

प्रक्रिया यह है: अपने डेटाबेस सर्वर पर एक प्रश्न के रूप में उनके कोड को कॉपी, पेस्ट करें, और उनके कोड को निष्पादित करें (नीचे देखें। मैंने शीर्ष पर कुछ गैर-टिप्पणी की गई लाइनों पर टिप्पणी की है)। इसका मतलब है कि आपको पहले SQL सर्वर प्रबंधन स्टूडियो स्थापित करना चाहिए (या अन्यथा एसएसएमएस के साथ अपने डेटाबेस सर्वर से कनेक्ट करें)। यह कोड निष्पादन आपके डेटाबेस सर्वर पर एक संग्रहीत कार्यविधि बनाएगा।

संग्रहीत कार्यविधि को निष्पादित करने के लिए एक बैच फ़ाइल बनाएं, फिर इस बैच फ़ाइल की आवधिक (जैसे रात) चलाने के लिए कार्य शेड्यूलर का उपयोग करें। मेरा कोड (जो काम करता है) उनके पहले उदाहरण का थोड़ा संशोधित संस्करण है:

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/

अपनी पसंद के अनुसार स्क्रिप्ट निष्पादित करने के लिए "टास्क शेड्यूलर" में एक कार्य को शेड्यूल करें और यह संपूर्ण DB को एक 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 बैकअप /"

लगभग सभी मामलों में निश्चित रूप से उचित नहीं है , लेकिन यह सभी गेटअप के रूप में सरल है।


1
यदि SQL सर्वर चल रहा है, तो भी ऐसा न करें, भले ही कुछ भी इसका उपयोग न कर रहा हो।
क्रेग ट्रेडर

6
इस पद्धति का सफलतापूर्वक बैकअप लेने और डेटाबेस को पुनर्स्थापित करने की संभावना बहुत पतली है। यह केवल तभी काम करेगा जब बैकअप और रीस्टोर दोनों के दौरान: कोई SQL सर्वर प्रक्रिया नहीं चल रही हो, आप सभी बाइनरी फ़ाइलों को पहचानें और उनकी प्रतिलिपि बनाएँ, आप SQL सर्वर (और / या) के समान संस्करण और पैच-लेवल पर चल रहे हैं। खिड़कियाँ)। बैकअप फ़ाइल प्रारूप को क्रॉस-संस्करण पोर्टेबल होने के लिए डिज़ाइन किया गया है; बाइनरी डेटाबेस फाइलें नहीं हैं। यह सभी डेटाबेस का सच है, न कि केवल SQL सर्वर। बस यह मत करो। वास्तव में। यह मत करो।
क्रेग ट्रेडर

यह जवाब 98.7% एक मजाक है। OTOH यदि आप केवल एक ही सेटअप (उर्फ रिस्टोर / रीवरिंग) के लिए बहाल हो रहे हैं और इसे बंद किया जा सकता है (उर्फ यह एक स्थानीय देव सर्वर है) और शायद कुछ अन्य चीजें ...
BCS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.