Sao lưu nhiều cơ sở dữ liệu đến cùng một thời điểm


10

Thông thường khi chúng tôi bắt đầu sao lưu, chúng tôi không cho phép thay đổi cam kết hoặc cơ sở dữ liệu sẽ không thể truy cập được. Ý tôi là cơ sở dữ liệu sẽ ở chế độ người dùng đơn nhưng tôi muốn bắt đầu sao lưu và giải phóng db để sử dụng. Ngoài ra, một khi tôi bắt đầu sao lưu, tôi không muốn các thay đổi đang diễn ra được ghi vào tệp sao lưu. Tôi muốn biết làm thế nào tôi có thể đạt được điều này trong Microsoft SQL Server 2012. Xin vui lòng hỗ trợ tôi.

Vâng, hãy để tôi giải thích vấn đề của tôi đầu tiên. Hiện tại tôi đang thiết lập cơ sở dữ liệu ở chế độ người dùng cho đến khi sao lưu hoàn tất. Chế độ này sẽ phục vụ mục đích của tôi là tránh thay đổi dữ liệu khi tiến hành sao lưu. Nhưng ứng dụng của tôi được gắn với nhiều cơ sở dữ liệu (mỗi cơ sở dữ liệu được liên kết với nhau và có var dbs tiếp tục tạo trên cơ sở hàng tháng). Vì vậy, sao lưu tất cả các cơ sở dữ liệu này đã trở thành quá trình tẻ nhạt và quan trọng hơn là tôi phải ngăn người dùng ra khỏi hệ thống khi quá trình sao lưu đang diễn ra.

Vì vậy, tôi đang tìm kiếm cơ chế sao lưu sẽ đáp ứng các yêu cầu được đề cập dưới đây.

  1. Bắt đầu sao lưu tất cả các dbs tại một thời điểm và giải phóng db để sử dụng.
  2. Vì các cơ sở dữ liệu được liên kết với nhau nên tôi muốn duy trì tính nhất quán dữ liệu trong các tệp sao lưu. Vì vậy, do yêu cầu về tính nhất quán của dữ liệu này, tôi không muốn thay đổi để được cam kết với tệp sao lưu của mình.

Tất cả tôi muốn là - sao lưu tất cả các dbs tại một thời điểm nhất định.


2
Bạn không phải đặt cơ sở dữ liệu của mình ở chế độ một người dùng khi bạn sao lưu. SQL Server sẽ không bao giờ bao gồm các giao dịch không được cam kết trong bản sao lưu của bạn. Để có câu trả lời đầy đủ hơn, vui lòng chỉnh sửa bài đăng của bạn để bao gồm chi tiết về mô hình khôi phục của bạn, cho dù bạn có nghĩa là sao lưu nhật ký giao dịch, sao lưu đầy đủ hoặc gia tăng, cũng như vấn đề bạn đang gặp phải. Vì nó đứng câu hỏi của bạn là một chút không rõ ràng.
Daniel Hutmacher

1
Bạn muốn đạt được điều gì bởi bản sao lưu này? Khả năng phục hồi hoàn toàn đến thời điểm này - hay cái gì khác? Nói cách khác ... Nếu bạn phải khôi phục từ bản sao lưu này, cần khôi phục lại --- có thay đổi DDL nào không? Thay đổi dữ liệu, hoặc những gì?
Seventyeightist 20/03/2016

Những gì bạn muốn là không thể có trong SQL 2012. Quay trở lại SQL 7.0, bộ sao lưu cơ sở dữ liệu đã được sử dụng để tạo lại cơ sở dữ liệu như tại thời điểm câu lệnh BACKUP bắt đầu. Bắt đầu từ SQL 2000 trở đi, một bộ sao lưu cơ sở dữ liệu được sử dụng để tạo lại cơ sở dữ liệu như lúc nó hoàn thành câu lệnh BACKUP.
stacylaray

@DanielHutmacher Tôi đang tìm kiếm bản sao lưu đầy đủ.
Praveen

Câu trả lời:


13

Tôi giả định rằng nhiệm vụ của bạn là tạo ra một tập hợp các bản sao lưu, nơi bạn có thể khôi phục tất cả chúng thành một điểm tĩnh (không có giao dịch mở) (tất cả đồng bộ hóa). Tương tự như những gì một điểm quiesce sẽ làm cho bạn trong DB2. Thật không may, không có gì trong SQL Server thực hiện chính xác điều đó. Tuy nhiên, giả sử cơ sở dữ liệu của bạn ở chế độ phục hồi ĐẦY ĐỦ, bạn có thể làm điều gì đó tương tự.

Bạn có thể tạo một giao dịch duy nhất MARKEDtrên tất cả các cơ sở dữ liệu cùng một lúc . Sau đó, bạn có một bản sao lưu nhật ký giao dịch của từng cơ sở dữ liệu. Giả sử bạn đang theo kịp các bản sao lưu nhật ký của mình (dù sao bạn cũng nên) sao lưu nhật ký sẽ không mất nhiều thời gian. Và không cần phải ngăn chặn bất kỳ ai tham gia vào hệ thống (ngoại trừ có thể đủ lâu để bạn tạo giao dịch được đánh dấu của mình).

Tại thời điểm này nếu bạn cần thực hiện khôi phục thì bạn thực hiện RESTORE STOPBEFOREMARKtrên mỗi cơ sở dữ liệu của mình. Điều này sẽ khôi phục tất cả các cơ sở dữ liệu về cùng một điểm (dựa trên giao dịch của bạn). Lưu ý: Ngoài ra còn có NHÂN VIÊN nếu bạn muốn bao gồm giao dịch đó.

