Làm cách nào tôi có thể sao lưu cơ sở dữ liệu SQL Server lớn mà không ảnh hưởng đến hiệu suất?


18

Chúng tôi đã có báo cáo về các truy vấn chạy chậm hoặc hết giờ vào sáng sớm và công việc duy nhất tôi thấy chạy mà tôi nghĩ có thể ảnh hưởng đến điều này là công việc sao lưu cơ sở dữ liệu của chúng tôi.

Cơ sở dữ liệu có dung lượng khoảng 300 GB và công việc sao lưu bắt đầu lúc 4:30 sáng và không hoàn thành cho đến sau 7:00 sáng. Cú pháp hiện tại của công việc sao lưu của chúng tôi là:

BACKUP DATABASE [DatabaseName]
TO DISK = N'E:\Database Backups\DatabaseName.Bak'
WITH INIT, NOUNLOAD, NAME = N'DatabaseName.Bak',
NOSKIP, STATS = 10, NOFORMAT

E:\ là một phân vùng trên máy chủ chứa cả cơ sở dữ liệu và bản sao lưu cơ sở dữ liệu.

Có lẽ cũng nên lưu ý rằng đây là một máy chủ ảo, không phải là một máy chủ độc lập chuyên dụng. Chúng tôi bắt đầu nhận được khiếu nại về sự chậm chạp trong quá trình sao lưu ngay sau khi chúng tôi chuyển sang một máy chủ ảo, vì vậy tôi nghĩ rằng nó có thể liên quan.

Có cách nào để chạy công việc sao lưu này để nó không ảnh hưởng đến hiệu năng truy vấn trong khi nó đang chạy không?

Chúng tôi đang sử dụng SQL Server 2005

Câu trả lời:


21
  1. Cô lập I / O dự phòng từ phần còn lại của I / O trên hệ thống của bạn. Mặc dù có thể mất nhiều thời gian hơn và dễ bị trục trặc hơn, sao lưu qua mạng thay vì vào một đĩa cục bộ có thể giúp giảm bớt tác động trực tiếp lên ví dụ. Ngay cả trong một máy ảo, bạn sẽ có thể tiết lộ bộ lưu trữ khác để SQL Server có thể ghi vào một hệ thống con I / O khác.
  2. Nó sẽ không thể tạo ra bất kỳ sự khác biệt nào, nhưng, nếu điều này được điều hành từ một công việc, tại sao bạn cần phải sử dụng STATStùy chọn? Bạn chắc chắn cần những tùy chọn khác ( NOUNLOAD, NOSKIP, NOFORMAT)? Tôi chưa thực hiện bất kỳ thử nghiệm hiệu suất mở rộng nào trên toàn bộ ma trận tùy chọn, nhưng IMHO bạn chỉ nên sử dụng các tùy chọn mà bạn biết bạn cần.
  3. Chạy các bản sao lưu đầy đủ của bạn tại một thời điểm khác không ảnh hưởng đến hoạt động của người dùng thông thường. Điều này không phải lúc nào cũng có thể, nhưng ngay cả trong các hoạt động 24/7 cũng có thời gian cao điểm và tạm lắng.
  4. Nếu bạn chuyển sang 2008+, bạn có thể tận dụng tính năng nén sao lưu (Enterprise trên 2008, Standard hoặc Enterprise trong 2008 R2 +). Nếu bạn không thể chuyển sang năm 2008 hoặc không có phiên bản phù hợp, có các công cụ sao lưu của bên thứ 3 sẽ thực hiện nén cho bạn và tất cả đều khá tốt. Từ năm 2008, tôi đã có thể sử dụng tính năng nén riêng và tôi khá hài lòng với cả tốc độ và% nén ở đó mà không cần phải đầu tư thêm vào bên thứ 3. Nhưng với năm 2005 tôi nhớ đã thành công tốt đẹp với Sao lưu SQL Cổng đỏ ; Quest LiteSpeed cũng khá tốt, nhưng tôi không biết loại nỗ lực nào được đưa vào nó kể từ khi mua lại Dell.
  5. Nếu cơ sở dữ liệu của bạn được khôi phục hoàn toàn, bạn có thể mất nhiều thời gian hơn giữa các bản sao lưu đầy đủ, giao dịch với kiến ​​thức rằng nếu bạn phải khôi phục đến một thời điểm, bạn có khả năng sẽ có nhiều nhật ký để khôi phục. Bạn có thể kết hợp tùy chọn này với đề xuất của Ali bên dưới về việc sử dụng diff trong suốt cả tuần - nếu bạn phải khôi phục vào thứ năm, bạn sẽ cần khôi phục đầy đủ 1, 1 diff và nhật ký kể từ diff.
  6. Nếu bạn có nhiều dữ liệu cũ và không thay đổi, bạn có thể xem xét việc lưu trữ dữ liệu đó trong một cơ sở dữ liệu khác với kế hoạch khôi phục khác hoặc ít nhất là trên các nhóm khác nhau và phân chia các hoạt động sao lưu của bạn theo cách đó. Nếu bạn có dữ liệu tham chiếu hoặc lưu trữ có thể ở chế độ chỉ đọc và nếu bạn đang trong quá trình khôi phục đơn giản, bạn có thể di chuyển dữ liệu đó đến tập tin chỉ đọc riêng của mình, sao lưu một lần và không phải đưa nó vào bản sao lưu hàng đêm của bạn bao giờ nữa Xem các chủ đề MSDN:

Thực hiện phục hồi từng phần

Ví dụ: Khôi phục Piecemeal chỉ một số nhóm (Mô hình khôi phục đơn giản)


Bạn có thể chỉ cho tôi đi đúng hướng để tìm hiểu thêm về cách ly I / O dự phòng với phần còn lại của I / O trong hệ thống không? # 3 (thay đổi thời gian sao lưu) không phải là một lựa chọn vì 4:30 sáng là thời điểm tốt nhất để chạy sao lưu và chúng tôi đã nói về việc nâng cấp lên 2008 (# 4), nhưng tôi không nghĩ điều đó sẽ xảy ra bất cứ lúc nào sớm
Rachel

Không chắc chắn làm thế nào để chỉ cho bạn đi đúng hướng - bạn có thể để lộ bộ nhớ khác cho máy ảo không?
Aaron Bertrand

Vâng, tôi nghĩ rằng chúng ta có thể tiết lộ lưu trữ khác cho máy ảo. Khi bạn nói "cách ly I / O dự phòng với phần còn lại của I / O trong hệ thống", bạn có đề cập đến việc sao lưu vào ổ đĩa mạng thay vì ổ đĩa không?
Rachel

3
Không, ý tôi là sao lưu bất kỳ hệ thống con I / O nào khác ngoài đĩa mà bạn cũng đồng thời thực hiện đọc và ghi cho cơ sở dữ liệu và hoạt động tempdb thông thường. Đây có thể là một ổ đĩa khác trên cùng một máy chủ, chia sẻ trên một máy khác, LUN khác trên SAN, chia sẻ trên NAS, v.v.
Aaron Bertrand

I Khôi phục từng phần là một giải pháp tuyệt vời mà tôi không nghĩ tới, cảm ơn vì đã đăng nó!
Ali Razeghi

8

Đây là một vấn đề phổ biến, có nhiều giải pháp và thực sự phụ thuộc vào môi trường của bạn. Hãy đi qua chúng:

1- Nén sao lưu khi đang bay

Trong năm 2008, nén sao lưu R1 đã có sẵn trong Enterprise, vào năm 2008R2, nó đã có sẵn trong Standard. Đây là LỚN. Nó sẽ giúp bạn tiết kiệm rất nhiều thời gian. Nếu bạn có thể nâng cấp đi cho nó. Nếu bạn không thể, hãy kiểm tra tiện ích HyperBak của RedGate hoặc Quest LiteSpeed . Cả hai đều có bản dùng thử miễn phí.

2- Sao lưu đầy đủ và khác

