SQL Server 2008 Express - Giải pháp sao lưu tốt nhất?


20

Những giải pháp sao lưu nào bạn muốn giới thiệu khi sử dụng SQL Server 2008 Express ? Tôi khá mới với SQL Server, nhưng khi tôi đến từ nền tảng MySQL, tôi đã nghĩ đến việc thiết lập sao chép trên một máy tính khác và chỉ cần sao lưu Xcopy của máy chủ đó.

Nhưng thật không may, sao chép không có sẵn trong Express Edition.

Trang web được truy cập rất nhiều, do đó không có sự chậm trễ và thời gian chết. Tôi cũng đang nghĩ đến việc thực hiện sao lưu hai lần một ngày hoặc một cái gì đó.

Bạn muốn giới thiệu gì? Tôi có nhiều máy tính tôi có thể sử dụng, nhưng tôi không biết điều đó có giúp tôi không vì tôi đang sử dụng phiên bản Express.


Có ai biết nếu có vấn đề với chỉ sử dụng Windows Server Backup để làm điều này?
James

Câu trả lời:


30

SQL Server Express 2008 hỗ trợ sao lưu cơ sở dữ liệu. Nó thiếu SQL Agent, cho phép lên lịch sao lưu và trình hướng dẫn kế hoạch bảo trì để tạo một tác vụ sao lưu.

Bạn có thể sao lưu cơ sở dữ liệu theo hai cách khác nhau:

  1. Sử dụng Microsoft SQL Server Management Studio Express có tùy chọn Sao lưu trên menu chuột phải cho mỗi cơ sở dữ liệu trong "tác vụ".
  2. Sử dụng T-SQL để tự viết kịch bản sao lưu của bạn. Đọc tài liệu MSDN cho lệnh BACKUP T-SQL .
    Cú pháp gì đó như:BACKUP DATABASE MyDatabase TO DISK='C:\MyDatabase.bak';

Nếu bạn muốn lên lịch cho các công việc sao lưu của mình, bạn phải viết một tập lệnh T-SQL và sau đó sử dụng Lịch trình tác vụ của Windows để gọi SQLCmd để chạy tập lệnh theo những gì mọi lịch trình bạn quan tâm:

 sqlcmd -s server_name\sqlexpress -i C:\SqlJobs\backup.sql -o C:\Logs\output.txt

1
Cú pháp BACKUP trông giống như thế này: BACKUP DATABASE MyDatabase TO DISK = 'C: \ MyDatabase.bak';
Martin Marconcini

Cảm ơn thông tin này các bạn, tôi sẽ thử nó.
alexn

khi sử dụng tập lệnh T-sql, hãy đảm bảo tên db của bạn không chứa dấu cách.
redknight

+1 Thêm một chút thông tin: Đừng quên đề cập đến tên ví dụ thông qua -S ".\SomeInstance"nếu bạn gặp lỗi đăng nhập từ sqlcmd.
Tomalak

Nó sẽ hữu ích, cho phần còn lại của chúng tôi đến câu hỏi này để tìm câu trả lời tương tự, nếu bạn bao gồm SQL bạn sử dụng để chạy bản sao lưu.
Ian Boyd

6

Tôi sử dụng SQLBackupAndFTP - sản phẩm tuyệt vời và đơn giản.


sqlbackupandftp là tốt nhất .. nếu bạn muốn quay lại + nén + tự động xóa (sau những ngày được chỉ định)
suraj jain

Có tôi cũng sử dụng cái này. Hoạt động tốt.
Alan B

5

Tôi đã được viết kịch bản sao lưu để sử dụng cho bản thân mình, cài đặt như được đề cập trong bài viết của splattne :