Nếu bạn muốn có một ví dụ tôi đã có một trong liên kết ở trên cùng với khá nhiều đọc thêm.

Tôi nhận ra điều này không trả lời chính xác câu hỏi của bạn nhưng hy vọng nó sẽ giải quyết vấn đề của bạn.


2
Đây là cách BizTalk quản lý sao lưu tại thời điểm của nhiều cơ sở dữ liệu. Nếu nó hoạt động cho Microsoft BizTalk, thì đó là một tính năng được kiểm tra tốt.
Max Vernon

Chúng tôi sử dụng nó cho cơ sở dữ liệu TFS trong logshipping, chúng tôi đã thay đổi thành alwaysOn.
Kin Shah

1
Một chi tiết (ngụ ý nhưng chưa được trả tiền) để đưa câu trả lời của Ken về nhà: Bạn không thể có một bản sao lưu ĐẦY ĐỦ nhất quán trên nhiều DB. Gần nhất bạn có thể đến là thực hiện một vòng sao lưu đầy đủ, ngay lập tức theo sau là một giao dịch được đánh dấu, sau đó là một vòng sao lưu nhật ký. Vòng sao lưu nhật ký đầu tiên đó sẽ "xác thực" tính nhất quán đến thời điểm đó.
AMtwo

@AMtwo về mặt kỹ thuật bạn có thể bằng cách sử dụng phương pháp OP. Khóa tất cả mọi người ra khỏi hệ thống, đảm bảo không có kết nối hoạt động (có thể đánh dấu cơ sở dữ liệu là chỉ đọc / hạn chế), sau đó lấy bản sao lưu đầy đủ của mọi cơ sở dữ liệu. Tuy nhiên, như OP tuyên bố đây không phải là phương pháp tốt nhất trên thế giới.
Kenneth Fisher

7

Câu hỏi của bạn giống với câu hỏi mà tôi đã trả lời - Sao lưu và khôi phục 10-20 cơ sở dữ liệu SQL Server về trạng thái ~ đồng bộ?

Giả sử mô hình khôi phục cơ sở dữ liệu của bạn là ĐẦY ĐỦ, bạn nên sao lưu toàn bộ và sau đó sử dụng Giao dịch được đánh dấu .

Hãy làm sáng tỏ huyền thoại của bạn ...

Bắt đầu sao lưu tất cả các dbs tại một thời điểm và giải phóng db để sử dụng.

Từ các huyền thoại sao lưu (Rất khuyên bạn nên đọc tất cả các Huyền thoại sao lưu) :

Hoạt động sao lưu không mất khóa trên các đối tượng người dùng. Sao lưu gây ra tải đọc thực sự nặng trên hệ thống con I / O nên có thể có vẻ như khối lượng công việc đang bị chặn, nhưng thực sự không phải vậy. Nó chỉ bị chậm lại. Có một trường hợp đặc biệt trong đó một bản sao lưu phải nhận các khu vực được ghi nhật ký hàng loạt sẽ bị khóa tệp có thể chặn hoạt động của điểm kiểm tra - nhưng DML không bao giờ bị chặn.

Vì các cơ sở dữ liệu được liên kết với nhau nên tôi muốn duy trì tính nhất quán dữ liệu trong các tệp sao lưu. Vì vậy, do yêu cầu về tính nhất quán của dữ liệu này, tôi không muốn thay đổi để được cam kết với tệp sao lưu của mình.

Giao dịch được đánh dấu sẽ giúp bạn thực hiện sao lưu LOG ​​nhất quán và bạn sẽ có thể khôi phục chúng bằng cách sử dụng RESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

Hãy nhớ rằng các giao dịch được đánh dấu cho tất cả các cơ sở dữ liệu trên ví dụ cũng được ghi lại trong dbo.logmarkhistorybảng trong MSDBcơ sở dữ liệu.


-1
--]---- Begin Code ----[
--–declaring variables
DECLARE @dbname VARCHAR(100) -- database name
DECLARE @bupath VARCHAR(100) -- path for backup location
DECLARE @filename VARCHAR(100) -- filename used for backup files
DECLARE @datestamp VARCHAR(25) -- date used for backup file timestamp
-- specify database backup directory
SET @bupath = 'D:\DB Bkp\'
-- file date formatting
SELECT @datestamp = CONVERT(VARCHAR(20),GETDATE(),112) + REPLACE
(CONVERT(VARCHAR(20),GETDATE(),108),':','')
--specify databases to backup
DECLARE db_cursor CURSOR for
SELECT name
FROM master.dbo.sysdatabases
WHERE name not IN ('tempdb') -- excludes these databases, if excluding multiple databases, seprate them by a comma
--backup process
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
   SET @filename = @bupath + @dbname + '_' + @datestamp + '.bak'
   BACKUP DATABASE @dbname TO DISK = @filename WITH INIT,
   CHECKSUM; --init overwrites existing files with the same name, and checksum verifies the backup
       FETCH NEXT from db_cursor INTO @dbname
END
CLOSE db_cursor
DEALLOCATE db_cursor

để biết thêm chi tiết: https://bloss.technet.microsoft.com/letsdothis/2013/11/06/backup-multipl-sql-database-in-a-single-swoop/


Điều này không đảm bảo cùng một điểm sao lưu thời gian. Nó chỉ là một chuỗi các bản sao lưu liên tiếp.
vonPryz
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.