Một chương trình hoặc tập lệnh dòng lệnh đơn giản để sao lưu cơ sở dữ liệu máy chủ SQL là gì?


94

Tôi đã quá lỏng lẻo với việc thực hiện sao lưu DB trên các máy chủ nội bộ của chúng tôi.

Có chương trình dòng lệnh đơn giản nào mà tôi có thể sử dụng để sao lưu cơ sở dữ liệu nhất định trong SQL Server 2005 không? Hay là có một VBScript đơn giản?


6
Cá nhân tôi may mắn hơn nhiều với các ứng dụng đặt hàng chanh và các tiện ích cam hướng dẫn. Các chương trình vôi lệnh rắc rối hơn nhiều so với giá trị của chúng.
Jim

Câu trả lời:


108

Để sao lưu một cơ sở dữ liệu từ dòng lệnh, hãy sử dụng osql hoặc 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"

Bạn cũng sẽ muốn đọc tài liệu về SAO LƯUKHÔI PHỤCcác quy trình chung .


3
Có một kịch bản tốt để sao lưu tất cả các cơ sở dữ liệu người dùng trong một đi ở đây: mssqltips.com/tip.asp?tip=1070
Marnix van Valen

7
Tài liệu nói rằng WITH FORMATđịnh dạng phương tiện lưu trữ: " Tùy chọn FORMAT làm mất hiệu lực của toàn bộ nội dung phương tiện, bỏ qua bất kỳ nội dung hiện có nào. " Đảm bảo đây là những gì bạn muốn.
alexg

4
@Tjaart, Đó là lý do tại sao tôi nói hãy đọc tài liệu trước. Nếu bạn không sử dụng WITH FORMAT và bạn chọn một tệp sao lưu hiện có, thì bản sao lưu mới sẽ được thêm vào (các) bản sao lưu hiện có trong tệp, đó có thể không phải là những gì bạn muốn.
Craig Trader vào

@Kiquenet Bzzzzzt - Đó sẽ là một sản phẩm GUI và do đó, không phải là một chương trình hoặc tập lệnh dòng lệnh đơn giản, theo yêu cầu ban đầu.
Craig Trader

trên cài đặt của tôi osql.exeđã ởC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Matthew Lock

9

Tôi sử dụng ExpressMaint .

Để sao lưu tất cả cơ sở dữ liệu người dùng, tôi làm ví dụ:

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

1
Meixger, tôi không thể tìm thấy một lý do duy nhất để sử dụng ExpressMaint, khi SQLBackupAndFTP nhịp đập nó trong mọi hoàn cảnh tưởng tượng

8

Lập lịch trình sau đây để sao lưu tất cả Cơ sở dữ liệu:

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)

Ngoài ra còn có nhiều chi tiết hơn trên blog của tôi: cách Tự động hóa sao lưu SQL Server Express .


Bạn có thể nói rõ hơn về cách lên lịch?
Frank Krueger 23/09/08

Vui lòng đọc Bài đăng trên Blog của tôi. Nó nêu chi tiết mọi thứ bạn cần biết.
GateKiller 23-08

Tôi nghĩ rằng câu hỏi yêu cầu một cái gì đó chạy bên ngoài SQL Server.
bzlm 16/09/09

@bzlm, Như tôi đã nói. Blog của tôi có chi tiết về cách làm việc bên ngoài này của SQL Server :)
GateKiller

1
@GateKiller Liên kết blog của bạn có còn hợp lệ không? Tôi không thể mở nó
Yash Saraiya

5

Tôi tìm thấy điều này trên trang Hỗ trợ của Microsoft http://support.microsoft.com/kb/2019698 .

Nó hoạt động tuyệt vời! Và vì nó đến từ Microsoft, tôi cảm thấy nó khá hợp pháp.

Về cơ bản có hai bước.

  1. Tạo một thủ tục được lưu trữ trong db chính của bạn. Xem liên kết msft hoặc nếu nó bị hỏng, hãy thử tại đây: http://pastebin.com/svRLkqnq
  2. Lên lịch sao lưu từ trình lập lịch tác vụ của bạn. Bạn có thể muốn đưa vào tệp .bat hoặc .cmd trước rồi lập lịch cho tệp đó.

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

Rõ ràng là thay thế YOUR_SERVER_NAME bằng tên máy tính của bạn hoặc tùy ý thử. \ SQLEXPRESS và đảm bảo rằng thư mục sao lưu tồn tại. Trong trường hợp này, nó đang cố gắng đưa nó vào c: \ SQL_Backup


1
Đối với những gì nó đáng giá, tôi đã kết thúc bằng cách sử dụng phương pháp trên kết hợp với những thứ từ ola.hallengren.com , người mà tôi nghĩ là rất được tôn trọng trong cộng đồng dba. Nó hoạt động như một sự quyến rũ.
John W.

5

Bạn có thể sử dụng ứng dụng sao lưu của ApexSQL. Mặc dù đó là một ứng dụng GUI, nó có tất cả các tính năng được hỗ trợ trong CLI. Có thể thực hiện các hoạt động sao lưu một lần hoặc tạo một công việc sao lưu các cơ sở dữ liệu được chỉ định một cách thường xuyên. Bạn có thể kiểm tra các quy tắc chuyển đổi và lấy mẫu trong các bài viết:


