2008-09-23 9 views
82

Tôi đã quá lax 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.Một chương trình dòng lệnh hoặc tập lệnh đơn giản để sao lưu cơ sở dữ liệu máy chủ SQL là gì?

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

+5

Cá nhân, tôi có may mắn tốt hơn với các ứng dụng theo thứ tự chanh và tiện ích cam hướng dẫn. Các chương trình lệnh vôi là cách rắc rối hơn chúng đáng giá. – Jim

Trả lời

94

Để sao lưu một cơ sở dữ liệu đơn lẻ 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ề BACKUPRESTOREgeneral procedures.

+3

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

+0

Sử dụng SQLBackupAndFTP. Kiểm tra "Sao lưu tất cả cơ sở dữ liệu". Ngay cả các cơ sở dữ liệu được tạo sau này cũng sẽ được sao lưu. –

+6

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

8

Schedule sau đây để sao lưu tất cả cá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ó thêm chi tiết trên blog của tôi: làm thế nào để Automate SQL Server Express Backups.

+0

Bạn có thể giải thích về cách lên lịch không? –

+0

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

+0

Tôi nghĩ rằng câu hỏi yêu cầu cái gì đó chạy * bên ngoài * của SQL Server. – bzlm

-10

Nếu bạn có thể tìm thấy các tập tin DB ... "DBFiles cp sao lưu /"

Hầu như chắc chắn 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ả getup.

+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ó. –

+0

Tính năng này có hoạt động không? – bzlm

+5

Tỷ lệ cược của việc sử dụng phương pháp này để sao lưu thành công và khôi phục cơ sở dữ liệu rất mỏng. Nó sẽ chỉ làm việc IF, trong cả backup và restore: không có tiến 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à mức 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ó phiên bản di động chéo; 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ơ sở dữ liệu, không chỉ SQL Server. Chỉ cần không làm điều đó. CÓ THẬT KHÔNG. KHÔNG LÀM NÀY. –

8

Tôi sử dụng ExpressMaint.

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

C:> ExpressMaint.exe -S (địa phương) \ SQLEXPRESS -D ALL_USER -T DB -BU GIỜ -BV 1 -B c: \ backupdir \ -DS

+0

Meixger, tôi không thể tìm thấy một lý do duy nhất để sử dụng ExpressMaint, khi SQLBackupAndFTP đánh bại nó trong mọi kịch bản tưởng tượng –

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. Dưới đây là một kịch bản đơn giản để đổ 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} 
5

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

Nó hoạt động tuyệt vời! Và kể từ khi 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 quy trình đượ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ập lịch sao lưu từ công cụ lên lịch công việc của bạn. Bạn có thể muốn đưa vào tệp .bat hoặc .cmd trước và sau đó lên lịch 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 thay YOUR_SERVER_NAME với tên máy tính của bạn hoặc tùy chọn thử. \ SQLExpress và chắc chắn rằng thư mục sao lưu tồn tại.Trong trường hợp này nó đang cố gắng đặt 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 trong buổi hòa nhạc với nội dung từ https: //ola.hallengren. com/người mà tôi nghĩ là rất được kính trọng trong cộng đồng dba. Nó hoạt động như một sự quyến rũ. –

2

cuối cùng nếu bạn không có một kết nối đáng tin cậy như công tắc -E tuyên bố

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

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

[dir chương trình] là thư mục chứa osql.exe

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

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

[server] servername hoặc máy chủ của bạn ip

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

[mật khẩu] mật khẩu đăng nhập theo yêu cầu

+1

'C: \ tmp' là đường dẫn trong *** server *** hoặc *** local ***? – Kiquenet

2

Dưới đây là kịch bản đơn giản để thực hiện sao lưu cơ sở dữ liệu.

DECLARE @name VARCHAR(50) -- database name 
DECLARE @path VARCHAR(256) -- path for backup files 
DECLARE @fileName VARCHAR(256) -- filename for backup 
DECLARE @fileDate VARCHAR(20) -- used for file name 


-- specify database backup directory 
SET @path = 'C:\Backup\' 


-- specify filename format 
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) 


DECLARE db_cursor CURSOR FOR 
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name NOT IN ('master','model','msdb','tempdb') -- exclude these databases 


OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @name 


WHILE @@FETCH_STATUS = 0 
BEGIN 
     SET @fileName = @path + @name + '_' + @fileDate + '.BAK' 
     BACKUP DATABASE @name TO DISK = @fileName 


     FETCH NEXT FROM db_cursor INTO @name 
END 


CLOSE db_cursor 
DEALLOCATE db_cursor 
3

Bạn có thể sử dụng ứng dụng sao lưu bằng ApexSQL. Mặc dù nó là một ứng dụng GUI, nó có tất cả các tính năng của nó được hỗ trợ trong CLI. Có thể thực hiện các thao tác sao lưu một lần hoặc để tạo một công việc sẽ sao lưu 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à exampled trong các bài viết: