โปรแกรมหรือสคริปต์บรรทัดคำสั่งง่ายๆในการสำรองฐานข้อมูลเซิร์ฟเวอร์ 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
มีสคริปต์ที่ดีในการสำรองฐานข้อมูลผู้ใช้ทั้งหมดในครั้งเดียวที่นี่: mssqltips.com/tip.asp?tip=1070
Marnix van Valen

7
เอกสารระบุว่าWITH FORMATจัดรูปแบบสื่อบันทึกข้อมูล: " ตัวเลือก FORMAT ทำให้เนื้อหาสื่อทั้งหมดเป็นโมฆะโดยไม่สนใจเนื้อหาที่มีอยู่ " ตรวจสอบให้แน่ใจว่านี่คือสิ่งที่คุณต้องการ
alexg

4
@Tjaart นั่นคือเหตุผลที่บอกว่าให้อ่านเอกสารก่อน หากคุณไม่ได้ใช้กับ FORMAT และคุณเลือกไฟล์สำรองที่มีอยู่ข้อมูลสำรองใหม่จะถูกต่อท้ายกับข้อมูลสำรองที่มีอยู่ในไฟล์ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ
Craig Trader

@Kiquenet Bzzzzzt - นั่นจะเป็นผลิตภัณฑ์ GUI ดังนั้นจึงไม่ใช่โปรแกรมหรือสคริปต์บรรทัดคำสั่งธรรมดา ๆ ตามการถามดั้งเดิม
Craig Trader

ในการติดตั้งของฉันosql.exeคือในC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Matthew Lock

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 เอ็กซ์เพรสเซิร์ฟเวอร์สำรองข้อมูล


คุณสามารถอธิบายวิธีการจัดตารางเวลา
Frank Krueger

โปรดอ่านบล็อกโพสต์ของฉัน รายละเอียดทุกสิ่งที่คุณจำเป็นต้องรู้
GateKiller

ฉันคิดว่าคำถามถามถึงบางสิ่งที่ทำงานนอก SQL Server
bzlm

@bzlm อย่างที่บอก บล็อกของฉันมีรายละเอียดเกี่ยวกับวิธีการทำสิ่งนี้นอก SQL Server :)
GateKiller

1
@GateKiller ลิงค์บล็อกของคุณยังใช้ได้หรือไม่? ฉันไม่สามารถเปิดได้
Yash Saraiya

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 แม้ว่าจะเป็นแอปพลิเคชัน GUI แต่ก็มีคุณสมบัติทั้งหมดที่รองรับใน 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]

ที่ไหน

[program dir] คือไดเร็กทอรีที่มี osql.exe อยู่

บนระบบปฏิบัติการ 32 บิต c: \ Program Files \ Microsoft SQL Server \
บน 64 บิต OS 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) การเรียกใช้โค้ดนี้จะสร้างโพรซีเดอร์ที่เก็บไว้บนเซิร์ฟเวอร์ฐานข้อมูลของคุณ

สร้างไฟล์แบตช์เพื่อดำเนินการตามขั้นตอนที่จัดเก็บจากนั้นใช้ Task Scheduler เพื่อกำหนดเวลาการรันไฟล์แบตช์นี้เป็นระยะ รหัสของฉัน (ที่ใช้งานได้) เป็นเวอร์ชันที่ปรับเปลี่ยนเล็กน้อยของตัวอย่างแรก:

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/

กำหนดเวลางานใน "Task Scheduler" เพื่อเรียกใช้สคริปต์ตามที่คุณต้องการและจะสำรองฐานข้อมูลทั้งหมดไปยังไฟล์ 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 กำลังทำงานแม้ว่าจะไม่มีอะไรใช้งานก็ตาม
Craig Trader

6
โอกาสในการใช้วิธีนี้เพื่อสำรองและกู้คืนฐานข้อมูลได้สำเร็จนั้นบางมาก จะใช้งานได้เฉพาะ IF ในระหว่างการสำรองข้อมูลและการกู้คืน: ไม่มีกระบวนการ SQL Server ทำงานอยู่คุณระบุและคัดลอกไฟล์ไบนารีทั้งหมดที่เกี่ยวข้องคุณกำลังเรียกใช้เวอร์ชันเดียวกันและระดับแพตช์ของ SQL Server (และ / หรือ Windows) รูปแบบไฟล์สำรองได้รับการออกแบบให้พกพาข้ามเวอร์ชัน ไฟล์ฐานข้อมูลไบนารีไม่ใช่ นี่เป็นความจริงสำหรับฐานข้อมูลทั้งหมดไม่ใช่เฉพาะ SQL Server เพียงแค่ไม่ทำมัน จริงๆ. อย่าทำอย่างนี้.
Craig Trader

คำตอบนี้ 98.7% เป็นเรื่องตลก OTOH หากคุณจะกู้คืนเป็นการตั้งค่าเดียวกันทั้งหมดเท่านั้น (เรียกอีกอย่างว่าการกู้คืน / การย้อนกลับ) และสามารถปิดได้ (หรือที่เรียกว่าเป็นเซิร์ฟเวอร์ dev ในเครื่อง) และอาจเป็นอย่างอื่นอีกสองสามอย่าง ...
BCS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.