4

Tôi đang sử dụng tsql trên cơ sở hạ tầng Linux / UNIX để truy cập cơ sở dữ liệu MSSQL. Đây là một tập lệnh shell đơn giản để kết xuất một bảng vào một tệp:

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

3

Cuối cùng nếu bạn không có kết nối đáng tin cậy như công tắc –E khai báo

Sử dụng dòng lệnh sau

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

Ở đâu

[program dir] là thư mục chứa osql.exe

Trên hệ điều hành 32bit c: \ Program Files \ Microsoft SQL Server \
Trên hệ điều hành 64bit c: \ Program Files (x86) \ Microsoft SQL Server \

[phiên bản máy chủ sql] phiên bản máy chủ sql 110 hoặc 100 hoặc 90 hoặc 80 của bạn bắt đầu bằng số lớn nhất

[máy chủ] tên máy chủ hoặc ip máy chủ của bạn

[id đăng nhập] tên đăng nhập người dùng máy chủ ms-sql của bạn

[password] mật khẩu đăng nhập bắt buộc


1
C:\tmplà đường dẫn trong máy chủ hay cục bộ ?
Kiquenet

các bản sao lưu luôn được lưu trữ trong đĩa của máy chủ, vì vậy c: \ tmp ở trên máy chủ
George Vrynios

1

Câu trả lời của Microsoft để sao lưu tất cả cơ sở dữ liệu người dùng trên SQL Express là ở đây :

Quá trình này là: sao chép, dán và thực thi mã của chúng (xem bên dưới. Tôi đã nhận xét một số dòng không nhận xét kỳ lạ ở trên cùng) dưới dạng truy vấn trên máy chủ cơ sở dữ liệu của bạn. Điều đó có nghĩa là trước tiên bạn nên cài đặt SQL Server Management Studio (hoặc kết nối với máy chủ cơ sở dữ liệu của bạn bằng SSMS). Việc thực thi mã này sẽ tạo ra một thủ tục được lưu trữ trên máy chủ cơ sở dữ liệu của bạn.

Tạo một tệp hàng loạt để thực hiện quy trình đã lưu trữ, sau đó sử dụng Bộ lập lịch tác vụ để lên lịch chạy định kỳ (ví dụ: hàng đêm) cho tệp hàng loạt này. Mã của tôi (hoạt động) là một phiên bản sửa đổi một chút của ví dụ đầu tiên của họ:

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

Điều này đã làm việc cho tôi, và tôi thích nó. Mỗi lần bạn chạy nó, các tệp sao lưu mới sẽ được tạo. Bạn sẽ cần phải nghĩ ra một phương pháp xóa các tệp sao lưu cũ một cách thường xuyên. Tôi đã có một thói quen làm những việc như vậy, vì vậy tôi sẽ giữ các bản sao lưu có giá trị trong vài ngày trên đĩa (đủ lâu để chúng được sao lưu theo thói quen sao lưu thông thường của tôi), sau đó tôi sẽ xóa chúng. Nói cách khác, tôi sẽ luôn có sẵn các bản sao lưu có giá trị trong vài ngày mà không cần phải khôi phục từ hệ thống sao lưu của mình.

Tôi sẽ dán tập lệnh tạo thủ tục được lưu trữ của Microsoft bên dưới:

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

Bạn có thể sử dụng VB Script mà tôi đã viết chính xác cho mục đích này: https://github.com/ezrarieben/mssql-backup-vbs/

Lập lịch một tác vụ trong "Bộ lập lịch tác vụ" để thực thi tập lệnh theo ý muốn và nó sẽ sao lưu toàn bộ DB vào tệp BAK và lưu nó ở bất cứ đâu bạn chỉ định.


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

Nếu bạn có thể tìm thấy các tệp DB ... "cp DBFiles backup /"

Hầu như chắc chắn là không nên trong hầu hết các trường hợp , nhưng nó đơn giản như tất cả mọi thứ.


1
KHÔNG làm điều này nếu SQL Server đang chạy, ngay cả khi không có gì sử dụng nó.
Craig Trader

6
Tỷ lệ sử dụng phương pháp này để sao lưu và khôi phục cơ sở dữ liệu thành công là rất nhỏ. Nó sẽ chỉ hoạt động NẾU, trong cả quá trình sao lưu và khôi phục: không có quy trình SQL Server nào đang chạy, bạn xác định và sao chép TẤT CẢ các tệp nhị phân có liên quan, bạn đang chạy CHÍNH XÁC cùng phiên bản và cấp bản vá của SQL Server (và / hoặc Các cửa sổ). Định dạng tệp sao lưu được thiết kế để có thể di động giữa các phiên bản; các tệp cơ sở dữ liệu nhị phân KHÔNG. Điều này đúng với TẤT CẢ các cơ sở dữ liệu, không chỉ SQL Server. Đừng làm vậy. CÓ THẬT KHÔNG. KHÔNG LÀM ĐIỀU NÀY.
Craig Trader

Câu trả lời này 98,7% là một trò đùa. OTOH nếu bạn chỉ khôi phục về cùng một thiết lập (còn gọi là khôi phục / hoàn nguyên) và nó có thể bị tắt (còn gọi là máy chủ nhà phát triển cục bộ) và có thể là một số thứ khác ...
BCS 23/09/09
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.