Đọc tham khảo / Hỏi và tương tự
Bạn có thể muốn kiểm tra câu trả lời của tôi mà tôi đã đăng để trả lời cho câu hỏi: Sao lưu VSS có phá vỡ logchain không? (dba.stackexchange.com)
Giải thích trong câu trả lời của tôi cũng liên kết đến câu hỏi Làm cách nào tôi có thể sao lưu cơ sở dữ liệu SQL Server bằng Windows Server Backup? (serverfault.com) cũng được trả lời bởi chính tôi.
Chuỗi nhật ký giao dịch
Khi sao lưu Nhật ký giao dịch (TLOG) được thực hiện, thông tin sao lưu được lưu trữ trong cơ sở dữ liệu msdb trong các bảng khác nhau. Các thông tin được lưu trữ sẽ chứa các thông tin như backup_type
, logical_device_name
, physical_device_name
, is_copy_only
, is_snapshot
, và nhiều ..._lsn
cột (LSN = số thứ tự đăng nhập).
Bạn có thể truy xuất thông tin chuỗi sao lưu nhật ký giao dịch từ phiên bản SQL Server của mình thông qua cơ sở dữ liệu msdb với tập lệnh sau:
/* ==================================================================
Author......: hot2use
Date........: 25.04.2018
Version.....: 0.1
Server......: localhost (first created for)
Database....: msdb
Owner.......: -
Table.......: various
Type........: Script
Name........: ADMIN_Retrieve_Backup_History_Information.sql
Description.: Retrieve backup history information from msdb database
............
............
............
History.....: 0.1 h2u First created
............
............
================================================================== */
SELECT /* Columns for retrieving information */
-- CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS SRVNAME,
msdb.dbo.backupset.database_name,
msdb.dbo.backupset.backup_start_date,
msdb.dbo.backupset.backup_finish_date,
-- msdb.dbo.backupset.expiration_date,
CASE msdb.dbo.backupset.type
WHEN 'D' THEN 'Full'
WHEN 'I' THEN 'Diff'
WHEN 'L' THEN 'Log'
END AS backup_type,
-- msdb.dbo.backupset.backup_size / 1024 / 1024 as [backup_size MB],
msdb.dbo.backupmediafamily.logical_device_name,
msdb.dbo.backupmediafamily.physical_device_name,
-- msdb.dbo.backupset.name AS backupset_name,
-- msdb.dbo.backupset.description,
msdb.dbo.backupset.is_copy_only,
msdb.dbo.backupset.is_snapshot,
msdb.dbo.backupset.checkpoint_lsn,
msdb.dbo.backupset.database_backup_lsn,
msdb.dbo.backupset.differential_base_lsn,
msdb.dbo.backupset.first_lsn,
msdb.dbo.backupset.fork_point_lsn,
msdb.dbo.backupset.last_lsn
FROM msdb.dbo.backupmediafamily
INNER JOIN msdb.dbo.backupset
ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id
/* ----------------------------------------------------------------------------
Generic WHERE statement to simplify selection of more WHEREs
-------------------------------------------------------------------------------*/
WHERE 1 = 1
/* ----------------------------------------------------------------------------
WHERE statement to find Device Backups with '{' and date n days back
------------------------------------------------------------------------------- */
-- AND physical_device_name LIKE '{%'
/* -------------------------------------------------------------------------------
WHERE statement to find Backups saved in standard directories, msdb.dbo.backupfile AS b
---------------------------------------------------------------------------------- */
-- AND physical_device_name LIKE '[fF]:%' -- STANDARD F: Backup Directory
-- AND physical_device_name NOT LIKE '[nN]:%' -- STANDARD N: Backup Directory
-- AND physical_device_name NOT LIKE '{%' -- Outstanding Analysis
-- AND physical_device_name NOT LIKE '%$\Sharepoint$\%' ESCAPE '$' -- Sharepoint Backs up to Share
-- AND backupset_name NOT LIKE '%Galaxy%' -- CommVault Sympana Backup
/* -------------------------------------------------------------------------------
WHERE Statement to find backup information for a certain period of time, msdb.dbo.backupset AS b
----------------------------------------------------------------------------------
AND (CONVERT(datetime, msdb.dbo.backupset.backup_start_date, 102) >= GETDATE() - 7) -- 7 days old or younger
AND (CONVERT(datetime, msdb.dbo.backupset.backup_start_date, 102) <= GETDATE()) -- n days old or older
*/
/* -------------------------------------------------------------------------------
WHERE Statement to find backup information for (a) given database(s)
---------------------------------------------------------------------------------- */
AND database_name IN ('AdventureWorks2012') -- database names
-- AND database_name IN ('rtc') -- database names
/* -------------------------------------------------------------------------------
ORDER Clause for other statements
---------------------------------------------------------------------------------- */
--ORDER BY msdb.dbo.backupset.database_name, msdb.dbo.backupset.backup_finish_date -- order clause
---WHERE msdb..backupset.type = 'I' OR msdb..backupset.type = 'D'
ORDER BY
--2,
2 DESC,
3 DESC
Thận trọng: Mệnh đề where hiện đang chọn cơ sở dữ liệu AdventureWorks2012
Chuỗi nhật ký giao dịch bị hỏng
Chuỗi nhật ký (giao dịch) không bao giờ bị phá vỡ trừ khi một trong các điều kiện sau được đáp ứng:
- một tập tin sao lưu Nhật ký giao dịch đã bị xóa
- Không thể truy cập tệp sao lưu Nhật ký giao dịch (ở đâu đó trong thiết bị sao lưu; giải pháp sao lưu của bên thứ 3)
- cơ sở dữ liệu trong mô hình khôi phục SIMPLE
- một bản sao lưu Nhật ký giao dịch đã được thực hiện với tùy chọn
TRUNCATE_ONLY
- một bản sao lưu cơ sở dữ liệu FULL được thực hiện mà không có
COPY_ONLY
tùy chọn và sau đó bị xóa khỏi đĩa vì các nhà phát triển chỉ cần sao lưu nhanh để phân tích tình huống trong cơ sở dữ liệu vàFULL
bản sao lưu của bạn trước khi bị xóa bởi (a) thủ tục sao lưu.
Hoàn cảnh của bạn
Trong ảnh chụp màn hình, bạn cung cấp cho bạn một FULL
bản sao lưu cơ sở dữ liệu is_copy_only
và ngay sau khi FULL
sao lưu không có is_copy_only
. Bây giờ những gì bạn không biết:
Là thứ hai FULL
, không is_copy_only
sao lưu một ảnh chụp nhanh hay không?
Nếu bạn sử dụng tập lệnh của tôi ở trên và thay đổi WHERE
mệnh đề để khớp với tên cơ sở dữ liệu của bạn, bạn có thể phát hiện ra rằng FULL
bản sao lưu đó không phải is_copy_only
là một is_snapshot
.
Và điều đó có thể mở ra một câu hỏi mới:
Sẽ FULL
, is_snapshot
cơ sở dữ liệu sao lưu cơ sở dữ liệu của tôi phá vỡ các chuỗi sao lưu đăng nhập?
Nhưng...
.... cho dù điều này diễn ra như thế nào, miễn là bạn có một chuỗi các bản sao lưu FULL
và TLOG
sao lưu mà bạn có thể truy cập, bạn vẫn có thể khôi phục cơ sở dữ liệu của mình đến bất kỳ thời điểm nào, ngay cả khi bạn có một FULL
bản sao lưu khác ở giữa.
Bạn có thể xác minh điều này với đầu ra của tập lệnh của tôi cho cơ sở dữ liệu của bạn, bằng cách xem first_lsn
và last_lsn
số. Họ nên kết hợp, ngay cả khi bỏ qua một FULL
bản sao lưu.
Tốt hơn là an toàn hơn xin lỗi
Tôi có một AdminDB2
cơ sở dữ liệu về một trong những trường hợp của tôi. Tôi đã tạo TLOG
bản sao lưu, sửa đổi dữ liệu, thực hiện FULL
sao lưu, sửa đổi dữ liệu, thực hiện TLOG
sao lưu, ....
Hãy xem lịch sử sao lưu của tôi AdminDB2
:
dbname backup_start_date backup_finish_date type Log physical_device_name C S checkpoint_lsn dbase_backup_lsn dlsn first_lsn flsn last_lsn
AdminDB2 2018-04-25 17:29:08.000 2018-04-25 17:29:08.000 TLOG NULL C:\SQL\Backup\AdminDB2\TLOG\AdminDB2_TLOG_20180425_172908.trn 0 0 36000002022400042 36000002022400042 NULL 36000002021900001 NULL 36000002025100001
AdminDB2 2018-04-25 17:28:48.000 2018-04-25 17:28:48.000 Full NULL C:\SQL\Backup\AdminDB2\FULL\AdminDB2_FULL_20180425_172848.bak 0 0 36000002022400042 36000002018900037 NULL 36000002022400042 NULL 36000002024200001
AdminDB2 2018-04-25 17:28:23.000 2018-04-25 17:28:23.000 TLOG NULL C:\SQL\Backup\AdminDB2\TLOG\AdminDB2_TLOG_20180425_172823.trn 0 0 36000002018900037 36000002018900037 NULL 36000002021500001 NULL 36000002021900001
AdminDB2 2018-04-25 17:28:07.000 2018-04-25 17:28:07.000 TLOG NULL C:\SQL\Backup\AdminDB2\TLOG\AdminDB2_TLOG_20180425_172807.trn 0 0 36000002018900037 36000002018900037 NULL 36000002018400001 NULL 36000002021500001
AdminDB2 2018-04-25 17:27:32.000 2018-04-25 17:27:32.000 Full NULL C:\SQL\Backup\AdminDB2\FULL\AdminDB2_FULL_20180425_172732.bak 0 0 36000002018900037 36000001990800037 NULL 36000002018900037 NULL 36000002020600001
AdminDB2 2018-04-25 17:15:00.000 2018-04-25 17:15:00.000 TLOG NULL C:\SQL\Backup\AdminDB2\TLOG\AdminDB2_TLOG_20180425_171500.trn 0 0 36000002016000003 36000001990800037 NULL 36000002018100001 NULL 36000002018400001
Thứ tự là ngày giảm dần
Bạn có thể thấy TLOG
bản sao lưu cuối cùng ở trên cùng, bản sao lưu trước FULL
(ở giữa) tại 2018-04-25 17:28:48.000
, TLOG
bản sao lưu trước đó 2018-04-25 17:28:23.000
, v.v.
Để khôi phục AdminDB2
cơ sở dữ liệu về thời điểm hiện tại, tôi sẽ phải sử dụng FULL
bản sao lưu đầu tiên từ 2018-04-25 17:27:32.000
(vì tôi đã xóa FULL
bản sao lưu giữa ) cùng với tất cả các TLOG
bản sao lưu.
Hãy thử xem.
- Xóa
FULL
tệp sao lưu AdminDB2_FULL_20180425_172848.bak
trên đĩa của tôi (hoặc đổi tên nó), chỉ vì nó là cái ở giữa.
- Mở GUI Khôi phục trong SSMS và thêm ..
- các
FULL
sao lưuAdminDB2_FULL_20180425_172732.bak
- tất cả các
TLOG
tập tin sao lưu
- Quản trị viênDB2_TLOG_20180425_172807.trn
- Quản trịDB2_TLOG_20180425_172823.trn
- Quản trịDB2_TLOG_20180425_172908.trn
- Hãy chắc chắn rằng tôi đặt tùy chọn
Overwrite the existing database (WITH REPLACE)
- Thực hiện khôi phục (hoặc tập lệnh ra câu lệnh vào cửa sổ truy vấn)
Kịch bản
USE [master]
RESTORE DATABASE [AdminDB2] FROM DISK = N'C:\SQL\BACKUP\AdminDB2\FULL\AdminDB2_FULL_20180425_172732.bak' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5, REPLACE
RESTORE LOG [AdminDB2] FROM DISK = N'C:\SQL\BACKUP\AdminDB2\LOG\AdminDB2_LOG_20180425_172807.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5
RESTORE LOG [AdminDB2] FROM DISK = N'C:\SQL\BACKUP\AdminDB2\LOG\AdminDB2_LOG_20180425_172823.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 5
RESTORE LOG [AdminDB2] FROM DISK = N'C:\SQL\BACKUP\AdminDB2\LOG\AdminDB2_LOG_20180425_172908.trn' WITH FILE = 1, NOUNLOAD, STATS = 5
GO
Đầu ra
15 percent processed.
30 percent processed.
45 percent processed.
60 percent processed.
75 percent processed.
90 percent processed.
100 percent processed.
Processed 848 pages for database 'AdminDB2', file 'AdminDB' on file 1.
Processed 2 pages for database 'AdminDB2', file 'AdminDB_log' on file 1.
RESTORE DATABASE successfully processed 850 pages in 0.134 seconds (49.502 MB/sec).
100 percent processed.
Processed 0 pages for database 'AdminDB2', file 'AdminDB' on file 1.
Processed 2 pages for database 'AdminDB2', file 'AdminDB_log' on file 1.
RESTORE LOG successfully processed 2 pages in 0.005 seconds (3.027 MB/sec).
100 percent processed.
Processed 0 pages for database 'AdminDB2', file 'AdminDB' on file 1.
Processed 1 pages for database 'AdminDB2', file 'AdminDB_log' on file 1.
RESTORE LOG successfully processed 1 pages in 0.005 seconds (0.390 MB/sec).
100 percent processed.
Processed 0 pages for database 'AdminDB2', file 'AdminDB' on file 1.
Processed 2 pages for database 'AdminDB2', file 'AdminDB_log' on file 1.
RESTORE LOG successfully processed 2 pages in 0.005 seconds (3.125 MB/sec).
... Và cơ sở dữ liệu đã trở lại TRỰC TUYẾN.
Tóm lược
Chuỗi sao lưu chỉ bị hỏng khi bạn mất các bản sao lưu TLOG ở giữa, ngoài việc bạn có thể khôi phục cơ sở dữ liệu từ FULL
bản sao lưu từ lâu và chỉ cần thêm tất cả các TLOG
bản sao lưu.
Tuy nhiên...
... nó là nhanh hơn để có một gần đây hơn FULL
, DIFF
và TLOG
sao lưu thuận tiện.
Thông tin bổ sung để phản hồi nhận xét: Sao lưu Nhật ký giao dịch được thực hiện với tùy chọn TRUNCATE_ONLY - khi điều này xảy ra, có cách nào để biết điều này bằng truy vấn T-SQL
Sao lưu Nhật ký giao dịch với Truncate_only
Trong các phiên bản trước của SQL Server trước SQL Server 2008, bạn có thể sử dụng câu lệnh sau:
BACKUP LOG [AdminDB2] WITH TRUNCATE_ONLY
Điều này đã không được chấp nhận và không còn được hỗ trợ. Bạn sẽ nhận được một thông báo lỗi như sau:
Msg 155, Level 15, State 1, Line 10
'TRUNCATE_ONLY' is not a recognized BACKUP option.
Phương pháp mới là sao lưu vào đĩa NUL
và được thực hiện bằng lệnh sau:
BACKUP LOG [AdminDB2] TO DISK='NUL'
Điều này sẽ trả về các thông tin sau:
Processed 1 pages for database 'AdminDB2', file 'AdminDB_log' on file 1.
BACKUP LOG successfully processed 1 pages in 0.001 seconds (1.464 MB/sec).
Tư vấn
Đỗ KHÔNG sử dụng trong sản xuất. Bạn sẽ mất khả năng khôi phục về thời điểm trong quá trình sao lưu TLOG đó.
Tham khảo: BACKUP (Transact-SQL) (Microsoft Docs)
Lịch sử sao lưu của bạn sẽ hiển thị điều này như sau:
dbname backup_start_date backup_finish_date type ldev pdev C S checkpoint_lsn dbase_backup_lsn dlsn first_lsn flsn last_lsn
AdminDB2 2018-04-26 09:35:05.000 2018-04-26 09:35:05.000 Log NULL NUL 0 0 36000002030100002 36000002022400042 NULL 36000002033400001 NULL 36000002033700001
Thông tin cho cả logical_device_name
( ldev
) và physical_device_name
( pdev
) sẽ chứa giá trị NULL
. Đây là một dấu hiệu cho thấy a BACKUP LOG ...
đã được thực hiện với TRUNCATE_ONLY
(new TO DISK='NUL'
:). Bạn sẽ mất khả năng khôi phục qua điểm này bằng cách sử dụng các bản sao lưu Nhật ký giao dịch.
Thông tin bổ sung để phản hồi nhận xét: Có - đây là is_snapshot = 1 [backup]
is_snapshot
Vui lòng đọc phần is_snapshot trong câu trả lời của tôi cho câu hỏi Sử dụng sao lưu VSS của bên thứ ba cộng với sao lưu SQL gốc
Từ câu trả lời ban đầu của tôi:
Nếu lịch sử sao lưu cơ sở dữ liệu có cờ is_snapshot
được đặt thành 1
thì bạn biết rằng sao lưu này được thực hiện bằng phần mềm của bên thứ 3 đã kích hoạt SQL Server Writer (Dịch vụ VSS cho SQL Server) cho phép phần mềm bên thứ 3 sao lưu cơ sở dữ liệu gần như ngay lập tức .
Từ tài liệu chính thức về Sao lưu ảnh chụp là gì:
Sao lưu ảnh chụp nhanh SQL Server được thực hiện với sự hợp tác của các nhà cung cấp phần cứng hoặc phần mềm bên thứ ba hoặc cả hai. Các nhà cung cấp này sử dụng các tính năng của SQL Server được thiết kế cho mục đích này. Công nghệ sao lưu cơ bản tạo ra một bản sao tức thời của dữ liệu đang được sao lưu. Việc sao chép tức thời thường được thực hiện bằng cách chia một bộ đĩa được nhân đôi hoặc bằng cách tạo một bản sao của khối đĩa khi nó được ghi. Điều này bảo tồn bản gốc. Tại thời điểm khôi phục, bản gốc được cung cấp ngay lập tức và đồng bộ hóa các đĩa bên dưới xảy ra trong nền. Điều này dẫn đến các hoạt động khôi phục gần như ngay lập tức.
Tham khảo: Sao lưu ảnh chụp nhanh (Microsoft Technet)
Một bản sao lưu được tạo bằng tính năng này cũng có thể được khôi phục gần như ngay lập tức.
Tóm lược
Các bản sao lưu của bên thứ 3 nên được đánh dấu là is_snapshot = 1
và is_copy_only = 1
. Những bản sao lưu sẽ không xung đột với các bước sao lưu bổ sung / thủ tục thực hiện sử dụng có nguồn gốc SQL Server BACKUP DATABASE...
, BACKUP DATABASE ... WITH DIFFERENTIAL....
và BACKUP LOG...
báo cáo. Các bản sao lưu cơ sở dữ liệu của bên thứ 3 không phải là một phần của bộ sao lưu hiện có.
Tôi hy vọng thông tin này là đủ.