----- Version: 2.0 - 2009-12-12 - SQL 2000 Compatible
----- Pham Kim Ngan (jbngan@gmail.com)
----- Usage:
-- Copy 7za.exe (http://www.7-zip.org/download.html - Command Line Version) to @CFG_BACKUP_PATH
-- Modify @CFG_BACKUP_PATH = <Backup Store Path> - no long filename/directory please
-- Modify @CFG_DAYS_DELETE = Days to keep backups
-- Enable 'xp_cmdshell' (SQL 2005/EXPRESS or higher)

----- Configuration Variables
DECLARE @CFG_BACKUP_PATH NVARCHAR(256)
DECLARE @CFG_DAYS_DELETE INT

SET @CFG_BACKUP_PATH = 'C:\DatabaseBackup'
SET @CFG_DAYS_DELETE = 30

DECLARE @Today DATETIME
DECLARE @TodayName CHAR(8)
SET @Today = GETDATE()
SET @TodayName = CONVERT(CHAR(8), @Today, 112)

DECLARE @id INT
DECLARE @name VARCHAR(50)
DECLARE @path VARCHAR(256)
DECLARE @cmd VARCHAR(256)

----- Create Temporarity Directory
DECLARE @TempDir VARCHAR(256)
SET @TempDir = @CFG_BACKUP_PATH + '\' + CONVERT(VARCHAR(256), NEWID())
SET @cmd = 'md ' + @TempDir
EXEC xp_cmdshell @cmd, no_output

----- List of current databases, only 'ONLINE' databases to be backup
DECLARE @dbList TABLE
    (
      dbno INT IDENTITY,
      dbname NVARCHAR(256)
    )

INSERT  INTO @dbList ( dbname )
        SELECT  name
        FROM    master.dbo.sysdatabases
        WHERE   ( name NOT IN ( 'tempdb' ) )
                AND DATABASEPROPERTYEX(name, 'Status') = 'ONLINE'


------ Starting backup, one by one
SELECT  @id = dbno,
        @name = dbname
FROM    @dbList
WHERE   dbno = 1
WHILE @@ROWCOUNT = 1
    BEGIN
        PRINT N'++ Backup: ' + @name
        SET @path = @TempDir + '\' + @name + '.bak'

        BACKUP DATABASE @name TO DISK = @path

        SELECT  @id = dbno,
                @name = dbname
        FROM    @dbList
        WHERE   dbno = @id + 1
    END

PRINT N'++ Compressing: ' + @TempDir

----- Delete output file if existed
SET @cmd = 'del /f /q ' + @CFG_BACKUP_PATH + '\' + @TodayName + '.ZIP'
EXEC xp_cmdshell @cmd, no_output

DECLARE @Count INT
DECLARE @StartTime DATETIME
SET @StartTime = GETDATE()
----- Compress, -mx1 = Set Compression Ratio to 1 (very low)
SET @cmd = @CFG_BACKUP_PATH + '\7za.exe a -bd -y -tzip -mx1 '
SET @cmd = @cmd + @CFG_BACKUP_PATH + '\' + @TodayName + '.ZIP ' + @TempDir + '\*.bak"'
EXEC xp_cmdshell @cmd, no_output

SET @Count = DATEDIFF(second, @StartTime, GETDATE())
PRINT N'++ Compression Time: ' + CONVERT(VARCHAR, @Count) + ' seconds'
SET @Count = DATEDIFF(second, @Today, GETDATE())
PRINT N'++ Total Execution Time: ' + CONVERT(VARCHAR, @Count) + ' seconds'

---- Delete temporarity directory
SET @cmd = 'rd /s /q ' + @TempDir
EXEC xp_cmdshell @cmd, no_output

---- Delete previous backup versions
DECLARE @OlderDateName CHAR(8)
SET @OlderDateName = CONVERT(CHAR(8), @Today - @CFG_DAYS_DELETE, 112)

----- List all .ZIP files
CREATE TABLE #delList
    (
      subdirectory VARCHAR(256),
      depth INT,
      [file] BIT
    )
INSERT  INTO #delList
        EXEC xp_dirtree @CFG_BACKUP_PATH, 1, 1
DELETE  #delList
WHERE   RIGHT(subdirectory, 4) <> '.ZIP'

SELECT  @Count = COUNT(1)
FROM    #delList
PRINT N'++ Number of Backups: ' + CONVERT(NVARCHAR, @Count)

SELECT TOP 1
        @name = subdirectory
FROM    #delList
WHERE   LEN(subdirectory) = 12
        AND RIGHT(subdirectory, 4) = '.ZIP'
        AND REPLACE(subdirectory, '.ZIP', '') < @OlderDateName

WHILE ( @@ROWCOUNT = 1 ) 
    BEGIN
        PRINT N'++ Delete Older Backup: ' + @name
        SET @cmd = 'del /f /q ' + @CFG_BACKUP_PATH + '\' + @name
        EXEC xp_cmdshell @cmd, no_output

        DELETE  #delList
        WHERE   subdirectory = @name

        SELECT TOP 1
                @name = subdirectory
        FROM    #delList
        WHERE   LEN(subdirectory) = 12
                AND RIGHT(subdirectory, 4) = '.ZIP'
                AND REPLACE(subdirectory, '.ZIP', '') < @OlderDateName
    END

DROP TABLE #delList

PRINT N'++ Done.'
PRINT ''
PRINT ''
PRINT ''

2

Tôi sử dụng ExpressMaint và nó hoạt động tuyệt vời như một tác vụ theo lịch trình. Chỉ cần vượt qua các tham số thích hợp cho loại công việc bạn đang làm.

Mã nguồn cũng ở ngoài đó. Chúng tôi đã thay đổi nó một chút để thêm một mục trong nhật ký sự kiện ứng dụng khi thất bại.


1

Dựa trên bài đăng của UndertheFold, tôi đã thực hiện một số thông tin và tìm thấy các chi tiết về ExpressMaint. Tôi chưa từng thấy điều này trước đây, vì vậy tôi rất vui mừng khi tìm thấy nó.

FYI, trang web là, http://expressmaint.codeplex.com/

Sau đó, tôi đã sử dụng một trong những ví dụ mà tôi tìm thấy để tạo tệp bó này mà tôi đã lên lịch để chạy qua đêm mỗi ngày.

c:\expressmaint\expressmaint -S (local)\SQLExpress -D ALL_USER -T DB -R E:\backups\sqlexpress\backupreports -RU WEEKS -RV 1 -B E:\backups\sqlexpress -BU DAYS -BV 4 -V -C

Điều này cần một bản sao lưu, giữ mỗi bản sao lưu ( -BU) trong bốn ngày, do đó bạn có được lịch sử nếu có tham nhũng. Các bản ghi ( -RU) được giữ trong một tuần.

Tôi mới chỉ sử dụng được vài tuần, nhưng tôi rất hài lòng với nó, vì đây là một cách tiếp cận thực tiễn. Tại địa phương tôi đặt các bản sao lưu vào đĩa thứ hai, sau đó tôi sử dụng JungleDisk để thực hiện sao lưu ngoại vi vào bộ lưu trữ đám mây Amazon EC2 .


Vấn đề với expressmaint là nó không hỗ trợ SQL Server 2008 R2. Nó sẽ hoạt động với 2008 và nó sẽ hoạt động nếu bạn cài đặt 2008 và sau đó nâng cấp lên 2008 R2, nhưng nó sẽ không tìm thấy cơ sở dữ liệu trên bản cài đặt mới của 2008 R2. Đó là một lỗi đã biết với một bản vá được gửi nhưng tệp thực thi chưa được cập nhật với bản vá.
James

1

Bạn có thể sử dụng DBSave . Đây là một công cụ phần mềm miễn phí tuyệt vời để sao lưu và khôi phục MS SQL Server. Nó rất đơn giản để thiết lập và sử dụng.


0

Tôi đang sử dụng một công việc lập lịch trình windows để sao lưu cơ sở dữ liệu SQL Server express mỗi vài giờ bằng cách sử dụng một tệp bó. Có vẻ để làm việc tốt.


Bạn cũng nên đề cập đến cách một tệp bó sao lưu cơ sở dữ liệu.
Ian Boyd

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.