Tôi đã thừa hưởng cơ sở dữ liệu prod 2TB gây ra rất nhiều thời gian chờ cho một công ty internet lớn 24/7 mà tôi đã làm việc. Chúng tôi đã kích hoạt sao lưu đầy đủ và khác biệt giúp chúng tôi tiết kiệm rất nhiều thời gian. Tôi sẽ có một bản sao lưu đầy đủ vào Chủ nhật 12:00 sáng khi hoạt động thấp và mất nhiều thời gian trong tuần. Điều này tiết kiệm rất nhiều không gian. Công việc của Diff khác với nhật ký giao dịch khi chúng hoạt động trên những trang cơ sở dữ liệu nào đã được thay đổi. Bất kỳ trang thay đổi đều được sao lưu. Do đó, bạn thực hiện khôi phục đầy đủ, sau đó khôi phục khác để thêm các trang đã sửa đổi.

3- Nút cổ chai của bạn là gì?

Phân tích cổ chai là quan trọng để chẩn đoán. Bạn đang sao lưu vào cùng một mảng đĩa với các tệp dữ liệu của bạn? Là tập tin dữ liệu của bạn đang được chốt? DISK SEC / READ và DISK SEC / WRITE của bạn cho các đĩa dữ liệu trong quá trình sao lưu là gì? Tôi đã sửa đổi các bản sao lưu để tạo 4 tập tin. Mỗi tệp có trình soạn thảo luồng riêng và trong SAN của chúng tôi hoạt động rất tốt. Kiểm tra nó ra, tôi đã cạo sạch 45 phút bằng cách chỉ tạo 4 tệp sao lưu. Chỉ cần đảm bảo rằng số liệu đĩa của bạn được liệt kê ở trên là thấp. Lấy một đường cơ sở.

4- Sao chép sang một máy chủ khác và sao lưu

Cái này hơi tiên tiến. Bạn phải đảm bảo cơ sở dữ liệu nhân rộng của bạn được cập nhật và bạn cần theo dõi thích hợp cho việc đó. Nếu đó là mặc dù, bạn chỉ có thể sao lưu cơ sở dữ liệu sao chép.


Chỉ cần đề cập đến HyperBak, tôi đã không nhận được lợi ích nào đối với VLDB khi tôi thử nghiệm nó vào cuối năm 2011. Tôi đã nói chuyện với RedGate và họ đã đề cập đến nó là một lỗi, vì vậy hy vọng bây giờ nó đã được giải quyết. Tôi không nghĩ 300GB sẽ được coi là VLDB dù sao nhưng hãy coi chừng nếu nó không hoạt động như mong đợi.
Ali Razeghi

-1

Bạn có thể sử dụng các tham số sau:

BLOCKSIZE - Chọn Kích thước 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536. (tính bằng KB)

BUFFERCOUNT - Chỉ định tổng số bộ đệm I / O sẽ được sử dụng cho hoạt động sao lưu. Bạn có thể chỉ định bất kỳ số nguyên dương; tuy nhiên, số lượng lớn bộ đệm có thể gây ra lỗi "hết bộ nhớ" do không đủ địa chỉ ảo trong quy trình Sqlservr.exe. - từ MSDN

MAXTRNASFERSIZE - Đó là từ 65536 byte (64 KB) đến 4194304 byte (4 MB)


-3

Thử nó. nó đã giải quyết vấn đề hết thời gian chờ trong khi db kích thước lớn.

Private Sub Command1_Click()
On Error Resume Next
Dim con As New Connection
Dim tm As String
con.CommandTimeout = 500'''Command timeout should be 500


 With con
    .ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=dbiBMS;Data Source=192.168.103.4"
    .Open
 End With
 tm = CStr(Time)

con.Execute " backup database dbiBMS to disk='E:\Database_Backup\Test1.bak' with format "

con.Close
MsgBox tm
Exit Sub
x:
MsgBox Err.Description

End Sub

3
Tôi không nghĩ cài đặt thời gian chờ là 500ms sẽ khắc phục vấn đề hết thời gian chờ.
vijayp
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.